为什么Java中允许不同类型的对象引用?

时间:2012-11-30 07:33:09

标签: java oop polymorphism

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

Animal cow = new Cow();

请举例说明使用不同类型的对象引用是否有用?

修改 Cow extends Animal

7 个答案:

答案 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问题。

它允许对具有共同功能的对象进行相同的处理 它还允许在运行时提供特定的实现,这些实现是抽象类型的子类。

我可能会絮絮叨叨多年。或许这个问题太宽泛了,无法在这里回答。