gpt4 book ai didi

java - 创建对象时声明基类/接口(interface)或实现?

转载 作者:行者123 更新时间:2023-11-30 02:45:40 24 4
gpt4 key购买 nike

我有这个问题。假设代码 1 是具有运行时多态性的 Java,代码 2 是不具有运行时多态性的 Java

代码1:

class A {
void run() { System.out.println("A is running"); }
}

class B extends A{
void run(){ System.out.println("B is running with A!");}

public static void main(String args[]){

A a = new B(); //referenced to class A
a.run();

}
}

代码2:

class A {
void run(){System.out.println("A is running");}
}

class B extends A{
void run(){ System.out.println("B is running with A!");}

public static void main(String args[]){
B a = new B(); //referenced to the same constructor class
a.run();
}
}

尽管这两个代码给出了完全相同的结果,但众所周知,运行时多态性在 OOP 中非常重要。我需要使用代码 1 而不是使用代码 2 的解释/原因。

最佳答案

在 OOP 中,并非在所有情况下都需要利用多态性。
多态性是一种在需要灵 active 时带来灵 active 的机制。

例如,在您的情况下,编写:

B a = new B();

A a = new B()

取决于您是否需要并且有兴趣引用基类而不是子类作为变量的声明类型。

引用基类(此处为A)可以实现其中的许多功能(它不是详尽的,但是常见的用例):

  • 屏蔽实现(通过工厂或注入(inject)依赖)。通过这种方式,您可以更改实现(返回扩展 ACD),而无需中断客户端代码的调用。在您的代码中,您不会执行此操作,但在实际应用程序中您可能有此需求。
  • 如果您有 AB 类的通用处理,您可以提出一种将 A 类型的实例作为参数的方法。示例:public void doProcess(A实例)
    在这种情况下,如果声明 B a = new B(),代码将无法编译如果您按照语义将此实例传递给该方法,则 B 实例是 A,但 A 实例不是必然是B

通常,我们可以看到声明接口(interface)而不是实现是一种很好的做法。事实上,在大多数情况下是这样,但在其他一些情况下却不是。仅举一个例子,如果您需要使用 TreeMap,您将不会声明接口(interface) Map,因为 TreeMap 的行为非常具体并且具有特殊要求,所以你可能要强调一下。当您实例化经典的 HashMap 时,通常您并不关心将 HashMap 作为声明的类型,因为它的接口(interface)就足够了。您没有兴趣与实现建立更强的耦合。

关于java - 创建对象时声明基类/接口(interface)或实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40280942/

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