当子类实例成为父类实例时

时间:2019-03-04 06:01:16

标签: java inheritance

我试图了解子类的实例如何成为父类的实例。我的意思是一旦创建它们就会在内存中获得哪种模型。

检查以下代码段

public class Parent {
    public String log4jConfig;

    public void setLog4jConfig(String log4jConfig){
        System.out.println(this.getClass());  ---4
        this.log4jConfig = log4jConfig;
    }

    public String getLog4jConfig() {
        return log4jConfig;
    }
}

public class Child extends Parent {
}

public class Mainclass {
    public static void main(String[] args) {
        Child obj = new Child(); // ---1
        obj.setLog4jConfig("log4jConfig");
    }
}

当我创建子类的实例时,它可以访问父类的所有方法,因为它们是继承的。

this代表当前的类实例,那么为什么要获得4 Child的类名呢?因此,如果CHILD在扩展时处于“父级”状态,那么它在内存中的位置,我正在尝试形象化“父级和子级”在内存中的布置计划,其中父级this成为Child的实例。

OR扩展后,是否会为分别在内存中继承的父类和子类创建方法的两个副本?

请帮忙..!

谢谢

2 个答案:

答案 0 :(得分:1)

  

子类实例成为父类实例时

它不是“成为” “是” Child是是Parent,就像Banana Fruit

  

this代表当前的类实例

this代表当前的 class 实例。在运行时只有一个对象,没有多个对象,也没有基于类层次结构的多层。有一个对象。期间。

  

这代表当前的类实例,那么为什么要获得4 Child的类名称?

使用new关键字创建了生存在运行时的每个实例/对象。使用new的类是该对象的运行时类(这是一个简化的语句)。运行时类是调用getClass()时返回的类。

在所有这些情况下,Childobj指向的实例的运行时类:

Child obj = new Child();
Parent obj = new Child();
//and all the possible intermediate parents, until
Object obj = new Child();
  

OR扩展后,是否会为分别在内存中继承的父类和子类创建方法的两个副本?

最简单的方法是:

  • 创建对象时,Java会知道该对象的运行时类(见上文)。
  • 通过运行时类,它知道在该运行时类中声明的对象可用的方法和属性(在您的情况下为Child
  • 通过运行时类,它知道从该对象的父类型(在您的情况下为ParentObject中继承了哪些方法和属性
  • 对于运行时类,Java知道将根据子类执行由其继承和覆盖的方法(您没有覆盖的方法)。

因此,当您编写this时,是指调用当前代码的单个对象。使用this可以引用的是在运行时类中声明的方法和属性,以及可以从超类型访问的方法和属性。

在编写super时,仍引用当前代码被调用的单个对象。使用super引用的是显式方法或属性,该方法或属性在声明当前执行代码的父类的父类中声明。

答案 1 :(得分:0)

您正在看到“ Child”的输出,因为这就是obj的含义; this runtime 的当前对象,与方法在源代码中的位置无关。这是面向对象编程的不错的特性之一。父类可以定义一个方法,该方法依赖于在子类中实现(或重写)的方法。例如,如果setLog4jConfig在子类中被覆盖,则该方法将有两个副本。请参阅vtables的说明。