编程语言
首页 > 编程语言> > java – 了解继承和覆盖

java – 了解继承和覆盖

作者:互联网

其实我的问题已经回答了,但我无法理解.这是一段代码:

public class Superclass {

   public static void main (String[] args){
      Superclass obj = new Subclass();
      obj.doSomething(); #prints "from Superclass"
   }

   private void doSomething(){System.out.println("from Superclass");}
}

class Subclass extends Superclass {

    private void doSomething(){System.out.println("from Subclass");}

}

它打印出:“来自超类”

Since the reference type of the object obj is SuperClass, a call to
doSomething() tries to access the private method defined in SuperClass
itself (private methods cannot be overridden). As doSomething() is
accessible within SuperClass, the main method can call doSomething()
without giving any error/s.

据我所知,调用方法的方式是这样的:(也许我完全错了):

对象的实例仅存储数据本身,当我调用实例方法时,Java会查看引用变量的类型,并从该类的类中调用该方法.
(这对我来说似乎合乎逻辑,并解释了为什么上面的代码打印“来自超类”)

但是将第一个doSomething()方法中的访问修饰符更改为protected会让我困惑,因为我无法理解Java如何知道如果引用类型是SuperClass而不是SubClass则存在重写.覆盖是否也改变了超类中的方法?

或者我对方法调用和覆盖如何工作完全错了?

我真的很感激如果有人能帮我解释我错过的东西.

解决方法:

私有方法以及静态方法和所有变量都无法覆盖,可以隐藏它们.因此,您需要将方法的访问修饰符从private更改为任何其他访问修饰符.

N.B:重写方法时要遵循一些协议;如果不能比被覆盖的方法更易于访问,则子类中定义的方法的访问修饰符必须具有相同的访问级别.返回类型必须是协变等…

标签:java,oop,inheritance,method-overriding
来源: https://codeday.me/bug/20190702/1357748.html