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
    类型的变量