SuperClass object = new SubClass();
为什么要使用超类来实例化上面的子类对象?因为我学习实例化对象的唯一方法是:
SubClass object = new SubClass();
我正在学习java。
答案 0 :(得分:15)
您可能拥有仅采用SuperClass
实例的方法。由于SubClass
是 SuperClass
,您可以使用SubClass
的实例并将其视为SuperClass
。
使用接口时使用相同的行为:
List someList = new ArrayList();
这就是多态的美。它允许您在不破坏代码的其余部分的情况下更改类内部的实现。
答案 1 :(得分:14)
这称为多态性。 想象一下以下示例:
Musician musician = new Pianist();
或
Musician musician = new Drummer();
假设Musician
类有一个方法:play()
。无论音乐家是谁,如果你称之为游戏方法,你就会知道如何演奏确定的乐器,基于具体的课程,在这种情况下,无论是钢琴家还是鼓手。
每个具体的类,覆盖其play()
方法,可以自己玩:
e.g。 Pianist
课程:play() { playsBeethoven(); }
有关详细信息,请查看http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html
记住将它与继承http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
一起使用总是好的答案 2 :(得分:6)
执行前者的主要原因是对期望超类的函数调用。如果您的班级A
有类似的方法
public static void insert(SuperClass b) {
//do something
}
你有
SuperClass object = new SubClass();
你可以做到
A.insert(object);
但如果你这样做
SubClass object new SubClass();
你做不到
A.insert(object);
除非你将这样的方法添加到A
public static void insert(SubClass b) {
//do something
}
这可以帮助您减少冗余或复制的代码并保持清洁。
答案 3 :(得分:1)
您所做的只是告诉JVM在编译时引用的类型是什么。
在第一种情况下,您说对象引用具有超类的静态类型。当您创建一个新的子类对象时,您可以将该引用指向它,因为它是一个子类IS-A超类实例。
答案 4 :(得分:0)
这是您使用继承的主要原因之一。您将SuperClass视为抽象,并且在编译时您不需要知道派生类型,或者另一个类不需要知道派生类型。这允许您在使用多态来调用派生类的方法时使用对SuperClass的引用。
这使您能够
a。)创建工厂,这样您就不需要在编译时知道类型,并且您有一些创建派生类型的运行时方法。想想COM,GStreamer,DirectShow,Glib等......
b。)通过仅暴露基类型引用来隐藏其他对象的复杂性,即使它们是派生类型的实例。考虑返回对象的方法或将对象引用作为参数。
c。)更多的可能性,但这些可能是你最相关的两种用途。