对于final类型的成员变量,一般来说有两种赋初值方式
1.在声明final类型的成员变量时就赋上初值
2.在声明final类型的成员变量时不赋初值,但在类的所有结构方法中都为其赋上初值
static代码块:静态代码块
package com.yuanzijain08; class P{ static { System.out.println("static block"); } public P(){ System.out.println("p constatictor"); } } public class StaticTest { public static void main(String[] args) { // TODO 自动生成的方法存根 P p = new P(); } }
执行结果
static block p constatictor
3.
package com.yuanzijain08; class P{ static { System.out.println("P static block"); } public P(){ System.out.println("p contructor"); } } class Q extends P{ static { System.out.println("Q static block"); } public Q(){ System.out.println("Q contructor"); } } class S extends Q{ static { System.out.println("S static block"); } public S(){ System.out.println("S contructor"); } } public class StaticTest { public static void main(String[] args) { // TODO 自动生成的方法存根 new S(); } }
执行结果
P static block Q static block S static block p contructor Q contructor S contructor
4.静态代码块。静态代码块的作用也是完成一些初始化工作,首先执行静态代码块,然后执行构造方法,静态代码块在类被在加载的时候执行,而构造方法是在生成对象时候执行,要想在调用某个类来生成对象,首先要将类加载到Java虚拟机上,然后jvm加载这个类来生成对象
package com.yuanzijain08; class P{ static { System.out.println("P static block"); } public P(){ System.out.println("p contructor"); } } class Q extends P{ static { System.out.println("Q static block"); } public Q(){ System.out.println("Q contructor"); } } class S extends Q{ static { System.out.println("S static block"); } public S(){ System.out.println("S contructor"); } } public class StaticTest { public static void main(String[] args) { // TODO 自动生成的方法存根 new S(); new S(); } }
执行结果
P static block Q static block S static block p contructor Q contructor S contructor p contructor Q contructor S contructor
5.类的静态代码块只会执行一次,是在类在被加载时候执行的,因为每个类只会被加载一次,所以静态代码块只会被执行依稀,而构造方法则不然,每次生成一个对象的时候都会调用的构造方法,所以new一次就会调用构造方法
6.如果继承体系中既有构造方法,又有静态代码块,那么首先去执行最顶层类的代码块,一直执行到最低成的静态代码块,,然后去执行最顶层类的构造方法,一直执行最底层的构造方法,注意:静态代码块只能被执行一次
7.不能再静态方法中访问非静态的成员变量,可以在静态方法中访问静态的成员变量,可以在非静态方法中访问静态的成员变量
总结:静态只能访问静态,非静态的可以访问一切方法
8.不能再静态方法中使用this关键字
原文地址:http://hnyuanzijian.blog.51cto.com/8869344/1774532