静态的属性、方法等属于类而不是对象。
静态的方法能够由类直接调用,不须要将类实例化。
本篇主要说明:1、态的代码、成员变量要比构造方法先运行。
2、
子类的构造方法会默认去调用父类的不带參数的构造方法,假设父类不提供不带參数的构造方法,则子类的构造方法要显示使用super(param),去调用父类的带參数的构造方法
下面代码,能够将凝视掉的内容放开,或增改參数类型、參数定义的位置等,然后运行main看看打印结果,就会更加明确:静态的代码(块)、成员变量要比构造方法先运行。
/** * author Ding Chengyun * 2014-2-23 */ package test; /** * @author Ding Chengyun * 2014-2-23 */ public class StaticTest { private static StaticTest instance = new StaticTest(); public static int i; public static int j = 0; private StaticTest() { // System.out.println("static constract"); i++; j++; } // static { // System.out.println("static block"); // i = 2; // j = 3; // } public static StaticTest getInstance() { return instance; } public static void main(String[] args) { StaticTest st = StaticTest.getInstance(); System.out.println(st.i + "," + st.j); //问:输出结果是什么 //答:输出结果是1,0.由于java静态成员变量的载入顺序是从类的開始从上到下顺序载入的。 //从main方法開始,然后运行到第一行代码private static StaticTest instance = new StaticTest(); //此时须要调用构造方法,在构造方法中给两个变量分别++。对于int类型的变量,默认初始化值都为0,因此,构造方法运行完成。i,j的值都为1 //继续运行到第二行代码public static int i;由于构造方法已经赋值过了。此处不再赋值操作。i=1 //运行第三行代码public static int j = 0;此处显示的给j赋值为0。因此覆盖了构造方法中的赋值1。此时,j=0. //因此运行完成main方法,结果输出 1,0 //同理,假设将代码的书写顺序进行变化将public static int i; public static int j = 0;放到 //private static StaticTest instance = new StaticTest();之前。那么运行结果将会发生变化, //以此类推,结果输出将是1,1 //假设添加一段静态代码块,如上被凝视的代码,运行结果类推,应为2,3,由于静态代码最后运行的是静态代码块。 //可是假设将静态代码块放到最上面、两句变量定义之后等不同位置,运行结果都会发生变化。 //然则,基本原则是不变的:静态成员变量运行顺序是从类的開始从上往下运行。 } } /** * author Ding Chengyun * 2014-2-23 */ package test; /** * @author Ding Chengyun * 2014-2-23 */ public class OrderStaticTest { /** * @param args */ public static void main(String[] args) { new Childs();//问题:输出什么? // parent block // child block 2 // child block 1 // parent constract // child constract } } class Parents { static String name = "hello"; public Parents() { System.out.println("parent constract"); } static { System.out.println("parent block"); } } class Childs extends Parents{ static String childName = "world"; public Childs() { System.out.println("child constract"); } static { System.out.println("child block 2"); } static { System.out.println("child block 1"); } }
原文:http://www.cnblogs.com/hrhguanli/p/5095270.html