与Java继承混淆

时间:2014-03-26 23:14:31

标签: java inheritance

我目前正在通过AP CS考试学习指南,我已经了解了最新情况。假设我有一个名为Employee的类,我有另一个继承Employee的类叫做Manager。以下声明之间有区别吗?

Employee empl1 = new Manager();
Manager empl2 = new Manager();

我基本上对于对象名称之前的术语是什么以及它与新术语之后的术语有何不同感到困惑。任何帮助表示赞赏。

5 个答案:

答案 0 :(得分:0)

左侧的表单是"界面",继承允许您将Manager用作Employee,因为Manager is-a { {1}}。不同之处在于,将首先从Employee来自Manager员工的方法调用,然后继承"继承"来自Manager的行为。另一个区别是你打电话给Employee。请考虑每个Java对象都继承自java.lang.Object,这就是您可以在任何对象上调用getClass().getName()toString()的原因。

答案 1 :(得分:0)

empl1empl2都是Manager个对象。区别在于如何在方法的其余部分中使用变量。

您已声明empl1可以是Employee,或者是Employee的子类(包括Manager)的任何对象。任何时候在程序中使用empl1,编译器都不会知道它实际上是Manager,只是它是某种Employee。因此,如果Manager包含Employee没有的任何新方法,则无法在empl1上使用它们。但是,您可以将empl1重新指定为任何其他Employee,以便稍后您可以说出类似

的内容
empl1 = new Employee(...some data...);
empl1 = new Intern(...some data...);
empl1 = new Accountant(...some data...);

等。您不能使用empl2来执行此操作,Manager仅限于Manager(或{{1}}的任何子类,如果有的话)。

答案 2 :(得分:0)

名称前面的部分是您正在创建的对象的引用的类型。在右侧,在new之后,您正在调用一个特定类的构造函数(在您的示例中为类Manager)。

你可以写

Employee empl1 = new Manager();
Employee empl2 = new Consultant();
Employee empl3 = new Officer();
Employee empl4 = new Secretary();

因为您在那里创建的所有对象都是 Employees 。但是,你不能写

Manager manager = new Secretary();

因为秘书不是经理。

引用的类型(即名称前面的术语)确定您可以使用此引用调用哪些方法。例如,你可以写

Manager manager = new Manager();
manager.doSomethingThatOnlyManagersCanDo();

但你可以

Employee employee = new Manager();
emplyoee.doSomethingThatOnlyManagersCanDo();

因为您只知道对象是员工,但不是经理。 (它是一名经理,但你不知道,因为该参考只告诉你它是一名雇员)

答案 3 :(得分:0)

在您的示例中,empl1empl2都是变量,您可以将对象分配给它们。 empl1变量可以包含任何类型的Employee对象,但empl2变量只能包含Manager个对象。由于Manager是一种Employee,因此您可以将Manager对象放入Employee变量中。 new调用告诉Java创建指定类型的新对象。

变量名称前面的类型称为声明的类型,此类型定义了其余代码可用的接口(API)。例如,您可以在getEmployeeId()empl1上调用(假设的)empl2方法,但只能在getManagerLevel()上调用empl2方法。

放入变量的实际对象的类型(在这两种情况下为Manager)称为运行时类型,它可以是任何扩展或实现的类型声明的类型。 JVM负责将变量上的路由方法调用转换为运行时类型的正确代码。

答案 4 :(得分:0)

当您使用Super类类型的对象引用基类时,该对象只能访问基类的重写方法,或者只能访问这两个类共有的方法... 引用具有超类的基类对象是我们在java中所谓的虚方法调用...