#java
#java
Вопрос:
Какова цель выполнения чего-то вроде:
Employee a = new OverTimeEmployee();
или
OverTimeEmployee a = new Employee();
Где OverTimeEmployee является подклассом employee?
и каково правильное название для этого? Я предполагаю, что смешанный конструктор неправильный
Комментарии:
1. спасибо всем за полезные и быстрые ответы!
2.
OverTimeEmployee a = new Employee();
«Где OverTimeEmployee является подклассом employee?» — Это не будет компилироваться.3. @Michael, это то, что я указал в своем ответе
Ответ №1:
Это называется наследованием объектов.
Это одна из основных функций объектно-ориентированного программирования, наряду с полиморфизмом .
Итак, в коде:
class Employee {
...
}
class OverTimeEmployee extends Employee {
...
}
Итак, причина, по которой вы можете это сделать:
Employee a = new OverTimeEmployee();
потому что OverTimeEmployee
это тип Employee
.
Я не верю, что вы можете сделать то, что вы сделали во втором примере, потому что не все Employee
являются OverTimeEmployee
, и вы получите ошибку.
Комментарии:
1. Хм, может быть, полиморфизм ( en.wikipedia.org/wiki / … ) также следует упомянуть здесь.
Ответ №2:
Employee a = new OverTimeEmployee();
называется «Полиморфизм».
Полиморфизм: «Одно имя, несколько форм».
Полиморфизм — это способность действия или метода выполнять разные действия на основе объекта, на который оно воздействует.
Это может быть сделано, когда OverTimeEmployee является подклассом Employee, т. Е. OverTimeEmployee extends Employee
. Таким образом, в принципе, вы можете использовать его только тогда, когда в picture также есть наследование. Полиморфизм используется при перегрузке метода.
Причина: В случае полиморфизма для определения, какую версию метода вызывать, используется фактический тип объекта, а не ссылочный тип. Методы привязываются во время компиляции (в отличие от среды выполнения в случае переопределения).
Предположим, у вас есть метод, вызываемый printDescription()
как в OverTimeEmployee
, так и в say RegularEmployee
(еще один подкласс Employee). В методе класса 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.
Надеюсь, это поможет.
Ответ №3:
Если OverTimeEmployee
это подкласс Employee
, то вы не можете сделать OverTimeEmployee a = new Employee();
. Это не будет компилироваться.
Employee a = new OverTimeEmployee();
проникает в суть объектно-ориентированного программирования и наследования.
Ответ №4:
Его можно использовать для полиморфизма, где ссылка во время выполнения на объект будет определять, какой метод будет вызван. Итак, если и у Employee, и у OverTimeEmployee есть зависящий метод заработка, и во время выполнения программы Employee содержит ссылку на OverTimeEmployee, тогда будет вызван метод заработка OverTimeEmployee.