当前位置: 首页 > news >正文

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 修饰的属性及方法不能被继承。

相关文章:

  • 通过PXE部署系统时报错 0xc000000f
  • RabbitMQ之消息确认机制(事务+Confirm)
  • 大屏FAQ
  • java源码 - CountDownLatch
  • 推荐几十本DBA学习的书
  • 利用 Siblings一步实现多个同级div,只改变当前点击的div样式
  • 前端笔记-201808
  • 设置PHP最长运行时间
  • zabbix添加nginx中间件监控
  • 将MWeb的文章发布到自己做的网站(超级详细)
  • SELinux 宽容模式(permissive) 强制模式(enforcing) 关闭(disabled) 几种模式之间的转换...
  • 如何把本地文件上传到gitlab上已存在的工程里
  • Spring事务隔离级别详解
  • 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑)
  • 输入一条url后,发生了什么??
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • Apache的基本使用
  • css系列之关于字体的事
  • Git学习与使用心得(1)—— 初始化
  • iOS 颜色设置看我就够了
  • Java 网络编程(2):UDP 的使用
  • JavaScript HTML DOM
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • python学习笔记 - ThreadLocal
  • QQ浏览器x5内核的兼容性问题
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • tweak 支持第三方库
  • vue-cli在webpack的配置文件探究
  • Yii源码解读-服务定位器(Service Locator)
  • 区块链分支循环
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 使用 @font-face
  • 探索 JS 中的模块化
  • 一文看透浏览器架构
  • - 转 Ext2.0 form使用实例
  • 交换综合实验一
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #{}和${}的区别是什么 -- java面试
  • #mysql 8.0 踩坑日记
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • *1 计算机基础和操作系统基础及几大协议
  • .Net core 6.0 升8.0
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .NET中 MVC 工厂模式浅析
  • @JoinTable会自动删除关联表的数据
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心
  • [C++] 统计程序耗时