代码如下:
public class TestSquence {

/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub

String temp = TQExample2.s_a;
TQExample2 test = new TQExample2(); }}
class TQExample2 {

 public static String s_a = "静态变量:直接赋值";
 public String n_b = "非静态变量:直接赋值";  public final int nf_i;
 public final String nf_s = "我是final对象,直接赋值";
 static {
  System.out.println(s_a);   s_a = "静态变量:静态块赋值";
 }  public TQExample2() {
  System.out.println(s_a);
  System.out.println(n_b);
  
  //静态变量
  s_a = "静态变量:构造器赋值";
  //非静态变量
  n_b = "非静态变量:构造器赋值";
  //final变量
  nf_i = 1;//注释这行然后在外面打印它看看看看,会对java的自动赋值有一个更具体的感性认识.
  //nf_s = "我是final对象,构造器赋值";//这行是错误的,建议你试试.
  
  System.out.println(s_a);
  System.out.println(n_b);
  System.out.println(nf_s);
 }
}这样输出的结果是:静态变量:直接赋值
静态变量:静态块赋值
非静态变量:直接赋值
静态变量:构造器赋值
非静态变量:构造器赋值
我是final对象,直接赋值如果我把main()方法中的TQExample2 test = new TQExample2();注释掉,输出结果变成了:静态变量:直接赋值这我就不明白了,
没有System.out.println();怎么还会输出内容呢?
我知道是直接调用了TQExample2中的静态变量s_a,但是也没有输出啊?
各位大侠能给我解释一下String temp = TQExample2.s_a;这句代码和为什么输出那样的结果吗?class

解决方案 »

  1.   

    是不是这样执行的:
    static {
      System.out.println(s_a);  s_a = "静态变量:静态块赋值";
     }
    是静态代码块,当我运行 java application时,这个静态代码块就执行了,它是主动执行的。但这个输出结果与String temp = TQExample2.s_a;这段代码是有关系的,
    如果我把这段代码也去掉,控制台就不会打印出任何内容。所以我又迷糊了,求各位大神指导
      

  2.   

    楼主先学会如何贴代码,像这样:public static void main(String[] args) {
        System.out.println("Hello!");
    }
      

  3.   

    是不是我加上这句String temp = TQExample2.s_a;代码,在运行java application的时候
    JVM会自动的加载TQExample2 这个类,既然加载这个类就会执行静态代码块:
    static {
      System.out.println(s_a);  s_a = "静态变量:静态块赋值";
     }
    所以就会输出:静态变量:直接赋值如果没有这句String temp = TQExample2.s_a;代码,jvm就不会加载TQExample2 这个类,也就不会执行上面的代码块,便不会输出结果了。各位大神,我这样理解对吗?求指导
      

  4.   

    它执行了static里面的方法,你把static去掉他就没有输出了,至于为什么,我也不是很清楚
      

  5.   

    静态代码块是在这个类第一次生成的时候执行,如果项目中没有用到该类,静态代码块是不执行的。所以当String temp = TQExample2.s_a;这句话执行时就会执行静态代码块。如果注释掉就不会执行
      

  6.   

    楼主首先要明确几个概念:1,什么时候定义静态函数?当功能内部,没有访问到非晶体数据(对象的特有数据时),那么,该功能可以定义为静态,直接用类名调用该函数,因为实例化对象无意义。2,什么时候使用静态变量?当对象中出现共享数据时,该数据应该被静态修饰。3,final关键字的作用final对于类来说,该类不能被继承和复写
    对于函数来说,不能被复写
    对于变量来说,一旦被final修饰,该变量就成为了常量执行循序:a,静态代码块(给类初始化的) 最先执行
    b,属性执行(变量)
    c,构造代码块(给对象初始化)
    d,构造函数(给对应的对象初始化)
      

  7.   

    static{...}是Java中的静态代码块
    静态代码块中代码的执行与实例的创建无关,是在类加载的时候就执行的(在Main方法之前),而且是主动执行的(不需要调用)
    静态代码块一般用于类中变量的初始化
      

  8.   


    “String temp = TQExample2.s_a;这句话执行时就会执行静态代码块”是什么意思?
    我可不可以这样理解:
    String temp = TQExample2.s_a;这句话执行时,JVM就会加载类TQExample2,加载这个类的话,静态代码块自然就会主动的执行了。
    这样理解对吗?
      

  9.   


    类的初始化和jvm加载类是同一个概念吗?
      

  10.   

    java 就是靠jvm 执行操作的JVM->装载Class->初始化除final外的静态变量,静态块,静态方法,类变量->做好被实例化的所有准备,等待被调用
      

  11.   


    类的初始化是不是就是类的实例化,即new一个实例(创建对象),对吗?
      

  12.   

    我说错了吧 实例化 是要走构造方法的 相当于参考图纸 造一个房子。。而类名的使用就是看一眼图纸。。,(jvm里是class文件)