Base obj=new Derived();
在上面的语句中,引用部分指向 type Base
。这就是编译器如何识别要考虑的类。但是您的代码会产生错误。在解释为什么会显示错误之前,让我先解释一下上述语句的结构。
上述语句的结构:
- 声明 - 参考部分是
Base obj
.
实例化:new 关键字是一个 Java 运算符,用于在内存中创建对象/分配空间。
初始化:new 操作符之后是对构造函数的调用,该构造函数初始化新对象。
由于Derived
是 的子类Base
,因此您可以调用该类中的构造函数Derived
。这就是继承和多态的工作原理。
好的,现在让我们回到错误部分。您的obj.method()
代码中正在寻找类中的函数method()
,Base
但类中的method(int a)
函数Base
需要传递整数类型的参数。因此,要使代码正常工作,调用语句必须类似于obj.method(5)
. 该语句有效,因为调用语句实际上是将 5 传递给函数。
您的代码有一个简单的修复方法:
Derived obj=new Derived();
你注意到了吗?
为什么这行得通?
- 因为
method()
您的Derived
类中有不需要整数参数的函数。
关于 Java 中的继承,还有一个令人惊奇的事实:
超阶级所拥有的一切,也为子阶级所拥有,但反之则不然。是的,子类有权重新定义它从超类继承的任何方法/函数。
上面的语句意味着以下代码将起作用:
Derived obj=new Derived();
obj.method(5);
您一定想知道 - 即使method()
inDerived
不需要参数,这段代码是如何工作的。事实上,Derived
没有method(int a)
.
嗯,这个问题的答案就是我上面提到的惊人事实。
是的,method(int a)
也属于,Derived
因为它是Base
.
但是下面提到的代码是如何工作的?
Derived obj=new Derived();
obj.method(5);
很简单,JVM 查找method(int a)
in 类Derived
并找到该函数,因为它从类Derived
继承了该函数。Base
也要记住这一点,子类也有权覆盖超类中的方法。这意味着您可以method(int a)
在类Derived
中添加覆盖从继承的原始方法的函数Base
。
继承如何运作?
- 当你
obj.method(5)
在上面的代码中调用时,JVM 首先会在Derived
. 如果它没有找到任何被覆盖的方法,它会向上移动inheritance hierarchy chain
到超类并查找相同的方法。但相反的情况并非如此。