创建子类(特定)或超类(通用)类型的对象?

时间:2012-10-10 11:40:57

标签: java coding-style

使用以下代码:

public class Animal {
   ....// class stuff here
}

public class Cat extends Animal {
   ....// class stuff here
}

尝试创建新的Cat对象时,有什么区别?:

    Cat myCat = new Cat(); //and
    Animal myCat = new Cat();

我之前读过的是你应该在左边声明最通用的列表(即

List<String> = new LinkedList<String>();)因此,如果您想要更改实现以使用ArrayList,则需要更改的代码更少。

在所有情况下,您是否应始终在laft上声明最通用(最不具体)(在本例中为Animal myCat = new Cat();)?

5 个答案:

答案 0 :(得分:2)

创建的内容没有区别。唯一的区别在于参考类型。如果您引用了Animal,并尝试使用不在Animal中的Cat方法,编译器将给出错误。如果你在Cat中调用一个被覆盖的方法(注意:与重载不同),它将正确调用Cat的方法,即使引用是Animal。

答案 1 :(得分:1)

最具体的相关。否则,所有变量都是Object

根据经验,如果您的逻辑需要调用特定于Cat的方法,那么您应该将变量声明为Cat。如果没有,那么如果您需要Animal的任何方法,那么它应该是Animal,依此类推。

答案 2 :(得分:1)

假设我们有以下代码

public class Animal {
  public void doSomething() {
       // ...
  }
}

public class Cat extends Animal {
  public void miau() {
       // ...
  }
}

差异是

Cat myCat1 = new Cat(); //and
Animal myCat2 = new Cat();
myCat1.miau(); //ok
myCat1.doSomething(); //ok
myCat2.miau(); // doesn't compile
myCat2.doSomething(); // ok

这取决于你应该使用哪一个。一个例子是一个列表。如果你知道你只把Cat放入这个列表中,请将其声明为:

ArrayList<Cat> list = new ArrayList<Cat>();

但如果你知道你把各种各样的动物放在那里,你需要做出如下声明

ArrayList<Animal> list = new ArrayList<Animal>();

您还可以执行以下操作:

ArrayList<Object> list = new ArrayList<Object>();

但这不是好的编码风格。因为如果您想调用miau之类的方法,首先需要检查要调用它的元素是否为Cat。然后你甚至需要施展它。

答案 3 :(得分:1)

之间的区别
Cat myCat = new Cat(); //and 
Animal myCat = new Cat();

是前者编程为具体实现,而后者编程为接口/超类型。

后一种方法是首选方法,因此实际的运行时对象不会绑定在您的代码中。 使用你的动物类的班级不必知道实际的动物物体(除了猫之外,它可以是相当大的数量)。

所以你可以做到 animal.makeSound()后者使你以多态方式引用动物(猫/任何其他动物)

答案 4 :(得分:0)

只是用 Layman的语言来解释,一切都取决于你想要什么,我会给出一个非常简单的例子,因为其余的解释你可以从我提供的链接中获得..

  • 假设您想要计算篮子里有多少猫,那么当然你不能选择第二种情况......你必须创建一个List<Cat>并存储Cat引用它们..因为Animal引用也可以指向Dog对吗?因此,List<Animal>可以容纳Dog ..所以,你可能无法获得正确的猫数......或者,你可以得到,但还有一点点工作......

  • 如果您只想获得有关Animal的信息,例如您拥有的各种类型的动物,您可以愉快地使用第一个动物。使用{创建一个对象{1}}参考..这可以容纳你所有的动物..