静态代码块,非静态代码块,构造函数的分析
来源:互联网 发布:淘宝寿衣 编辑:程序博客网 时间:2024/05/28 06:07
先看两个例子:
例1:
public class test {public static int a;static{a = 1;System.out.println("静态代码块中:a = "+a);}{a = 2;System.out.println("非静态代码块中:a = "+a);}public test(){this("有参构造函数中:a="+test.a);//a = 3;System.out.println("在无参构造函数中:a = "+test.a);}public test(String s){//a = 4;/*System.out.println(s+a);*/System.out.println(s);}public static void main(String []args) {test t = null;System.out.println("!!!!!!");t = new test();System.out.println("main函数中:a = "+test.a);}}执行的结果是:
静态代码块中:a = 1
!!!!!!
非静态代码块中:a = 2
有参构造函数中:a=1
在无参构造函数中:a = 2
main函数中:a = 2
例1的结论:
静态代码块是在类加载时自动执行的,非静态代码块是在创建对象时自动执行的代码,不创建对象不执行该类的非静态代码块。且执行 顺序为静态代码块------非静态代码块----构造函数。
例2:
parent.java
public class parent{public static int p;static{p = 1;System.out.println("父类静态代码块中:p = "+p);}{p = 2;System.out.println("父类非静态代码块中:p = "+p);}public parent(){//a = 3;System.out.println("父类在无参构造函数中:p = "+p);}public parent(String s){//a = 4;/*System.out.println(s+a);*/System.out.println("父类在有参构造函数中:p = "+p);}}
test.java
public class test extends parent{public static int a;static{a = 1;System.out.println("静态代码块中:a = "+a);}{a = 2;System.out.println("非静态代码块中:a = "+a);}public test(){//a = 3;System.out.println("在无参构造函数中:a = "+test.a);}public test(String s){//a = 4;/*System.out.println(s+a);*/System.out.println("在有参构造函数中:a = "+test.a);}public static void float2int(){int a = (int)3.2;int b = (int)3.9;System.out.println("a = "+a+" b = "+b);}public static void main(String []args) {System.out.println("hello");test t = new test();test t2 = new test("hello");}}
父类静态代码块中:p = 1
静态代码块中:a = 1
hello
父类非静态代码块中:p = 2
父类在无参构造函数中:p = 2
非静态代码块中:a = 2
在无参构造函数中:a = 2
父类非静态代码块中:p = 2
父类在无参构造函数中:p = 2
非静态代码块中:a = 2
在有参构造函数中:a = 2
例2的结论:
对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容(实例化对象前),实例化对象时,看父类有没有非静态代码块,如果有就执行父类的非静
态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执
行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方
法,否则编译不能通过。
- 静态代码块,非静态代码块,构造函数的分析
- 静态代码块,非静态代码块,构造函数
- 静态代码块、非静态代码块、构造函数的执行顺序
- 静态代码块&非静态代码块&构造函数的执行顺序
- 举例说明java中静态代码块、非静态代码块、构造函数的执行顺序
- Java中静态代码块、非静态代码块和构造函数的执行顺序
- JAVA中父类与子类静态代码块、非静态代码块、构造函数的加载顺序
- Java中静态代码块、非静态代码块、构造函数的执行顺序与作用
- java中静态代码块,非静态代码块,构造函数之间的执行顺序
- 关于静态代码块,非静态代码块,构造函数的多态表现问题
- JAVA继承关系中静态代码块、非静态代码块,构造函数的执行顺序
- JAVA静态代码块、非静态代码块、构造函数的执行顺序
- Java中静态代码块、非静态代码块以及构造函数的初始化顺序
- JAVA代码块非静态代码块与静态代码块构造函数比较
- 静态代码块-非静态代码块-默认构造方法
- 几个问题(--------)父子类静态变量、静态代码块、非静态代码块、构造函数
- 静态代码块、代码块、构造函数的初始化顺序
- 静态代码块,代码块,构造函数的执行顺序
- JAMA:Java矩阵包-JAVA调用Matlab的替代品
- LBA(逻辑区块地址)及PBA(物理区块地址)简介
- 数据结构与算法
- float ,double类型在内存中存储方式
- Apache Maven 入门篇 ( 上 )
- 静态代码块,非静态代码块,构造函数的分析
- 怎样提高语言组织能力
- 跨平台 PhoneGap 框架的调研 和 性能测试
- hdu4686 矩阵快速幂 多校第九场
- Hello World驱动模块尝试<1>_在虚拟机Ubuntu上实现
- 坚持学英语20130821-->my homework
- ORACLE正则表达式
- 关于数组(指针)作为参数
- 待执行