Java 当类有接口和抽象超类时,我应该用什么声明我的对象?
比如我有Java 当类有接口和抽象超类时,我应该用什么声明我的对象?,java,Java,比如我有 class Louie extends Chinese abstract class Chinese implements Human interface Human 我应该宣布路易·奥克塔为人类、中国人还是仅仅路易 我还注意到,对象变量的作用域不同。例如,如果我有一个中文名字变量和一个Louie名字变量,Louie对象可以声明为Human、Chinese或just Louie。将是您的选择,取决于您的要求。 这就是多态性的形式 因此,Louie对象可以采用任何形式,如Human
class Louie extends Chinese
abstract class Chinese implements Human
interface Human
我应该宣布路易·奥克塔为人类、中国人还是仅仅路易
我还注意到,对象变量的作用域不同。例如,如果我有一个中文名字变量和一个Louie名字变量,Louie对象可以声明为Human、Chinese或just Louie。将是您的选择,取决于您的要求。 这就是多态性的形式
因此,Louie对象可以采用任何形式,如Human、Chinese或Louie,但该对象的范围将受到您将其映射到的类型的限制。它取决于您要对该项执行的操作 如果接口有一个方法
IA()
,抽象超类有方法B()
,并且Louie类有和方法C()
的实现,那么:
如果您只需要使用方法IA()
我会:
Human h = new Louie();
Chinese c = new Louie();
Louie l = new Louie();
如果您需要使用B()
我会:
Human h = new Louie();
Chinese c = new Louie();
Louie l = new Louie();
如果我需要C()
,我也会这样做:
Human h = new Louie();
Chinese c = new Louie();
Louie l = new Louie();
背后的原因是,每个人都清楚我需要从这个例子中得到什么。另外,在方法中,当我得到Louie类时,它又取决于我得到它的上下文。如果我把Louie作为一种处理或需要处理所有人的方法,我会签名为:
public void DealWithHuman(Human h)
{
}
等等这一切都取决于上下文
我应该将Louie objecta声明为人类、中国人还是仅仅是Louie?
简单的答案是肯定的 但请注意 1.如果您将Louie objecta声明为人类,则只允许使用人类行为 2.如果您将Louie objecta声明为中文,则只允许使用中文和人类行为 3.如果您将Louie objecta声明为Louie,则允许您使用所有的
中文
、人类
和Louie
行为
因此,这完全取决于您的需求。超级类型的变量可以保存子类型的引用 这意味着:
Human h = new Louie();
Chinese c = new Louie();
Louie lui = new Louie();
都是有效的。但是:
h
只能访问Human
界面中声明的方法/字段c
可以访问Human
界面中的方法/字段以及Chinese
类lui
可以访问Human
界面、Chinese
类和Louie
类中的方法/字段Human
接口方法感兴趣,然后创建Human
类型的变量