静态的属性、方法等属于类而不是对象。
静态的方法可以由类直接调用,不需要将类实例化。
本篇主要说明: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");
}
}