Java中创建子类对象会创建父类对象么?

0.写在前面

  • 创建对象指的是在堆区开辟空间
  • 编译器在运行子类构造器之前,必须先执行父类构造器;且调用父类构造器的语句必须在子类构造器的第一行。
  • 构造方法的作用是为堆区中的对象的属性初始化,不是创建对象。

1.开门见山

Java 中创建子类对象不会创建父类对象!

2.show me the code!

示例代码

/**
 * 示例测试类
 *
 * @author chao.wang
 * @date 2018.08.31
 */
public class Test {
    public static void main(String[] args) {
        // 创建子类对象
        Sub sub = new Sub();
        // 通过setter设置父类的私有成员变量str
        sub.setStr("SubString");
        System.out.println(sub.getStr());
    }
}

/**
 * 示例父类
 *
 * @author chao.wang
 * @date 2018.08.31
 */
class Base {
  private String str;

  /**
   * 父类构造器
   */
  public Base() {
    System.out.println("Base():" + this);
  }

  public void setStr(String str) {
    this.str = str;
  }

  public String getStr() {
    return this.str;
  }
}

/**
 * 示例子类
 *
 * @author chao.wang
 * @date 2018.08.31
 */
class Sub extends Base {
  /**
   * 子类构造器
   */
  public Sub() {
    System.out.println("Sub():" + this);
  }

}

测试结果

Base():Sub@2f2c9b19
Sub():Sub@2f2c9b19
SubString

3.几点疑问

  • 是谁在完成创建对象的工作?

    new 关键字

  • 既然没有父类对象,那么父类的私有成员变量 str 从何而来?

    虚拟机会在堆区中开辟一块空间来保存这个私有属性(该空间不属于子类对象),并且在运行时该属性的空间会与方法区中 Base.class 动态绑定。

    子类对象 sub 调用继承父类的方法 setStr() 时,系统会找到与 setStr() 方法 静态绑定 的类 Base,再找到与 Base动态绑定 的属性空间 str,便可对该属性进行相关操作。

    • 静态绑定:(finalstaticprivate)在程序执行前已经被绑定,也就是说在编译过程中就已经知道这个熟悉或方法是哪个类的方法,此时由编译器获取其他连接程序实现。

    • 动态绑定:在运行根据具体对象的类型进行绑定。

    类的方法可以被继承,但是类的构造器和 private 修饰的属性及方法不能被继承。

内存图

  • 13
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值