覆盖子类对象的超类引用

时间:2013-05-13 03:15:28

标签: java oop override

我最近一直在阅读几本书,以便自学Java,幸运的是,主要是由于运气,遇到的困难很少。这刚刚改变了。

我在继承和整个超类子类设置

下阅读了以下部分

- 创建新的超类对象时,它像所有对象一样,分配了一个引用(在本例中为superReference)

- 如果创建了一个新的子类对象(使用扩展超类的定义子类),然后将superReference引用设置为引用而不是原始对象,那么我的理解是,因为引用了对于超类,只能从子类访问超类定义的成员。

首先 - 这是正确的吗?

第二:如果我重写了一个方法,因此在super中有一个,在sub中有一个,我创建了一个超类对象,然后像上面那样将它的引用分配给一个子类对象,通过调用的原理像Dynamic Method Dispatch这样的东西,一个被调用的重写方法应该默认访问子类方法吗?

好吧,我的问题是:

如果对子类对象的引用被重组为超类对象,并且将拒绝对子类定义的成员的直接object.member访问,只支持超类定义的成员,如果为超类引用重新设置超类引用,怎么可以子类对象,如果访问受到超类引发引用的限制,则重写方法应用于子类对象 -

3 个答案:

答案 0 :(得分:4)

如果您尝试:

class SuperClass{
    int intVar = 0;
    void method(){
        //in super class
    }
}
class SubClass extends SuperClass{
    int intVar = 2;
    void method(){
        //in sub class
    }
}

然后

SuperClass obj = new SubClass();
int val = obj.intVar;// this is taken from SuperClass as variables are decided on reference basis
//if both superclass and subclass contain the same variable it is called shadowing
obj.method();// it is taken from the SubClass as it is method overriding 
//and is decided at runtime based on the object not the reference  

检查评论。希望这会有所帮助。

答案 1 :(得分:1)

only members defined by the superclass may be accessed from the subclass.

首先:这是完全错误的。子类可以毫无问题地访问它自己的成员。但是,一旦将子类实例分配给超类变量(引用),就只能调用只能从超类访问的方法或成员。这是你的意思吗?

第二:将要执行的方法是实例(对象)中的方法。不是引用(变量)类型的方法。所以是覆盖的方法总是会被执行。

第三:子类可以覆盖方法但不覆盖实例属性。无论超类中的成员变量是什么,也都在子类中。只要保留现有的访问修饰符或使用更易于访问的访问修饰符,就可以覆盖子类中的方法。

答案 2 :(得分:1)

在Oracle文档中没有提及,或者至少它没有明确或明确解释。在我看来,这种行为就像C ++中的虚方法一样,不同之处在于,通过在基类或父类(java中的超类)中定义的方法之前使用关键字 virtual ,可以清楚地看到这种情况。必须在子类中重新定义。在C ++中,没有虚拟变量,只有虚拟方法。

在这种情况下,当我们有一个指向子类实例的基类的指针(引用),并且在父类和子类中都有具有相同签名的方法和具有相同名称的变量时,如果父类的前面没有关键字虚拟,那么将要执行的方法的定义是父类的定义,另一方面,子类的定义将在声明为的方法中执行虚拟的。

对于变量,将采用基类中的变量,而不是子类中的变量。

恢复,相似之处是:

- 在java中,变量基于引用 - 在C ++中没有虚拟变量

因此,在我们讨论的情况下,隐藏子类或子类中的变量不是隐藏的

- 在java中,基于对象或实例采用方法 - 在C ++中,必须在子类中重新定义虚拟方法,并采用这些方法