@override 如何在 Java 中工作?
Posted
技术标签:
【中文标题】@override 如何在 Java 中工作?【英文标题】:How come @override works in Java? 【发布时间】:2016-10-29 03:19:11 【问题描述】:我需要有人来看看我对这些代码行的看法。
class AAA
public void rideMethod()System.out.println("AAA's Method");
public void loadMethod()"void Method";
class BBB extends AAA
public void rideMethod()System.out.println("BBB's Method");
public void loadMethod(int num)"int Method";
class CCC extends BBB
public void rideMethod()System.out.println("CCC's Method");
public void loadMethod(double num)"double Method";
class Ride
public static void main(String[] args)
AAA ref1 = new CCC();
BBB ref2 = new CCC();
CCC ref3 = new CCC();
ref1.rideMethod();
ref2.rideMethod();
ref3.rideMethod();
ref3.loadMethod();
ref3.loadMethod(1);
ref3.loadMethod(1.2);
//These are results.
CCC's Method
CCC's Method
CCC's Method
void Method
int Method
double Method
这是我要的。
继承AAA()和BBB()的主作用域中ref#的CCC()是我们可以在这里引用包含类的各个方面的框。而 ref# 的 AAA、BBB 和 CCC(作为类类型)就像我们可以访问的边界。由于 ref# 已使用 CCC() 进行了初始化,并且采用了 @override 的概念,因此必然会出现 Syso("CCC's Method")。 每个 loadMethod 都会拆分出“void int and double Method”,因为它们最初使用的类是 AAA 和 BBB。 感谢阅读!
【问题讨论】:
你的问题到底是什么?另外,您提到了@override
,但您的代码中没有@override
...
这是一个问题吗?我不明白问题出在哪里
Overriding != Polymorphism
最后三个结果行不可能来自提供的代码:它们都应该说“void Method”
@jay 现在这是一个问题,我已经添加到我的答案中。见下文。
【参考方案1】:
AAA ref1 = new CCC();
BBB ref2 = new CCC();
CCC ref3 = new CCC();
有没有人可以解释它在编译器中是如何工作的?
在这种情况下,ref1
是对 AAA
对象的引用,并且由于 CCC
继承自 AAA
它也是 AAA
,因此编译器和 JVM 允许此分配。 ref2
是对 BBB
的引用,并且由于 new CCC()
也是 BBB
通过继承允许此分配。
编辑:使用修改后的代码,它会按照您调用loadMethod(int)
和loadMethod(double)
的方式打印
在前三个调用中,您使用的是重载方法,在后三个调用中,您使用的是重载方法。
在您编辑之前......
如果你更正代码以便它编译你得到
CCC's Method
CCC's Method
CCC's Method
void Method
void Method
void Method
在这里运行http://ideone.com/r7K2wI
我有点明白你想说什么,“Syso(“CCC 的方法”)必须因此而发生。”但是
每个 loadMethod 都会拆分出“void int and double Method”,因为它们最初使用的类是 AAA 和 BBB。 感谢阅读!
不,调用 loadMethod()
不可能调用 loadmethod(double)
,因为它不能也不知道您将传递给它的是哪个 double
。
【讨论】:
我对人们刚刚看到并在我的问题板上给我减分的事情感到非常沮丧,尽管我明白为什么。 顺便说一句谢谢你的链接。 @jay 我很难理解你想说什么,但我仍然不能说我明白你的问题是什么。 ref3.loadMethod(); ref3.loadMethod(1); ref3.loadMethod(1.2); @jay 要记住的关键是 Java 只有原语和变量引用,Java 总是按值传递,而引用是按值传递。当您调用new CCC()
时,您正在动态创建对堆上对象的引用。以上是关于@override 如何在 Java 中工作?的主要内容,如果未能解决你的问题,请参考以下文章
如何使样式中的 Layout_margin 在 Java 中工作