WPROWADZENIE DO PROGRAMOWANIA OBIEKTOWEGO
Co to jest programowanie obiektowe?
Programowanie zorientowane obiektowo (OOP) to paradygmat programowania, który kładzie nacisk na wykorzystanie obiektów, klas i metod do tworzenia kodu wielokrotnego użytku. Java jest jednym z najpopularniejszych języków programowania obiektowego i jest szeroko stosowana do tworzenia aplikacji komputerowych i internetowych. W tym artykule omówimy podstawy programowania obiektowego w Javie, w tym klasy, obiekty i kluczowe zasady, takie jak dziedziczenie, polimorfizm i enkapsulacja.
Obiekty i klasy
Klasy Java służą jako szablony do tworzenia obiektów, a klasa definiuje właściwości i zachowanie swoich obiektów. Obiekty są tworzone przy użyciu słowa kluczowego „nowy”, po którym następuje nazwa klasy.
Załóżmy na przykład, że chcemy utworzyć klasę o nazwie „Osoba”, która reprezentuje imię i wiek osoby. Możemy zdefiniować tę klasę w następujący sposób:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Teraz możemy tworzyć obiekty klasy Person za pomocą następującego kodu:
Person person1 = new Person("Alice", 25);
Person person2 = new Person("Bob", 30);
Dziedzictwo
Dziedziczenie jest kluczową zasadą programowania obiektowego, która umożliwia tworzenie nowych klas w oparciu o istniejące klasy. W Javie można utworzyć podklasę, która dziedziczy wszystkie właściwości i zachowania swojej klasy nadrzędnej. Podklasa może również dodawać własne właściwości i zachowania.
Załóżmy na przykład, że chcemy utworzyć klasę o nazwie „Student” i „Instruktor”, która dziedziczy po utworzonej wcześniej klasie Osoba. Klasy te możemy zdefiniować w następujący sposób:
public class Instructor extends Person {
private String roomNumber;
public Instructor(String name, int age){
super(name); // calls super class constructor
setAge(age);
}
public void setRoomNumber(String room) {
roomNumber = room;
}
public class Student extends Person {
private int studentId;
public Student(String name, int age, int studentId) {
super(name, age); // calls super class constructor
this.studentId = studentId;
}
public int getStudentId() {
return studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
}
Teraz możemy tworzyć obiekty klasy Student&Instructor za pomocą następującego kodu:
Student student1 = new Student("John", 20, 12345);
Instructor ınstructor1 = new Instructor ("Mike", 40, 2213);
Wielopostaciowość
Polimorfizm umożliwia traktowanie obiektów różnych klas tak, jakby były obiektami tej samej klasy. Oznacza to, że możesz pisać kod, który działa z różnymi typami obiektów, bez konieczności znajomości dokładnego typu obiektu, z którym pracujesz.
Załóżmy, że jesteś nauczycielem z klasą pełną różnych rodzajów zwierząt. Masz psy, koty, ptaki, a nawet kilka węży. To indywidualne cechy i zachowania każdego zwierzęcia czynią go wyjątkowym. Na przykład niektóre zwierzęta potrafią szczekać, inne miauczeć, a jeszcze inne potrafią latać.
Jako nauczyciel chcesz mieć możliwość interakcji ze wszystkimi zwierzętami w klasie w podobny sposób, mimo że wszystkie są różne. Nie chcesz pisać osobnych instrukcji dla każdego zwierzęcia, ponieważ byłoby to zbyt czasochłonne i skomplikowane. Zamiast tego należy traktować wszystkie zwierzęta tak, jakby były częścią tej samej grupy, aby można było utworzyć jeden zestaw instrukcji, który można zastosować do każdego zwierzęcia, i właśnie w tym miejscu pojawia się polimorfizm. W Javie polimorfizm umożliwia pisanie kodu który działa z obiektami różnych typów, o ile mają wspólną nadklasę lub interfejs.
Istnieją dwa sposoby osiągnięcia polimorfizmu, czyli zdolności obiektu do przyjmowania wielu form. Te dwa są nazywane przesłanianiem metody i przeciążaniem metody.
1-) Zastępowanie metody: Aby zastąpić metodę, metoda musi być zdefiniowana w podklasie przy użyciu tego samego podpisu i tego samego zwracanego typu, jak w jej nadklasie. Pozwala to podklasie na zmianę zachowania metody, przy jednoczesnym zachowaniu tej samej nazwy i podpisu. Metodę instancji można przesłonić tylko wtedy, gdy ma modyfikatory widoczności public lub protected, ponieważ metody prywatne nie mogą zostać przesłonięte, ponieważ nie są dostępne poza własną klasą.
class Animal {
public void makeSound() {
System.out.println("Animal is making a sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog is barking");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Cat is meowing");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.makeSound(); // Output: "Dog is barking"
myCat.makeSound(); // Output: "Cat is meowing"
}
}
2-) Przeciążanie metod: Przeciążanie metod to funkcja języka Java, która umożliwia definiowanie wielu metod o tej samej nazwie, ale różnych parametrach. Kiedy wywołujesz przeciążoną metodę, kompilator Java decyduje, którą metodę wykonać na podstawie przekazanych parametrów.
Spójrzmy na inny przykład, aby zobaczyć, jak to działa:
public class Example {
public void print(String message) {
System.out.println(message);
}
public void print(int number) {
System.out.println(number);
}
}
Możesz wywołać te metody w następujący sposób:
Example example = new Example();
example.print("Hello"); // prints "Hello"
example.print(666); // prints "666"
Koncepcja enkapsulacji jest kluczowa, ponieważ pomaga kontrolować poziom dostępu do członków danych klasy. Korzystając z modyfikatorów dostępu, takich jak public, private i protected, możemy określić poziom dostępu do członków danych. Gwarantuje to, że dostęp do członków danych jest możliwy tylko za pomocą metod dostarczonych przez klasę, a nie bezpośrednio przez użytkowników klasy. Innym powodem, dla którego enkapsulacja jest ważna, jest to, że możemy łatwo ponownie użyć kodu w innych częściach aplikacji, nie martwiąc się o szczegóły jego implementacji, poprzez enkapsulację danych i kodu w jednym urządzeniu. Pomaga to zmniejszyć ilość powielanego kodu i sprawia, że aplikacja jest łatwiejsza w utrzymaniu.
Hermetyzacja to sposób organizowania kodu, który ułatwia zrozumienie i zmianę. Działa jak mała „bańka” wokół niektórych informacji, do której tylko niektóre rzeczy mogą się dostać i wyjść.
Załóżmy na przykład, że chcesz stworzyć program, który śledzi imię i wiek osoby. Możesz to zrobić tak:
public class Person {
public String name;
public int age;
}
W tym miejscu pojawia się enkapsulacja. Zamiast upubliczniać pola, możesz je ustawić jako prywatne i zapewnić metody „pobierające” i „ustawiające”, aby uzyskać do nich dostęp i je zmienić:
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Na przykład, jeśli chcesz się upewnić, że osoba agenigdy nie jest ujemna, możesz dodać sprawdzenie wewnątrz setAgemetody:
public void setAge(int age) {
if (age < 0) {
System.out.println("Age cannot be negative");
}
this.age = age;
}
Wniosek
Dziękujemy za poświęcenie czasu na przeczytanie tego artykułu. Mam nadzieję, że uznałeś to za pouczające i przyjemne. Wasze wsparcie i zaangażowanie wiele dla mnie znaczą. Jeśli masz jakieś uwagi lub sugestie dotyczące przyszłych artykułów, nie wahaj się podzielić się nimi w komentarzach poniżej.

![Czym w ogóle jest lista połączona? [Część 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































