现在的位置: 首页 > 综合 > 正文

java 静态块

2013年02月14日 ⁄ 综合 ⁄ 共 1322字 ⁄ 字号 评论关闭

小谈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在哪里出现跟程序执行时情况有关。

抱歉!评论已关闭.