zoukankan      html  css  js  c++  java
  • 父类的构造函数在对象的生命中扮演的角色

    在创建新对象时,所有继承下来的构造函数都会被继承

    1. 这代表着每个父类都有一个构造函数(因为每个类至少都会有一个构造函数),并且每个构造函数都会在对象创建时执行。
    2. 执行new的指令是个大事件,因为他会启动构造函数的连锁反应。还有,就算是抽象的类也有构造函数。虽然你不能对抽象函数执行new操作,但是抽象函数还是父类,因此它的构造函数会在具体的子类创建实例时被执行。
    3. 在构造函数中用super调用父类的构造函数部分(注意:调用super() 方法是调用父类构造函数的唯一方法)。要记得子类会根据父类的状态进行继承方法(也就是父类实例变量

    example:

     补充:如实例所示,Hippo 对象 IS-A Animal 同时也是IS-A Object,如果需要创建Hippo,也需要创建出Animal 以及Object的部分,这样的过程被称为“构造函数链Constructor Chaining)” 。

    1 public class Animal {
    2    public Animal(){
    3        System.out.println("Maka a animal");  
    4    }
    5 }
    1 public class Hippo extends Animal{
    2   public Hippo(){
    3       //super();默认添加,调用父类
    4       System.out.println("make a Hippo");
    5   }
    6 }
    1 public class TestHippo {
    2 
    3     public static void main(String[] args) {
    4         // TODO Auto-generated method stub
    5       System.out.println("Starting...");
    6       Hippo hippo=new Hippo();
    7     }
    8 
    9 }

          顺序执行

    1. 首先,该程序执行new Hippo()的动作,Hippo()的构造函数会进入堆栈最上方的的堆栈块中
    2. Hippo()调用父类的构造函数导致Animal()的构造函数进入栈顶
    3. Animal()调用父类的构造函数导致Object()构造函数进入栈顶
    4. Object()执行完毕,它的堆栈快被弹出,接着继续执行Animal()
    5. 依次类推。。。

     为什么子类一定要访问父类中的构造函数呢?

    • 因为父类中的数据子类可以直接获取, 所以子类随想在建立时,需要先查看父类是如何对这些数据进行初始化的,所以子类在对象初始化时,要首先访问一下父类中的构造函数
    • 如果要访问弗雷指定的构造函数,可以通过手动定义super语句的方式进行指定调用

    Plus example: 

     1 class Fu{
     2     int x =30;
     3   Fu()
     4     {   
     6       System.out.println(x);
     7     }
     8  Fu(int x)
     9    {
    10      System.out.println(x);
    11     }
    12  }
    13  class Zi extends Fu { 
    14      Zi(){
    15          //seper();
    16          //super(4);  //指定访问父类中带有一个参数的构造函数
    17          this(20);
    18         System.out.println("zi ..."+x);
    19      }
    20     Zi(int x)
    21     {
    22         System.out.println("zi..."+x);
    23      }
    24      
    25 }
    26 public class Single {
    27      public static void main(String[] args) {
    28          Zi z=new Zi();
    29          //Zi z1=new Zi(3);
    30      }
    31  }

    执行结果

    执行顺序:

    1. 先访问子类中空参数的构造函数
    2. 在执行子类构造函数时,由于隐式super()的存在,所以先执行父类的空构造函数,输出20
    3. 接下来执行this(),由于它指向的是本类中的带一个参数的构造函数,所以在执行子类中带有一个参数的System.out.println("zi..."+x)
    4. 最后执行this()下一行的System.out.println("zi..."+x)(注:其中x是继承自父类)

     

  • 相关阅读:
    202011.19
    202011.18
    202011.17
    202011.16
    202011.14
    jdk的下载和配置
    layui中form表单
    JS中utocomplete
    转:JqueryUI学习笔记-自动完成autocomplete
    JSON.parse()与JSON.stringify()的区别
  • 原文地址:https://www.cnblogs.com/lujun1949/p/6213033.html
Copyright © 2011-2022 走看看