小谈java中的静态块,非静态块
java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++中的static,都是最先初始化好的。
所以注意:
a在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。
b静态方法不能以任何方式引用this和super关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所引用的对象根本没有产生,
至于非静态块是存在每一个类中,除了带有static块以外,它最先执行,(在构造函数前)下面是一个例子。
publicclass text {
public int a;
{
System.out.println("非静态2");
}
static{
System.out.println("static");
}
text(){
System.out.println("text");
}
}
public class text1 extends text{
public int t;
public double w;
{
System.out.println("非静态块");
}
static {
System.out.println("static1");
}
public text1(){
System.out.println("text1");
}
public static void main(String args[]){
text1 te=new text1();
}
}
结果是:
static
static1
非静态2
text
非静态块
text1
非静态块比构造函数更早调用。
另外注意System.err.println()与System.out.println()的区别
例:
public
class
TestCodeSeg
{
static
{
System.out.println(
"1"
);
}
{
System.out.println(
"2"
);
}
public
TestCodeSeg()
{
System.err.println(
"3"
);
}
public
static
void
main(String[] args)
{
new
TestCodeSeg();
}
}
求输出结果:
1
2
3
3的位置不确定
解释:
1和2顺序是不变的,因为它们是静态(类装载时被执行),3是在构造函数里。所以,程序执行顺序是静态部分然后是构造函数。但是输出结果还要收到System.out和System.err的影响。System.out是行缓冲而System.err是不缓冲,所以System.err.println("3")是立即输出。但System.out.println("1")和System.out.println("2")则因为缓冲的原因可能稍晚(但1和2的顺序不变)。具体输出结果1先2后是绝对的,但3在哪里出现跟程序执行时情况有关。