Концепции за обектно-ориентирано програмиране в Java

1. Общ преглед

В тази статия ще разгледаме концепциите за обектно-ориентирано програмиране (OOP) в Java. Ще обсъдим класове, обекти, абстракция, капсулиране, наследяване и полиморфизъм .

2. Класове

Класовете са началната точка на всички обекти и ние можем да ги разглеждаме като шаблон за създаване на обекти. Класът обикновено съдържа полета на членове, методи на членове и специален метод на конструктор.

Ще използваме конструктора за създаване на обекти от класа:

public class Car { // member fields private String type; private String model; private String color; private int speed; // constructor public Car(String type, String model, String color) { this.type = type; this.model = model; this.color = color; } // member methods public int increaseSpeed(int increment) { this.speed = this.speed + increment; return this.speed; } // ... }

Имайте предвид, че клас може да има повече от един конструктор. Можем да прочетем повече за класовете в нашата статия за класове.

3. Обекти

Обектите се създават от класове и се наричат ​​екземпляри на класа. Ние създаваме обекти от класове, използвайки техните конструктори:

Car veyron = new Car("Bugatti", "Veyron", "crimson"); Car corvette = new Car("Chevrolet", "Corvette", "black"); 

Тук създадохме два екземпляра от класа Car. Прочетете повече за тях в статията ни за обекти.

4. Абстракция

Абстракцията крие сложността на изпълнението и излага по-прости интерфейси.

Ако мислим за типичен компютър, можем да видим само външния интерфейс, който е най-важен за взаимодействието с него, докато вътрешните чипове и вериги са скрити от потребителя.

В ООП абстракцията означава скриване на сложните детайли за изпълнение на програма, излагане само на API, необходим за използване на изпълнението. В Java постигаме абстракция, като използваме интерфейси и абстрактни класове.

Можем да прочетем повече за абстракцията в нашите абстрактни статии за клас и интерфейс.

5. Капсулиране

Капсулирането крие състоянието или вътрешното представяне на обект от потребителя на API и предоставя публично достъпни методи, свързани с обекта за достъп за четене и запис. Това позволява скриване на конкретна информация и контрол на достъпа до вътрешно изпълнение.

Например полетата на членове в клас са скрити от други класове и те могат да бъдат достъпни чрез методите на членове. Един от начините да направите това е да направите всички полета с данни частни и достъпни само с помощта на публичните методи за член:

public class Car { // ... private int speed; public int getSpeed() { return color; } public void setSpeed(int speed) { this.speed = speed; } // ... }

Тук скоростта на полето се капсулира с помощта на модификатора за частен достъп и може да се осъществи достъп само чрез публичните методи getSpeed ​​() и setSpeed ​​() . Можем да прочетем повече за модификаторите на достъп в статията ни за модификатори на достъп.

6. Наследяване

Наследяването е механизмът, който позволява на един клас да придобие всички свойства от друг клас чрез наследяване на класа. Наричаме наследствения клас детски клас, а наследения клас като клас суперклас или родител.

В Java правим това, като разширяваме родителския клас. По този начин детският клас получава всички свойства от родителя:

public class Car extends Vehicle { //... }

Когато разширяваме клас, ние формираме връзка IS-A. В колата Е-A превозно средство . И така, той има всички характеристики на превозно средство .

Може да зададем въпроса, защо се нуждаем от наследство ? За да отговорим на това, нека разгледаме производителя на превозни средства, който произвежда различни видове превозни средства, като автомобили, автобуси, трамваи и камиони.

За да улесним работата, можем да обединим общите характеристики и свойства на всички типове превозни средства в модул (клас в случай на Java). И можем да позволим на отделни типове да наследят и използват повторно тези свойства:

public class Vehicle { private int wheels; private String model; public void start() { // the process of starting the vehicle } public void stop() { // process to stop the vehicle } public void honk() { // produces a default honk } }

Типът превозно средство Car сега ще наследи от родителския клас Vehicle :

public class Car extends Vehicle { private int numberOfGears; public void openDoors() { // process to open the doors } }

Java поддържа едно наследяване и многостепенно наследяване. Това означава, че клас не може да се простира директно от повече от един клас, но може да използва йерархия:

public class ArmoredCar extends Car { private boolean bulletProofWindows; public void remoteStartCar() { // this vehicle can be started by using a remote control } }

Тук ArmouredCar разширява Car и Car разширява Vehicle . И така, ArmouredCar наследява свойства както от Car, така и от Vehicle .

Докато наследяваме от родителския клас, разработчикът също може да замени внедряването на метод от родителя. Това е известно като заместване на метода.

В горния ни пример за клас Vehicle има метод honk () . Класът Car, който разширява класа Vehicle, може да замени този метод и да приложи по начина, по който иска да произведе звука:

public class Car extends Vehicle { //... @Override public void honk() { // produces car-specific honk } }

Имайте предвид, че това също се нарича полиморфизъм по време на изпълнение, както е обяснено в следващия раздел. Можем да прочетем повече за наследяването в нашите статии за наследяване и наследяване и композиция на Java.

7. Полиморфизъм

Полиморфизмът е способността на OOP език да обработва данни по различен начин в зависимост от техните видове входове. В Java това може да е едно и също име на метод, което има различни подписи на метода и изпълнява различни функции:

public class TextFile extends GenericFile { //... public String read() { return this.getContent() .toString(); } public String read(int limit) { return this.getContent() .toString() .substring(0, limit); } public String read(int start, int stop) { return this.getContent() .toString() .substring(start, stop); } }

В този пример можем да видим, че методът read () има три различни форми с различни функционалности. Този тип полиморфизъм е статичен или полиморфизъм по време на компилация и се нарича още претоварване на метода.

Съществува също така време на изпълнение или динамичен полиморфизъм, при който класът дете заменя метода на родителя :

public class GenericFile { private String name; //... public String getFileInfo() { return "Generic File Impl"; } }

Детски клас може да разшири класа GenericFile и да замени метода getFileInfo () :

public class ImageFile extends GenericFile { private int height; private int width; //... getters and setters public String getFileInfo() { return "Image File Impl"; } }

Прочетете повече за полиморфизма в нашата статия за полиморфизма в Java.

8. Заключение

В тази статия научихме за основните фундаментални концепции на ООП с Java.

Примерите за кодове в тази статия са достъпни в Github.