Java- 构造方法的执行顺序
来源:互联网 发布:qq mac版 编辑:程序博客网 时间:2024/05/22 08:03
构造方法的执行过程
- 构造方法的执行过程遵循以下步骤:
- 调用本类或父类的构造方法,直至最高一层(Object)
- 按照声明顺序执行字段的初始化赋值
- 执行构造函数的各语句
- 简单的说:
- 先父类构造,再本类成员赋值,最后执行构造方法中的语句。
class ConstructSequence { public static void main(String[] args){ Person p = new Student("LiMing", 18, "PKU"); }}class Person{ String name="unnamed"; //step 2 int age=-1; Person( String name, int age ){ super(); //step 1 //step 3 System.out.println( "start to create the constructor Person(),and now this.name="+this.name+",this.age="+this.age ); this.name=name; this.age=age; System.out.println( "Person() constructed completely,and now this.name="+this.name+",this.age="+this.age ); }}class Student extends Person{ String school="unnamed"; //step2 Student( String name, int age, String school ){ super( name, age ); //step 1 //step 3 System.out.println( "start to create the constructor Student(),and now this.name="+this.name+",this.age="+this.age+",this.school="+this.school ); this.school = school; System.out.println( "Student() constructed completely,and now this.name="+this.name+",this.age="+this.age+",this.school="+this.school ); }}-----------OUTPUT----------- start to create the constructor Person(),and now this.name=unnamed,this.age=-1Person() constructed completely,and now this.name=LiMing,this.age=18start to create the constructor Student(),and now this.name=LiMing,this.age=18,this.school=unnamedStudent() constructed completely,and now this.name=LiMing,this.age=18,this.school=PKU
构造方法内部调用虚方法法
- 即调用的不是static,final,private方法。从语法上来说是合法的,但是有时会造成事实上的不合理
- 父类调用该虚方法时,这个虚方法会跑到子类中去
class ConstructorInvokeVirtual2{ public static void main(String[] args) { Person p = new Student("LiMing", 16, "PKU"); }}class Person{ String name = "unnamed"; int age = -1; Person(String name, int age){ this.name = name; this.age = age; sayHello(); } void sayHello(){ System.out.println("A Person, name: " + name + ", age: "+ age); }}class Student extends Person{ String school = "unnamed"; Student(String name, int age, String school){ super(name, age); this.school = school; } void sayHello(){ System.out.println("A Student, name:" + name + ", age: "+ age + ", school: " + school); }}-----------OUTPUT----------- A Student, name:LiMing, age: 16, school: null
- 在本例中,在构造函数中调用了一个动态绑定的方法
sayHello()
,这次,会使用该方法被覆盖的定义,即使用子类中的该方法,而这时对象尚未完全构建好,所以school还没有赋值。 - 因此,可能的话,在构建函数中避免调用任何方法,用尽可能简单的方法使对象进入就绪状态。
- 唯一能够安全调用的是具有final属性的方法。
0 0
- Java中构造方法的执行顺序
- Java中构造方法的执行顺序
- Java- 构造方法的执行顺序
- Java中构造方法的执行顺序
- Java的静态块、模块、构造方法的执行顺序
- Java的静态块、模块、构造方法的执行顺序
- Java的静态块、模块、构造方法的执行顺序
- java 中的静态块 构造方法 等的执行顺序
- Java中“块”与构造方法的执行顺序
- java类中构造方法执行的顺序
- java中静态代码块,构造代码块,构造方法,main方法的执行顺序
- java中静态块、main方法、构造块、构造方法的执行顺序复习
- Java子父类间静态代码块、构造代码块、构造方法的执行顺序
- Java子父类间静态代码块、构造代码块、构造方法的执行顺序
- Java静态代码块、构造代码块、构造方法的执行顺序
- java 静态代码块 构造代码块 构造方法的执行顺序
- java 静态代码块、静态变量、成员变量、构造代码块、构造方法的执行顺序
- java静态代码块、构造方法、构造块的执行顺序
- POJ 1995 Raising Modulo Numbers【快速幂】
- iOS学习笔记-Objective-C-继承和实例化、对象初始化
- POJ3273--Monthly Expense
- java反射机制功能之---检查类的结构
- acm p1753 小明 A+B
- Java- 构造方法的执行顺序
- HN OJ 13375 Flowery Trails (spfa的路径遍历)
- c的rand()函数,相同的种子,windows和android下产生的随机数列不一样
- 华为OJ(计算字符串的距离)
- Mysql net start mysql启动,提示发生系统错误 5 拒绝访问 解决之道
- Valid Anagram
- Objective_C内存管理_note
- Linux权限引发的"血案"
- 安卓常见错误界面不显示