我试图了解子类的实例如何成为父类的实例。我的意思是一旦创建它们就会在内存中获得哪种模型。
检查以下代码段
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扩展后,是否会为分别在内存中继承的父类和子类创建方法的两个副本?
请帮忙..!
谢谢
答案 0 :(得分:1)
子类实例成为父类实例时
它不是“成为” 。 “是” 。 Child
是是Parent
,就像Banana
是是Fruit
。
this
代表当前的类实例
this
代表当前的 class 实例。在运行时只有一个对象,没有多个对象,也没有基于类层次结构的多层。有一个对象。期间。
这代表当前的类实例,那么为什么要获得4 Child的类名称?
使用new
关键字创建了生存在运行时的每个实例/对象。使用new
的类是该对象的运行时类(这是一个简化的语句)。运行时类是调用getClass()
时返回的类。
在所有这些情况下,Child
是obj
指向的实例的运行时类:
Child obj = new Child();
Parent obj = new Child();
//and all the possible intermediate parents, until
Object obj = new Child();
OR扩展后,是否会为分别在内存中继承的父类和子类创建方法的两个副本?
最简单的方法是:
Child
Parent
和Object
中继承了哪些方法和属性因此,当您编写this
时,是指调用当前代码的单个对象。使用this
可以引用的是在运行时类中声明的方法和属性,以及可以从超类型访问的方法和属性。
在编写super
时,仍引用当前代码被调用的单个对象。使用super
引用的是显式方法或属性,该方法或属性在声明当前执行代码的父类的父类中声明。
答案 1 :(得分:0)
您正在看到“ Child”的输出,因为这就是obj
的含义; this
是 runtime 的当前对象,与方法在源代码中的位置无关。这是面向对象编程的不错的特性之一。父类可以定义一个方法,该方法依赖于在子类中实现(或重写)的方法。例如,如果setLog4jConfig
在子类中被覆盖,则该方法将有两个副本。请参阅vtables的说明。