Пояснення спадщини на Java

Спадщина

Спадщина Java відноситься до здатності класу Java до inheritвластивостей іншого класу. Думайте про це як про дитину, яка успадковує властивості від батьків, концепція дуже схожа на це. У мові Java це також називається розширенням -ing класу.

Кілька простих речей, які слід пам’ятати:

  • Клас, який розширюється або успадковується, називається підкласом
  • Клас, який розширюється або успадковується, називається суперкласом

Таким чином, успадкування надає Java прохолодну можливість повторного використання коду або спільного використання коду між класами!

Опишемо це на класичному прикладі Vehicleкласу та Carкласу:

public class Vehicle { public void start() { // starting the engine } public void stop() { // stopping the engine } } public class Car extends Vehicle { int numberOfSeats = 4; public int getNumberOfSeats() { return numberOfSeats; } }

Тут ми можемо побачити Carклас, який успадковує властивості Vehicleкласу. Отже, нам не потрібно писати однаковий код для методів, start()а також stop()для Car, оскільки ці властивості доступні у його батьківського або суперкласу. Тому об’єкти, створені з Carкласу, також матимуть ці властивості!

Car tesla = new Car(); tesla.start(); tesla.stop();

Запустити код

Але, чи є в батьківському класі методи дитини? Ні, це не так.

Тому, коли вам потрібно надати спільний фрагмент коду між кількома класами, завжди добре мати батьківський клас, а потім розширити цей клас, коли це потрібно! Зменшує кількість рядків коду, робить код модульним та спрощує тестування.

Що можна успадкувати?

  • Всі protectedта publicполя та методи від батьківського

Що не можна успадкувати?

  • private поля та методи
  • Конструктори. Хоча, конструктор підкласу повинен викликати конструктор суперкласу , якщо його визначити (Детальніше про це пізніше!)
  • Кілька класів. Java підтримує лише одне успадкування , тобто за один раз ви можете успадкувати лише один клас.
  • Поля. Окремі поля класу не можуть бути замінені підкласом.

Тип кастингу та довідка

У Java можна посилатися на підклас як на екземпляр його суперкласу. Це називається поліморфізмом в об'єктно-орієнтованому програмуванні (ООП), здатністю об'єкта набувати різних форм. Наприклад, на Carоб’єкт класу можна посилатись як на Vehicleекземпляр класу, наприклад:

Vehicle car = new Car();

Хоча навпаки неможливо:

Car car = new Vehicle(); // ERROR

Запустити код

Оскільки ви можете посилатися на підклас Java як на екземпляр суперкласу, ви можете легко передати екземпляр об’єкта підкласу на екземпляр суперкласу. Можна прив’язати об’єкт суперкласу до типу підкласу, але лише якщо об’єкт справді є екземпляром підкласу . Тож майте це на увазі:

Car car = new Car(); Vehicle vehicle = car; // upcasting Car car2 = (Car)vechile; //downcasting Bike bike = new Bike(); // say Bike is also a subclass of Vehicle Vehicle v = bike; // upcasting, no problem here. Car car3 = (Car)bike; // Compilation Error : as bike is NOT a instance of Car

Запустити код

Тепер ви знаєте, як ділитися кодом через стосунки батьків та дітей. Але що, якщо вам не подобається реалізація певного методу в дочірньому класі і ви хочете написати для нього новий? Що ти тоді робиш?

Перевизначте це!

Java дозволяє замінити або перевизначити методи, визначені у суперкласі. Наприклад, ваш Carклас має іншу реалізацію, start()ніж батьківська Vehicle, тому ви робите це:

public class Vehicle { public void start() { System.out.println("Vehicle start code"); } } public class Car extends Vehicle { public void start() { System.out.println("Car start code"); } } Car car = new Car(); car.start(); // "Car start code"

Запустити код

Отже, досить просто замінити методи в підкласі. Хоча, є і підводка . Буде замінено лише той метод суперкласу з точно такою ж сигнатурою методу , що і метод підкласу. Це означає, що визначення методу підкласу повинно мати однакову назву, однакову кількість і тип параметрів і в точно такій же послідовності. Таким чином, public void start(String key)не перевизначить public void start().

Примітки :

  • Ви не можете замінити приватні методи суперкласу. (Цілком очевидно, чи не так?)
  • Що робити, якщо метод суперкласу, який ви замінюєте в підкласі, раптом видаляється або методи змінюються? Це не вдалося б під час виконання! Отже, Java надає вам чудову анотацію, @Overrideяку ви можете розмістити над методом підкласу, що попередить компілятор про ці випадки!

Анотації на Java - хороша практика кодування, але вони не є необхідністю. Компілятор достатньо розумний, щоб самостійно розібратися з перевизначенням. На відміну від інших мов ООП, Анотації на Java не обов'язково модифікують метод або додають додаткову функціональність.

Як викликати методи суперкласу?

Смішно ви про це питаєте! Просто використовуйте ключове слово super:

public class Vehicle() { public void start() { System.out.println("Vehicle start code"); } } public class Car extends Vehicle { public void run() { super.start(); } } Car car = new Car(); car.run(); // "Vehicle start code"

Запустити код

Примітка . Хоча ви можете викликати батьківський метод, використовуючиsuperвиклик, ви не можете піднятись по ієрархії успадкування за допомогою ланцюговихsuperвикликів.

Як дізнатися тип класу?

Using the instanceof keyword. Having lots of classes and subclasses it would be a little confusing to know which class is a subclass of which one in runtime. So, we can use instanceof to determine whether an object is an instance of a class, an instance of a subclass, or an instance of an interface.

Car car = new Car(); boolean flag = car instanceof Vehicle; // true in this case!

Constructors & Inheritance

As mentioned earlier, constructors cannot be directly inherited by a subclass. Although, a subclass is required to call its parent’s constructor as the first operation in its own constructor. How? You guessed it, using super :

public class Vehicle { public Vehicle() { // constructor } public void start() { System.out.println("Vehicle start code"); } } public class Car extends Vehicle { public Car() { super(); } public void run() { super.start(); } }

Run Code

Remember, if the superclass does not have any constructors defined, you don’t have to call it explicitely in the subclass. Java handles that internally for you! Invocation to super constructor is done in the case when the super class is to be called with any other constructor other than the default constructor.

If no other constructors are defined, then Java invokes the default super class constructor (even if not defined explicitly).

Congrats, now you know all about Inheritance! Read more about advanced ways to inherit things in Abstract Classes and Interfaces!