问题描述
我试图了解子类的实例如何成为父类的实例。 我的意思是他们在创建后在内存中获得什么样的模型。
检查下面的代码片段
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 的类名呢?
所以,如果当扩展它再怎么坐在内存孩子是家长,我试图想象父母子女类的坐在计划在内存中this
家长的孩子变的实例。
或扩展时,它是否为在内存中继承的各个父类和子类创建了两个方法副本?
任何帮助请...!
谢谢
1楼
当子类Instance变成父类Instance时
它不会“变成” 。
它“是” 。
Child
是Parent
,就像Banana
是Fruit
。
this
代表当前类 Instance
this
表示当前
类
实例。
运行时只有一个对象,不是多个对象,也不是基于类层次结构的多个层。
有一个对象。
时期。
这代表当前的类实例,那么为什么会得到 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();
或扩展时,它是否为在内存中继承的各个父类和子类创建了两个方法副本?
想到这一点的最简单方法是:
- 创建对象时,Java 知道该对象的运行时类(见上文)。
-
使用运行时类,它知道在该运行时类中声明的对象可以使用哪些方法和属性(
Child
,在您的情况下) -
使用运行时类,它知道从该对象的父类型(
Parent
和Object
,在您的情况下)继承了哪些方法和属性 - 使用运行时类,Java 知道它继承和覆盖的方法将按照子类执行(您没有覆盖的方法)。
因此,当您编写this
,您将引用调用当前代码的单个对象。
您可以使用this
引用的是在运行时类中声明的方法和属性,以及那些可以从超类型访问的方法和属性。
当您编写super
,您仍然引用调用当前代码的单个对象。
您使用super
引用的是在声明当前执行代码的父类中显式声明的方法或属性。
2楼
你看到的是 "Child" 的输出,因为这就是obj
;
this
是运行时的当前对象,而不是方法在源代码中的位置。
这是面向对象编程的优良特性之一;
父类可以定义依赖于在子类中实现(或覆盖)的方法的方法。
例如,如果setLog4jConfig
在子类中被覆盖,则该方法将有两个副本。
请参阅解释。