我想知道为什么允许它有不同类型的对象引用? 例如;
Animal cow = new Cow();
请举例说明使用不同类型的对象引用是否有用?
修改 Cow extends Animal
答案 0 :(得分:10)
这是多态性和抽象的核心。例如,这意味着我可以写:
public void handleData(InputStream input) {
...
}
...并处理任何类型的输入流,无论是来自文件,网络,内存等。或者同样,如果你有一个List<String>
,你无论实现如何,都可以询问它的元素0。
将子类的实例视为超类的实例的能力称为Liskov's Substitution Principle。它允许松耦合和代码重用。
另请阅读Polymorphism part of the Java tutorial以获取更多信息。
答案 1 :(得分:2)
这称为多态,它是Java最强大的方面之一。
多态性允许您将不同的对象视为相同。
这是创建可重用,灵活的代码的好方法。
不幸的是,新程序员通常需要一段时间才能理解它是Java的一部分。
您提供的示例涉及继承(扩展类)。
享受多态性好处的另一种方法是使用接口。
实现相同接口的不同类可以被视为相同:
class Dog extends Animal implements Talker {
public void speak() {
System.out.println("Woof woof");
}
}
class Programmer implements Talker {
public void speak() {
System.out.println("Polymorphism rocks!");
}
}
interface Talker {
public void speak();
}
public static void testIt() {
List<Talker> talkerList = new ArrayList<Talker>();
talkerList.add(new Dog());
talkerList.add(new Programmer());
for (Talker t : talkerList) {
t.speak();
}
}
答案 2 :(得分:2)
更简单地说,这可以实现多态性。例如,您可以拥有几个派生自Animal的对象,并且所有对象都处理类似。
你可以拥有类似的东西:
Animal[] myAnimal = {new Cow(), new Dog(), new Cat()};
foreach (Animal animal in myAnimal)
animal.Feed();
然后必须在每个子类中覆盖Feed()方法。
顺便说一句,代码类似于C#,但Java中的概念是相同的。
答案 3 :(得分:2)
这基本上是标准化的概念。
我们知道每种动物都有一些共同的特征。让我们举一个吃饭和睡觉的例子,但每只动物可以有不同的吃饭或睡觉方式...然后我们可以定义
public abstract class Animal
{
public abstract void Eat();
public abstract void Sleep();
}
//Now Define them in various classes..
public class Cow extends Animal
{
pubic void Eat()
{
//process of eating grass
}
public void Sleep()
{
//process of sleeping
}
}
public class Lion extends Animal
{
public void Eat()
{
//process of eating flesh
}
public void Sleep()
{
//process of sleep
}
}
现在您不必为不同的类定义不同的对象......只需使用Animal并通常调用
public class MyClass
{
public static void main(String[] args)
{
Animal _animal = new //think the type of animal is coming dynamically
//you can simply call
_animal.Eat();
_animal.Sleep();
// irrespective of checking that what can be the animal type, it also reduces many if else
}
}
答案 4 :(得分:1)
在另一个类/方法中,您可能希望使用同一接口的不同实现。按照您的示例,您可能会有类似的内容:
public void feed( Animal animal ) {
animal.getHome().insertFood(animal.getFavFood());
}
现在,您可以在动物类中实现详细信息,并且无需在将新动物添加到程序时随时扩展此方法。
因此,在某些情况下,您需要通用接口以便不为每个实现实现方法,而在其他情况下,您将需要使用显式实现。
答案 5 :(得分:1)
简单地将所有Cows
设为Animals
。所以JAVA明白,当Cow extends Animal
时,一头牛也可以被称为动物。
正如其他人所指出的,这是多态性。您可以使用Animal
扩展Dog
,并说Dog也是动物。
答案 6 :(得分:1)
这是继承101问题。
它允许对具有共同功能的对象进行相同的处理 它还允许在运行时提供特定的实现,这些实现是抽象类型的子类。
我可能会絮絮叨叨多年。或许这个问题太宽泛了,无法在这里回答。