gpt4 book ai didi

java - 如果重载和覆盖相同的方法,Java中的意外多态行为

转载 作者:行者123 更新时间:2023-12-04 07:36:29 25 4
gpt4 key购买 nike

我一直在对我的项目进行一些更改,发现一些奇怪的地方,或者更确切地说,我会说 Java 中多态性的意外行为。我在下面给出的 Poc 中复制了相同的行为。
1.CommonInterface.java

package com.general;

public interface CommonInterface {

public void getViews(String str);

public void getViews(String str, Long id);

}
2.GenericUtility.java
package com.general;

public class GenericUtility implements CommonInterface{

@Override
public void getViews(String str) {
System.out.println("This is getViews (single param)from GenericUtility");
getViews(str, null);
}

@Override
public void getViews(String str, Long id) {
System.out.println("This is getViews (multi-param) from GenericUtility");
}

}
3. CustomUtility.java
package com.general;

public class CustomUtility extends GenericUtility {

@Override
public void getViews(String str) {
System.out.println("This is getViews (single param)from CustomUtility");
super.getViews(str);
}

@Override
public void getViews(String str, Long id) {
System.out.println("This is getViews (multi-param) from CustomUtility");
super.getViews(str, null);
}

}
4. Main.java
package com.general;

public class Main {

public static void main(String[] args) {
GenericUtility utility = new CustomUtility();
String str = "Random String";
utility.getViews(str);
}
}
运行 Main.java 后,我的预期输出是
This is getViews (single param)from  CustomUtility
This is getViews (single param)from GenericUtility
This is getViews (multi-param) from GenericUtility
但我得到的输出是
This is getViews (single param)from  CustomUtility
This is getViews (single param)from GenericUtility
This is getViews (multi-param) from CustomUtility
This is getViews (multi-param) from GenericUtility
我无法理解为什么 com.general.GenericUtility#getViews(java.lang.String)正在调用 com.general.CustomUtility#getViews(java.lang.String, java.lang.Long)这是预期的行为吗?我不知道的是什么?
提前致谢。

最佳答案

Java 使用运行时虚拟分派(dispatch)来调用实例方法(即那些不是静态的)。这仍然适用于对 this 的调用。 ;例如,抽象类可以这样定义抽象方法createResultObject由子类实现并在其doProcessing 中使用该方法方法。
在您的情况下,对象是 CustomUtility ,所以调用this.getViews(String, String)被派往CustomUtility ,然后使用 super内部。

关于java - 如果重载和覆盖相同的方法,Java中的意外多态行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67716649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com