我目前正在通过AP CS考试学习指南,我已经了解了最新情况。假设我有一个名为Employee的类,我有另一个继承Employee的类叫做Manager。以下声明之间有区别吗?
Employee empl1 = new Manager();
Manager empl2 = new Manager();
我基本上对于对象名称之前的术语是什么以及它与新术语之后的术语有何不同感到困惑。任何帮助表示赞赏。
答案 0 :(得分:0)
左侧的表单是"界面",继承允许您将Manager
用作Employee
,因为Manager
is-a { {1}}。不同之处在于,将首先从Employee
来自Manager员工的方法调用,然后继承"继承"来自Manager
的行为。另一个区别是你打电话给Employee
。请考虑每个Java对象都继承自java.lang.Object,这就是您可以在任何对象上调用getClass().getName()
或toString()
的原因。
答案 1 :(得分:0)
empl1
和empl2
都是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)
在您的示例中,empl1
和empl2
都是变量,您可以将对象分配给它们。 empl1
变量可以包含任何类型的Employee
对象,但empl2
变量只能包含Manager
个对象。由于Manager
是一种Employee
,因此您可以将Manager
对象放入Employee
变量中。 new
调用告诉Java创建指定类型的新对象。
变量名称前面的类型称为声明的类型,此类型定义了其余代码可用的接口(API)。例如,您可以在getEmployeeId()
或empl1
上调用(假设的)empl2
方法,但只能在getManagerLevel()
上调用empl2
方法。
放入变量的实际对象的类型(在这两种情况下为Manager
)称为运行时类型,它可以是任何扩展或实现的类型声明的类型。 JVM负责将变量上的路由方法调用转换为运行时类型的正确代码。
答案 4 :(得分:0)
当您使用Super类类型的对象引用基类时,该对象只能访问基类的重写方法,或者只能访问这两个类共有的方法... 引用具有超类的基类对象是我们在java中所谓的虚方法调用...