使用超类初始化子类对象java

问题描述:

SuperClass object = new SubClass(); 

为什么要使用超类来实例化一个像上面那样的子类对象?因为我学会实例化对象的唯一方法是:使用超类初始化子类对象java

SubClass object = new SubClass(); 

我正在学习java。

您可能有一种方法只需要一个SuperClass的实例。由于​​SuperClass,因此您可以使用​​的实例并将其视为SuperClass。与界面时

同样的行为用于:

List someList = new ArrayList(); 

这是多态的美。它允许你在不破坏代码的其余部分的情况下更改类内部的实现。

+4

这里的关键一点是,'SubClass' * *是一个'SuperClass'。 – 2012-04-16 15:59:11

+0

在Java 8中这种行为是否改变了?我只是测试,其中一个方法接受超参数'无效方法(父类PARAM)的情况下'但是我能够把一个子类的实例'子类子=新的子类();'当我把它称为,如'方法(分);'。这意味着现在允许向上兼容? – 2016-12-02 02:16:36

您所做的只是告诉JVM编译时引用的类型。

在第一种情况下,您说对象引用具有超类的静态类型。当你创建一个新的子类对象时,你可以拥有该引用点,因为它是一个子类IS-A的超类实例。

做前者的主要原因是期望超类的函数调用。如果你有一个类A有这样

public static void insert(SuperClass b) { 
    //do something 
} 

的方法,你有

SuperClass object = new SubClass(); 

你可以做

A.insert(object); 

但是,如果你

SubClass object new SubClass(); 

你不能做

A.insert(object); 

,除非你喜欢这个方法添加到一个

public static void insert(SubClass b) { 
    //do something 
} 

这可以帮助你减少对多余的或复制的代码,并保持清洁的东西。

这被称为多态性。 想象以下示例:

Musician musician = new Pianist(); 

Musician musician = new Drummer(); 

假设Musician类有一个方法:play()。无论是音乐家是谁,如果你打电话播放方法,你就会知道如何演奏确定的乐器,基于具体的课堂,在这种情况下,无论是钢琴家还是鼓手。

每个具体类,并覆盖其play()方法,可以对自己的发挥:

例如为Pianist类:play() { playsBeethoven(); }

有关详细信息,请http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html

这是一件好事,记得要与继承http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

也就是说你使用继承的主要原因之一使用它。你对待超类的抽象,并在编译的时候你不需要知道派生类型,或其他类不需要知道派生类型。这允许您在使用多态性调用派生类的方法时使用对SuperClass的引用。

这使您可以

一)建立工厂,这样你就不需要知道在编译时的类型,你必须创建派生类型的一些运行方式。想想COM,GStreamer的,DirectShow的,油腔滑调,等...

湾)仅暴露,即使它们是派生类型的实例的基本类型的引用隐藏的复杂性对其他对象。考虑返回对象或将对象引用作为参数的方法。

角)更多的可能性,但这些可能是最相关的两种用法你。