在处理继承时识别java对象的类型

时间:2016-04-26 23:55:01

标签: java inheritance

我有4节课,如下所示。

public abstract class TennisPlayer{...}
public class GoodPlayer extends TennisPlayer{...}
public class WeakPlayer extends TennisPlayer{...}
public class Beginner extends WeakPlayer{...}

我还获得了3个声明,如下所示。

TennisPlayer g = new GoodPlayer("Sam");
TennisPlayer w = new WeakPlayer("Harry");
TennisPlayer b = new Beginner("Dick");

所以我的问题是上面创建的每个对象的类型是什么?为什么?例如,第一个声明,Sam会输入GoodPlayer还是输入TennisPlayer?

3 个答案:

答案 0 :(得分:1)

g的类型为GoodPlayer - 您可以通过运行g.getClass()来找到这个,这会给您GoodPlayer.class。但是这里声明的类型是TennisPlayer,这意味着你只能调用在TennisPlayer类或超类上声明的方法。

答案 1 :(得分:1)

在这种情况下,Sam将成为GoodPlayer类型。您可以初始化变量,然后使用该对象的子实例进行实例化。您也可以使用接口执行此操作,例如,您可以执行Map sampleMap = new HashMap();您可以使用instanceOf方法验证此

    if (g instanceof GoodPlayer) {
        System.out.println("Sam is a GoodPlayer");
    }

答案 2 :(得分:0)

由于GoodPlayer,WeakPlayer和Beginner类扩展了Tennisplayer类,它们都继承了TennisPlayer类的属性。因此,当您实例化一个变量,如...

Tennisplayer g = new GoodPlayer("Sam") ;

"萨姆"是GoodPlayer类型,但继承了TennisPlayer类的属性。

由于可以有这么多类型的网球运动员,我们可以创建子类来扩展TennisPlayer类。但是,所有网球运动员都会有一些相同的属性,例如身高。因此,我们将在TennisPlayer类中为高度定义一个变量,并且每个子类都能够实现该变量。我们可以为子类创建一些独有的属性。例如,GoodPlayer可能具有对WeakPlayer或初学者没有意义的属性。

这只是多态性。如果您使用Google" Java多态性"。

,您可以找到大量信息