【问题标题】:How come @override works in Java?@override 如何在 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...
  • 这是一个问题吗?我不明白问题出在哪里
  • 最后三个结果行不可能来自提供的代码:它们都应该说“void Method”
  • @jay 现在这是一个问题,我已经添加到我的答案中。见下文。

标签: java inheritance overloading overriding


【解决方案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() 时,您正在动态创建对堆上对象的引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 2014-09-25
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
相关资源
最近更新 更多