JAVA的初始化顺序
来源:互联网 发布:工厂仿真软件 编辑:程序博客网 时间:2024/05/23 02:01
package test;public class TestInit{public static void main(String[] args){new Dervied();}}class Base{static{System.out.println("Base static block");}{System.out.println("base block");}public Base(){// TODO Auto-generated constructor stubSystem.out.println("base constructor");}}class Dervied extends Base{static{System.out.println("de static block");}{System.out.println("de block");}public Dervied(){// TODO Auto-generated constructor stubSystem.out.println("de constructor");}}
//运行结果
Base static block
de static block
base block
base constructor
de block
de constructor
在JAVA的初始化中,顺序是(父类静态变量,父类静态代码块)-->(子类静态变量,之类静态代码块)-->(父类非静态变量,父类非静态代码块)-->父类构造器-->(子类非静态变量,子类非静态代码块)-->子类构造器
其中,静态代码块的执行顺和静态变量的执行顺序于他们在代码的排列顺序有关,谁在前面就先执行,例子如下
结果是
执行非静态的初始化代码块
cat constructor
Cat [name=kitty, age=2, weight=2.3]
把double变量和非静态代码块位置掉换之后是:
执行非静态的初始化代码块
cat constructor
Cat [name=kitty, age=2, weight=2.0]
在JAVA的初始化中,顺序是(父类静态变量,父类静态代码块)-->(子类静态变量,之类静态代码块)-->(父类非静态变量,父类非静态代码块)-->父类构造器-->(子类非静态变量,子类非静态代码块)-->子类构造器
其中,静态代码块的执行顺和静态变量的执行顺序于他们在代码的排列顺序有关,谁在前面就先执行,例子如下
package test;public class TestInitDemo{public static void main(String[] args){Cat cat = new Cat("kitty", 2);System.out.println(cat);}}class Cat{String name;int age;public Cat(String name, int age){System.out.println("cat constructor");this.name = name;this.age = age;}{System.out.println("执行非静态的初始化代码块");weight = 2.0;}double weight = 2.3;@Override public String toString() { return "Cat [name=" + name + ", age=" + age + ", weight=" + weight + "]"; }}
结果是
执行非静态的初始化代码块
cat constructor
Cat [name=kitty, age=2, weight=2.3]
把double变量和非静态代码块位置掉换之后是:
执行非静态的初始化代码块
cat constructor
Cat [name=kitty, age=2, weight=2.0]
原因:比如定义一个 int a = 1;他的执行顺序是,int a创建一个Java对象为该对象分配内存,a = 1,提取到JAVA类的构造器之前执行
静态变量和静态代码块为某一个静态变量初始化也是:看谁在代码的前面就是先执行。
package test;public class PriceTest{ public static void main(String[] args) { System. out.println(Prince. INISTANCE. currentPrice); Prince p = new Prince(2.8); System. out.println( p. currentPrice); }}class Prince{ final static Prince INISTANCE = new Prince(2.8); static double initPrice = 20; double currentPrice; public Prince( double discount) { // TODO Auto-generated constructor stub this. currentPrice = initPrice - discount; }}//结果是-2.817.2
原因:代码顺序当中,是先有Prince对象,再到initPrice,在初始化完成了INISTANCE再去初始化initPrice,而在初始化INISTANCE的时候,initPrice的值是0.0(默认值,不算是初始化),然后得到的currentPrice的值是就是-2.8了,然后第二个,这时候已经为initPrice初始化了,所以是17.2
1 0
- Java初始化的顺序
- JAVA的初始化顺序
- JAVA的初始化顺序
- java 的初始化顺序
- java的初始化顺序
- java的初始化顺序
- java初始化的顺序
- Java的初始化顺序
- JAVA的初始化顺序
- java的初始化顺序
- java的初始化顺序
- Java的初始化顺序
- java初始化的顺序
- java的初始化顺序
- Java的初始化顺序
- java中初始化的顺序
- java类的初始化顺序
- Java类的初始化顺序
- Universal_image_loader加载网络图片
- 变更svn密码或者用户名
- 在windows上部署使用Redis
- mondrian+Jpviot页面报错
- 如何只授予用户查看存储过程定义的权限
- JAVA的初始化顺序
- Java_多线程下的生产者与消费者实现
- Matlab矩阵的产生
- 处理不平衡数据的八大策略
- 【C#基础】反射
- java中继承父类后this和super的区别
- 36. BOM (2)
- python 的Dict
- android如何使用bks和apache服务器进行https通信