当前位置: 代码迷 >> java >> 当子类Instance变成父类Instance时
  详细解决方案

当子类Instance变成父类Instance时

热度:92   发布时间:2023-07-26 14:10:50.0

我试图了解子类的实例如何成为父类的实例。 我的意思是他们在创建后在内存中获得什么样的模型。

检查下面的代码片段

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家长的孩子变的实例。

或扩展时,它是否为在内存中继承的各个父类和子类创建了两个方法副本?

任何帮助请...!

谢谢

当子类Instance变成父类Instance时

它不会“变成” “是” ChildParent ,就像BananaFruit

this代表当前类 Instance

this表示当前 实例。 运行时只有一个对象,不是多个对象,也不是基于类层次结构的多个层。 有一个对象。 时期。

这代表当前的类实例,那么为什么会得到 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();

或扩展时,它是否为在内存中继承的各个父类和子类创建了两个方法副本?

想到这一点的最简单方法是:

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

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

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

你看到的是 "Child" 的输出,因为这就是obj this运行时的当前对象,而不是方法在源代码中的位置。 这是面向对象编程的优良特性之一; 父类可以定义依赖于在子类中实现(或覆盖)的方法的方法。 例如,如果setLog4jConfig在子类中被覆盖,则该方法将有两个副本。 请参阅解释。

  相关解决方案