gpt4 book ai didi

java - Java 面试后的反射(reflection) : Inheritance and polymorphism

转载 作者:行者123 更新时间:2023-11-29 09:36:47 25 4
gpt4 key购买 nike

以下代码:

class Base{}

class Agg extends Base{

public String getFields(){
String name="Agg";
return name;
}
}

public class Avf{
public static void main(String args[]){
Base a=new Agg();
//please take a look here
System.out.println(((Agg)a).getFields()); // why a needs cast to Agg?

}
}

我的问题是:为什么我们不能将 ((Agg)a).getFields() 替换为 a.getFields()?为什么我们需要在 a 上进行类型转换?我提到 getFields() 没有在类 Base 中定义,因此类 Agg 不从其基类扩展此方法。但是,如果我在类 Base 中定义方法 getFields(),喜欢:

class Base{
public String getFields(){
String name="This is from base getFields()";
return name;
}
}

一切都会好起来的。然后 ((Agg)a).getFields() 等同于 a.getFields()

在代码中

Base a=new Agg();    

这行是否意味着aAgg() 的引用并且a 可以直接调用类Agg 的方法。但是,如果我没有在 Base 类中定义方法 getFields() 为什么会有区别?任何人都可以向我解释一下吗?

最佳答案

System.out.println(((Agg)a).getFields()); // why a needs cast to Agg?

因为 Base没有名为 getFields 的方法.

声明

Base a;

...告诉编译器您将在使用 a 时使用的接口(interface).然后分配 new Agg(); 并不重要接口(interface) 你必须a还是Base .自 Base没有 getFields , 尝试使用 getFields是编译错误。

Base a=new Agg();

Does this line means a has the reference of Agg() and a can invoke directly the method of class Agg.

意思是a 包含Agg 的引用对象,但该对象的接口(interface)由 Base 定义, 不是 Agg , 所以你不能调用 Agg如果它们不是由 Base 定义的,则在其上使用方法(没有石膏,石膏是危险的,应尽可能避免)。

如果您的代码需要访问 Agg 定义的方法或字段,那么变量(或参数,在我的例子中)应该声明为 Agg a , 不是 Base a .

这是一般 OOP 的基础知识,尤其是 Java 中的 OOP 实现:对象的接口(interface)与对象的实现之间存在很大差异目的。在您的示例中,您知道 Base a真的是一个Agg ,但考虑一下:

void foo(Base a) {
// Use `a` here...
}

// A long time later in a class far, far away...
xyz.foo(new Agg());

很明显,编译器不允许您在 a 上使用方法或字段Base 未定义的.这与您的代码中的情况相同,只是不那么明显。

关于java - Java 面试后的反射(reflection) : Inheritance and polymorphism,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13199923/

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