4

我想知道为什么允许有不同类型的对象引用?例如;

Animal cow = new Cow();

您能否举一个使用不同类型的对象引用有用的示例?

编辑:Cow extends Animal

4

7 回答 7

10

这是多态性和抽象的核心。例如,这意味着我可以写:

public void handleData(InputStream input) {
    ...
}

...并处理任何类型的输入流,无论是来自文件、网络、内存等。或者同样,如果你有 a List<String>,你可以请求它的元素 0 而不管实现等。

将子类的实例视为超类的实例的能力称为Liskov 的替换原则。它允许松散耦合和代码重用。

另请阅读Java 教程的多态部分以获取更多信息。

于 2012-11-30T07:35:30.320 回答
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
       }
  }
于 2012-11-30T07:57:58.367 回答
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();
    }
}
于 2012-11-30T07:43:47.543 回答
2

简而言之,这可以实现多态性。例如,您可以拥有多个从 Animal 派生的对象,并且所有对象的句柄都相似。

你可以有类似的东西:

Animal[] myAnimal = {new Cow(), new Dog(), new Cat()};

foreach (Animal animal in myAnimal)
   animal.Feed();

然后必须在每个子类中覆盖 Feed() 方法。

顺便说一句,代码类似于 C#,但 Java 中的概念是相同的。

于 2012-11-30T07:44:36.427 回答
1

简单地说Cows都是Animals。所以 JAVA 明白,当 时Cow extends Animal,牛也可以称为动物。

正如其他人指出的那样,这是多态性。您可以扩展AnimalDog说 Dog 也是 Animal。

于 2012-11-30T07:40:20.210 回答
1

这是一个继承 101 问题。

它允许对共享通用功能的对象进行相同处理。
它还允许在运行时提供作为抽象类型子类的特定实现。

我可能会胡说八道很多年。也许这样的问题太宽泛了,无法在这里回答。

于 2012-11-30T07:40:44.423 回答
1

在另一个类/方法中,您可能希望使用同一接口的不同实现。按照你的例子,你可能有类似的东西:

public void feed( Animal animal ) {   
  animal.getHome().insertFood(animal.getFavFood());
}

现在您可以在您的动物类中实现细节,并且在您向程序中添加新动物时不必扩展此方法。

因此,在某些情况下,您需要公共接口以便不为每个实现实现一个方法,而在其他情况下,您将需要使用显式实现。

于 2012-11-30T07:37:02.653 回答