如果没有创建父类对象,子类如何使用父类的成员呢?
还有,super所谓的父类存储空间的表示到底是什么意思?

写在前面

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

开门见山

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

上代码

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

/**
 * 示例父类
 */
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;
    }
}

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

}

测试结果

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

几点疑问

  • 是谁在完成创建对象的工作?
    new 关键字
  • 既然没有父类对象,那么父类的私有成员变量 str 从何而来?
    虚拟机会在堆区中开辟一块空间来保存这个私有属性(该空间不属于子类对象),并且在运行时该属性的空间会与方法区中 Base.class 动态绑定。
    子类对象 sub 调用继承父类的方法 setStr() 时,系统会找到与 setStr() 方法 静态绑定 的类 Base,再找到与 Base 类 动态绑定 的属性空间 str,便可对该属性进行相关操作。
    • 静态绑定:(final、static、private)在程序执行前已经被绑定,也就是说在编译过程中就已经知道这个熟悉或方法是哪个类的方法,此时由编译器获取其他连接程序实现。
    • 动态绑定:在运行根据具体对象的类型进行绑定。

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

原文地址:http://www.cnblogs.com/nylgwn/p/16887669.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性