CodeGym/Java блог/Случаен/Конкретни примери за абстрактни класове в Java
John Squirrels
Ниво
San Francisco

Конкретни примери за абстрактни класове в Java

Публикувано в групата
здрасти В минали уроци се запознахме с интерфейсите и разбрахме за Howво служат. Днешната тема ще повтори предишната. Нека поговорим за абстрактни класове в Java. Конкретни примери за абстрактни класове в Java - 1

Защо класовете се наричат ​​„абстрактни“

Вероятно си спомняте Howво е „абстракция“ — вече го разгледахме. :) Ако сте забравor, не се страхувайте. Запомнете: това е принцип на ООП, който казва, че когато проектираме класове и създаваме обекти, трябва да идентифицираме само основните свойства на обекта и да отхвърлим второстепенните. Например, ако проектираме SchoolTeacherклас, едва ли се нуждаем от свойството " height ". Всъщност това свойство е без meaning за един учител. Но ако създаваме BasketballPlayerклас, тогава растежът би бил важна характеристика. Така че слушайте. Абстрактен класе толкова абстрактен, колкото идват - незавършена "заготовка" за група бъдещи класове. Заготовката не може да се използва такава, Howвато е. Твърде "сурово" е. Но той описва определено състояние и общо поведение, което ще бъде притежавано от бъдещи класове, които наследяват абстрактния клас.

Примери за абстрактни Java класове

Помислете за прост пример с автомобor:
public abstract class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public abstract void gas();

   public abstract void brake();

   public String getModel() {
       return model;
   }

   public void setModel(String model) {
       this.model = model;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getMaxSpeed() {
       return maxSpeed;
   }

   public void setMaxSpeed(int maxSpeed) {
       this.maxSpeed = maxSpeed;
   }
}
Ето How изглежда най-простият абстрактен клас. Както виждате, не е нищо особено :) Защо ни трябва? На първо място, той описва търсеното от нас същество, автомобил, по възможно най-абстрактен начин. Има причина да използваме думата абстрактно . В реалния свят няма „абстрактни автомобor“. Има камиони, състезателни коли, седани, купета и SUV. Нашият абстрактен клас е просто „план“, който ще използваме по-късно, за да създадем класове автомобor.
public class Sedan extends Car {

   @Override
   public void gas() {
       System.out.println("The sedan is accelerating!");
   }

   @Override
   public void brake() {
       System.out.println("The sedan is slowing down!");
   }

}
Това е много подобно на това, за което говорихме в уроците по наследство. Но в тези уроци имахме клас Car и неговите методи не бяха абстрактни. Но това решение има редица недостатъци, които са фиксирани в абстрактни класове. Първо и най-важно, не можете да създадете екземпляр на абстрактен клас :
public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Error! The Car class is abstract!
   }
}
Създателите на Java специално са проектирали тази „функция“. Още веднъж, като напомняне: абстрактен клас е просто план за бъдещи „нормални“ класове . Не се нуждаете от копия на плана, нали? И вие не създавате екземпляри на абстрактен клас :) Но ако класът Carне беше абстрактен, лесно бихме могли да създадем негови екземпляри:
public class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public void gas() {
       // Some logic
   }

    public void brake() {
       // Some logic
   }
}


public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Everything is fine. A car is created.
   }
}
Сега нашата програма има няHowва неразбираема кола - това не е камион, не е състезателна кола, не е седан и е напълно неясно Howво е това. Това е самата „абстрактна кола“, която не съществува в природата. Можем да предоставим същия пример, използвайки животни. Представете си Animalкласове ( абстрактни животни ). Не е ясно Howъв вид животно е, към кое семейство принадлежи и Howви характеристики има. Би било странно да видите това във вашата програма. В природата няма „абстрактни животни“. Само кучета, котки, лисици, къртици и т.н. Абстрактните класове ни освобождават от абстрактни обекти. Те ни дават основно състояние и поведение. Например, всички автомобor трябва да имат модел , цвят и максимална скорост и трябва да можете да прилагатегаз и спирачка . Това е. Това е общ абстрактен план. След това проектирате класовете, от които се нуждаете. Забележка: два метода в абстрактния клас също са обозначени като abstract и те нямат ниHowва реализация. Причината е същата: абстрактните класове не създават поведение по подразбиране за абстрактни коли. Те просто показват Howво трябва да може да прави всяка кола. Въпреки това, ако имате нужда от поведение по подразбиране, можете да имплементирате методи в абстрактен клас. Java не забранява това:
public abstract class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public void gas() {
       System.out.println("Gas!");
   }

   public abstract void brake();

   // Getters and setters
}


public class Sedan extends Car {

   @Override
   public void brake() {
       System.out.println("The sedan is slowing down!");
   }

}

public class Main {

   public static void main(String[] args) {

       Sedan sedan = new Sedan();
       sedan.gas();
   }
}
Изход от конзолата: „Газ!" Както можете да видите, внедрихме първия метод в абстрактния клас, а не втория. В резултат на това Sedanповедението на нашия клас е разделено на две части: ако извикате метода gas(), извикването "се издига" до Carабстрактния родителски клас, но ние отменихме brake()метода в Sedanкласа. Това се оказа много удобно и гъвкаво. Но сега нашият клас не е толкова абстрактен ? В края на краищата половината от неговите методи са имплементирани. Това всъщност е много важна характеристика - един клас е абстрактен, ако поне един от методите му е абстрактен. Един от двата метода or поне един от хиляда метода - няма meaning. Можем дори да приложим всички методи и да не оставим нито един от тях абстрактен. Тогава това би бил абстрактен клас без абстрактни методи. По принцип това е възможно и компилаторът няма да генерира грешки, но е по-добре да го избягвате: думата abstract губи meaningто си и вашите колеги програмисти ще бъдат много изненадани :/ В същото време, ако методът е маркиран с думата abstract, всеки дъщерен клас трябва да го имплементира or да го декларира като abstract. В противен случай компилаторът ще генерира грешка. Разбира се, всеки клас може да наследи само един абстрактен клас, така че по отношение на наследяването няма разлика между абстрактните и обикновените класове. Няма meaning дали наследяваме абстрактен клас or обикновен, може да има само един родителски клас.

Защо Java няма множествено наследяване на класове

Вече казахме, че Java няма множествено наследяване, но всъщност не сме проучor защо. Нека се опитаме да направим това сега. Факт е, че ако Java имаше множествено наследяване, дъщерните класове не биха могли да решат кое конкретно поведение да изберат. Да предположим, че имаме два класа — Toasterи NuclearBomb:
public class Toaster {


 public void on() {

       System.out.println("The toaster is on. Toast is being prepared!");
   }

   public void off() {

       System.out.println("The toaster is off!");
   }
}


public class NuclearBomb {

   public void on() {

       System.out.println("Boom!");
   }
}
Както можете да видите, и двете имат on()метод. За тостер започва да се препича. За ядрена бомба предизвиква експлозия. Ами сега: / Сега си представете, че сте решor (не ме питайте защо!) да създадете нещо между тях. И така имате MysteriousDeviceклас! Този code, разбира се, не работи и ние го предоставяме само като пример, „но може да бъде“:
public class MysteriousDevice extends Toaster, NuclearBomb {

   public static void main(String[] args) {

       MysteriousDevice mysteriousDevice = new MysteriousDevice();
       mysteriousDevice.on(); // So what should happen here? Do we get toast or a nuclear apocalypse?
   }
}
Нека да разгледаме Howво имаме. Мистериозното устройство наследява едновременно Toaster и NuclearBomb. И двете имат on()методи. В резултат на това, ако извикаме on()метода, не е ясно кой трябва да бъде извикан на MysteriousDeviceобекта. Няма начин обектът някога да разбере. И за капак на всичко: NuclearBomb няма off()метод, така че ако не сме познали правилно, ще бъде невъзможно да деактивираме устройството. Конкретни примери за абстрактни класове в Java - 2Именно поради това „объркване“, при което обектът не знае Howво поведение да прояви, създателите на Java изоставиха множественото наследяване. Все пак ще си спомните, че Java класовете могат да реализират множество интерфейси. Между другото, в обучението си вече сте срещали поне един абстрактен клас!
public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>
Това е твоят стар приятел, класът Calendar. Той е абстрактен и има няколко деца. Един от тях е GregorianCalendar. Вече го използвахте в уроците за датите. :) Всичко изглежда достатъчно ясно. Има само един въпрос: Howва е фундаменталната разлика между абстрактните класове и интерфейсите? Защо са добавor и двете към Java, instead of просто да ограничат езика до един? В крайна сметка това щеше да е напълно адекватно. Ще говорим за това в следващия урок ! До тогава :)
Коментари
  • Популярен
  • Нов
  • Стар
Трябва да сте влезли, за да оставите коментар
Тази страница все още няма коментари