Java- 构造方法的执行顺序

来源:互联网 发布:qq mac版 编辑:程序博客网 时间:2024/05/22 08:03

构造方法的执行过程

  • 构造方法的执行过程遵循以下步骤:
    1. 调用本类或父类的构造方法,直至最高一层(Object)
    2. 按照声明顺序执行字段的初始化赋值
    3. 执行构造函数的各语句
  • 简单的说:
    • 先父类构造,再本类成员赋值,最后执行构造方法中的语句。
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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 ubuntu完全卡死怎么办 win10以太网没了怎么办 hks泄压阀声音小怎么办 声卡驱动删除了怎么办 白色水彩没有了怎么办 大学毕业我想考军校怎么办? 考军校分数不够怎么办 大专工作不好找怎么办 小学二年级插班怎么办 进厂年龄不到怎么办 入伍批准书丢了怎么办 考驾照期间参军怎么办 学位房被占用怎么办 教室里回音太大怎么办 教室里味道太大怎么办 键盘只能打拼音怎么办 一师一优课件上传慢怎么办? 药店买药不给退怎么办 小孩热感冒发烧怎么办 孕妇热感冒了怎么办 孕妇热感冒喉咙痛怎么办 空军一号有划痕怎么办 高铁上乘客太吵怎么办 军官礼服丢了怎么办 空军大檐帽帽袋坏了怎么办 保安不发工资怎么办 做保安工资不资不发怎么办 公安改革辅警怎么办 皮带带子丢了怎么办 警校学生证丢了怎么办 警校证丢了怎么办 盘查没带身份证怎么办 网线拔不出来怎么办 车间压强差过大怎么办 不遵守交通规则交警怎么办 西裤屁股磨出光该怎么办 中暑发烧不退烧怎么办 小孩中暑反复发烧怎么办 上火导致的发烧怎么办 夏季运动中暑后怎么办 感觉中暑了头疼怎么办