java - 试图理解 Java 中的继承

标签 java inheritance subclass superclass

我觉得我对 Java 中的继承有很好的理解,但我正在为以下情况而苦苦挣扎:

public class SuperClass {

    private String name;
    private int age;

    public SuperClass(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void sharedMethod() {
        System.out.println("I'm a shared method in the SuperClass");
    }

}


public class SubClass extends SuperClass {

    public SubClass(String name, int age) {
        super(name, age);
    }

    public void sharedMethod() {
        System.out.println("I'm a shared method in the SubClass");
    }

    public void subMethod() {
        System.out.println("I'm subMethod");
    }

}


public class Main {

    public static void main(String args[]) {

        SuperClass test = new SubClass("Laura", 30);

        test.sharedMethod();

        test.subMethod(); // causes an error
    }
}

我主要是在努力理解使用 SuperClass test = new SubClass("Laura", 30); 时这里实际创建的是什么(这似乎只在 SubClass extends SuperClass - 没有 Casting 怎么可能?)。

我不明白的原因是因为我可以调用 sharedMethod 打印出 SubClass 方法的文本(所以大概是 SubClass 在这个实例中覆盖了 SuperClass 方法),但是我根本无法从 SubClass 调用 subMethod 。抱歉,如果我没有很好地表达出来,我似乎无法理解所引用的内容,可以使用哪些方法,为什么要这样做,为什么 SubClass 覆盖一个方法,如果该方法是共享的,但不能以其他方式调用。

最佳答案

通过 SuperClass test = new SubClass("Laura", 30),您创建了一个 SubClass 实例,但由 SuperClass 引用它。

在编译阶段,编译器发现 SuperClass 没有方法 subMethod,所以会出现编译错误。

在运行时,JVM发现test其实是一个SubClass,所以SubClasssharedMethod:

public void sharedMethod() {
    System.out.println("I'm a shared method in the SubClass");
}

将被执行。

关于java - 试图理解 Java 中的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50088016/

相关文章:

java - Spring - 如何正确使用@Autowired来防止controller/MockMvc为空?

c++ - 没有继承的公共(public)成员

C# 转换问题 : from IEnumerable to custom type

python - numpy ndarray 子类 : ufunc don't return scalar type

macos - 将 IKImageBrowserView 的父类(super class)替换为 NSVisualEffectView

ios - 为什么从自定义 UIView 向 UIButton 添加 subview 不显示添加的 subview ?

java - 方案 : hdfs when building fat jar in Spark; works fine in Eclipse mars 没有文件系统

java - Osmdroid -NullPointerException : Attempt to invoke virtual method 'boolean org. osmdroid.views.overlay.Overlay.onTouchEvent

java - 如何在 ListView 中使用 Android DataBinding 并仍然使用 ViewHolder 模式?

c# - "class<T> where T : IList"和 "IList"类型的字段有什么区别