做以下事情的目的是什么:
Employee a = new OverTimeEmployee();
或
OverTimeEmployee a = new Employee();
OverTimeEmployee是员工的子类吗?
它的正确名称是什么?我猜混合构造函数不对
答案 0 :(得分:4)
它被称为对象继承。
这是面向对象编程的主要内容之一,还有Polymorphism。
所以在代码中:
class Employee {
...
}
class OverTimeEmployee extends Employee {
...
}
所以你可以这样做:
Employee a = new OverTimeEmployee();
是因为OverTimeEmployee
是Employee
的类型。
我不相信你能做你在第二个例子中所做的事情,因为并非所有Employee
都是OverTimeEmployee
,你会得到错误。
答案 1 :(得分:2)
Employee a = new OverTimeEmployee();
被称为“多态”。
多态性:“一个名称,多个形式”。
多态性是一种动作或方法根据它所作用的对象做不同事情的能力。
当OverTimeEmployee是Employee的子类,即OverTimeEmployee extends Employee
时,可以这样做。所以基本上,只有在图片中还有继承时才能使用它。多态性与方法重载一起使用。
原因:在多态性的情况下,实际的对象类型而不是引用类型用于确定要调用的方法的版本。方法在编译时绑定(与覆盖时的运行时相反)。
假设您在printDescription()
和OverTimeEmployee
(还有一个Employee的子类)中都有一个名为RegularEmployee
的方法。
在OverTimeEmployee类的方法中,表示您正在打印int overtimerate
,而RegularEmployee
表示您正在打印String perks
。
class OverTimeEmployee {
int overtimerate;
.
.
.
void printDescription() {
System.out.println("I am overtime employee with pay rate " + overtimerate);
}
}
class RegularEmployee {
String perks;
.
.
.
void printDescription() {
System.out.println("I am regular employee with perks " + perks);
}
}
然后你这样做:
OverTimeEmployee ot = new Employee(20); // initializing orvertimerate as 20
RegularEmployee rt = new Employee("Free parking"); // initializing perks as "Free parking"
ot.printDescription()
将打印
I am overtime employee with pay rate 20
rt.printDescription()
将打印
I am regular employee with perks Free parking
另请注意,OverTimeEmployee a = new Employee();
将无法编译,因为OverTimeEmployee是Employee的子类。
希望这会有所帮助。
答案 2 :(得分:1)
如果OverTimeEmployee
是Employee
的子类,则您无法执行OverTimeEmployee a = new Employee();
。那将无法编译。
Employee a = new OverTimeEmployee();
涉及面向对象编程和继承的核心。
答案 3 :(得分:1)
它可以用于多态,其中对象的运行时引用将决定调用哪个方法。因此,如果Employee和OverTimeEmployee都有一个依赖于收益的方法,并且在执行程序期间,Employee包含对OverTimeEmployee的引用,那么将调用OverTimeEmployee的收益方法。