程宇寒 2020-02-27 11:45 采纳率: 100%
浏览 863
已采纳

在java中,当创建一个子类对象会不会先创建父类对象?(如果父类是抽象类呢?)

在java中,当创建一个子类对象会不会先创建父类对象?(如果父类是抽象类呢?)

被一些教材和资料误导和困扰,有些教材和资料上说,按照面向对象的思想,“没有爸爸,怎么会有儿子”,即 “没有父类怎么会有子类”。言外之意就是说,创建子类对象时,会先创建父类对象!然而真的是这样吗?

提个问题:如果当创建一个子类对象会先创建父类对象的话,那么如果父类是抽象类的话,那该抽象父类也会被实例化喽,这与抽象类不能实例化相互矛盾啊!

图片说明
图片说明
图片说明

package javase5;

public abstract class Animal {
    int age;

    public Animal() {
        this.age = 6;
        System.out.println("我是Animal类的无参构造函数");
    }
}
package javase5;

public class Cat extends Animal{

    public Cat() {
//      super(); 
//就算不写super();这行代码,系统也会默认自动调用父类的无参构造函数
        System.out.println("我是Cat类的无参构造函数");
    }

    public static void main(String[] args) {
        Cat cat = new Cat();
        System.out.println(cat.age);
    }

}
  • 写回答

2条回答 默认 最新

  • shavenField 2020-02-28 10:36
    关注

    子类对象的实例化过程分享

    1.产生对象,进行成员变量默认初始化。

    整个对象是在一开始即被完整创建,其所有数据结构都已经分配内存。
    以使得后续的代码能对这部分数据进行访问。
    默认初始化,例如 private String str = null;

    2.构造器形参赋值。

    构造器也是方法,也需要接收参数。

    3.检查构造器方法体第一行是否是 this(args...),若有则执行子类对应构造方法(回到步骤2)

    同一个构造器中,3/4有且必有唯一一个
    大部分时候super()未显示调用,但不显示指定this()则隐式调用super()

    4.检查构造器方法体第一行是否是 super(args...),若有则执行父类对应构造方法(回到步骤2)

    抽象类是有构造函数的,但不能通过new关键字调用。
    抽象类的构造函数依然会执行,对其抽象类的数据进行访问或操作。
    之后你仍然可以通过子类对象正确访问父类抽象类的属性或方法也是因为如此。

    5.当前类的成员变量显示初始化。

    类变量或类代码块会在类第一次被加载时执行,之后不再执行。
    成员变量显示初始化,例如 private String str = "a";
    代码块显示初始化,例如 {str = "b"};

    6.执行当前构造方法中的代码块

    若是步骤3/4执行到此,则最后子类继续步骤5
    当子类执行6结束,整个对象的创建过程结束


    关于通用的实例化称呼,有两个用法区别,一是通过new创建对象,二是给类的属性赋值的流程。
    So

    • 抽象类是不能通过new实例化创建对象的。
    • 实例化子类对象之前是肯定需要实例化父类属性,即:抽象类的属性也会被实例化。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已采纳回答 3月21日

悬赏问题

  • ¥15 单片机 如何进行数据存储
  • ¥20 配置UGM库出现问题
  • ¥15 把Excel导入MATLAB显示错误怎么解决?
  • ¥15 Java中消息和缓存如何使用
  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站