@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 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

我如何使这个字符功能在java中工作

面试专题 HashMap如何在Java中工作

如何使样式中的 Layout_margin 在 Java 中工作

如何创建在 Visual Studio Code 中工作的 Java / Maven 项目?

Kotlin/Native 垃圾收集器如何在 C 中工作?

如何让 Linkedin OAuth 在 Spring Boot 中工作