1

为了自学 Java,我最近翻阅了几本书,幸运的是,主要是由于运气,遇到的困难很少。这已经改变了。

我在继承和整个超类子类设置下阅读了以下部分

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

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

首先 - 这是正确的吗?

第二:如果我重写了一个方法,因此在父类中有一个,在子类中有一个,然后我创建一个超类对象,然后将其引用分配给一个子类对象,就像我上面所做的那样,通过类似于动态的原理Method Dispatch,一个被调用的重写方法应该默认访问子类方法吗?

好吧,我的问题是:

如果对超类对象的引用为子类对象重新工具,并且将拒绝直接 object.member 访问子类定义的成员,仅支持超类定义的成员,如果为子类对象重新工具超类引用,怎么能,如果访问受到超类起源引用的限制,则覆盖的方法适用于子类对象

4

3 回答 3

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  

检查评论。希望这可以帮助。

于 2013-05-13T03:55:59.897 回答
1
only members defined by the superclass may be accessed from the subclass.

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

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

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

于 2013-05-13T03:45:44.197 回答
1

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

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

在变量的情况下,使用基类中的变量,而不是子类中的变量。

恢复,相似之处是:

- 在 java 中,变量是根据引用获取的 - 在 C++ 中,没有虚拟变量

所以在我们谈论的情况下,隐藏在子类或子类中的变量不是被采用而是隐藏的

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

于 2015-02-11T02:24:18.643 回答