Какова цель смешанных конструкторов?

#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.