public class Test{ static int cnt = 6; static{ cnt += 9; } public static void main(String[] args){ System.out.println(“cnt =” + cnt); } static{ cnt /=3; }; }
静态初始化代码块,静态变量,先执行静态变量在执行静态代码块
Java的向前引用,加载的机制应该是先声明所有的变量,但是现在只是声明而已所以是cnt是int的默认值0,然后按照声明语句和静态块的先后顺序依次对cnt进行操作。
最终的顺序:父类的成员变量声明->按书写顺序执行父类静态成员变量和静态块->子类的成员变量声明->按书写顺序执行子类静态成员变量和静态块。
public class Test
{
private float f = 1.0f;
int m = 12;
static int n = 1;
public static void main (String args[])
{
Test t = new Test();
}
}
f虽然是Test类的私有成员属性,但因为main方法就在Test类内,可以通过“对象名、属性名”的方式调用,static 静态成员属性不能使用 this 关键字调用,m和f都是普通成员属性,而“类名、方式”只能调用静态成员属性。
public class Test { public int aMethod(){ static int i = 0; i++; return i; } public static void main(String args[]){ Test test = new Test(); test.aMethod(); int j = test.aMethod(); System.out.println(j); } }
在方法当中定义的变量是局部变量,而静态的变量属于类变量。随着类的加载而被创建,而局部变量是调用该方法的时候,才创建的。
所以,此时两种变量的性质是冲突的。Java当中不允许定义局部的静态变量。
public class Pvf{ static boolean Paddy; public static void main(String args[]){ System.out.println(Paddy); } }
在Java当中,成员变量没有赋初值的时候,会有默认的初始值。基本类型是对应的0值。如:int是0,boolean是false,char类型是'\u0000',引用类型是null,如String。
带代码中存在代码块和构造方法的时候。执行顺序为:
1.静态代码块
2.实例代码块
3.调用的对应的构造方法