对象类继承

时间:2019-06-19 14:07:07

标签: java inheritance

我们知道类A隐式扩展了Object类,但是如果我们使用类A的构造函数实例化Object类对象并尝试访问类A的print()方法,则它会显示编译时错误,而在其他情况下,类B会扩展类A和使用类B构造函数实例化的类A对象,并尝试访问print()方法工作正常。

class A{
    public void print(){
        System.out.println("A");
    }
}
class B extends A{
    public void print(){
        System.out.println("B");
    }
}
public class MyClass {
    public static void main(String args[]) {
        Object o = new A();
        o.print(); // error
        A a = new B();
        a.print();  // print B
    }
}

3 个答案:

答案 0 :(得分:2)

此行:

o

您知道A实际上是{strong>类型o的。

编译器可以知道,但是在Java中,知道。编译器仅知道存在一个名为Object的类型为o的变量。

因此,编译器为在Object上调用声明的类型npm build不支持的方法而鼓掌!

其他语言在这些事情上“更聪明”,但是在Java中,事情就是这样。

答案 1 :(得分:1)

您的类B扩展A的示例与A扩展Object的情况不同。区别在于,在第一种情况下,超类(A)包含print()方法,在第二种情况下,超类(Object)不包含print()。如果您从print()类中删除了A方法,则第二部分也不起作用:

class A{
}

class B extends A{
    public void print(){
        System.out.println("B");
    }
}

public class MyClass {
    public static void main(String args[]) {
        Object o = new A();
        //o.print(); // error
        A a = new B();
        a.print();  // error
    }
}

答案 2 :(得分:0)

因为Object类没有print()方法,并且引用o是Object类型,所以编译器将引发错误。 在情况2中:类A具有print()方法,这就是为什么没有编译错误的原因,并且在运行时它会调用类B的print()方法,因为我们在运行时分配了类B的引用。