我想知道为什么允许有不同类型的对象引用?例如;
Animal cow = new Cow();
您能否举一个使用不同类型的对象引用有用的示例?
编辑:Cow extends Animal
我想知道为什么允许有不同类型的对象引用?例如;
Animal cow = new Cow();
您能否举一个使用不同类型的对象引用有用的示例?
编辑:Cow extends Animal
这是多态性和抽象的核心。例如,这意味着我可以写:
public void handleData(InputStream input) {
...
}
...并处理任何类型的输入流,无论是来自文件、网络、内存等。或者同样,如果你有 a List<String>
,你可以请求它的元素 0 而不管实现等。
将子类的实例视为超类的实例的能力称为Liskov 的替换原则。它允许松散耦合和代码重用。
另请阅读Java 教程的多态部分以获取更多信息。
这基本上是一个标准化的概念。
我们知道每一种动物都有一些共同的特征。让我们举个吃饭和睡觉的例子,但是每个动物可以有不同的吃饭或睡觉的方式......然后我们可以定义
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
}
}
这称为多态性,它是 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();
}
}
简而言之,这可以实现多态性。例如,您可以拥有多个从 Animal 派生的对象,并且所有对象的句柄都相似。
你可以有类似的东西:
Animal[] myAnimal = {new Cow(), new Dog(), new Cat()};
foreach (Animal animal in myAnimal)
animal.Feed();
然后必须在每个子类中覆盖 Feed() 方法。
顺便说一句,代码类似于 C#,但 Java 中的概念是相同的。
简单地说Cows
都是Animals
。所以 JAVA 明白,当 时Cow extends Animal
,牛也可以称为动物。
正如其他人指出的那样,这是多态性。您可以扩展Animal
并Dog
说 Dog 也是 Animal。
这是一个继承 101 问题。
它允许对共享通用功能的对象进行相同处理。
它还允许在运行时提供作为抽象类型子类的特定实现。
我可能会胡说八道很多年。也许这样的问题太宽泛了,无法在这里回答。
在另一个类/方法中,您可能希望使用同一接口的不同实现。按照你的例子,你可能有类似的东西:
public void feed( Animal animal ) {
animal.getHome().insertFood(animal.getFavFood());
}
现在您可以在您的动物类中实现细节,并且在您向程序中添加新动物时不必扩展此方法。
因此,在某些情况下,您需要公共接口以便不为每个实现实现一个方法,而在其他情况下,您将需要使用显式实现。