Klasa Object
Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 24 z 87.
W języku Java każda tworzona przez ciebie klasa automatycznie dziedziczy po specjalnej klasie o nazwie Object. Nawet jeśli nigdzie nie wpiszesz extends, twoja klasa nadal jest klasą potomną Object. Dzięki temu Object jest korzeniem całej hierarchii klas.
public class Person {
// Ta klasa niejawnie dziedziczy po Object
}
// Jest równoważne:
public class Person extends Object {
}Ponieważ każda klasa dziedziczy po Object, każdy obiekt w Javie ma dostęp do kilku wbudowanych metod. Do najczęściej używanych należą:
| Metoda | Cel |
|---|---|
toString() | Zwraca tekstową reprezentację obiektu |
equals(Object obj) | Porównuje dwa obiekty pod kątem równości |
hashCode() | Zwraca wartość kodu skrótu obiektu |
getClass() | Zwraca klasę obiektu w czasie wykonywania programu |
Domyślnie te metody mają ogólne implementacje. Na przykład toString() zwraca nazwę klasy, po której następują @ i kod skrótu obiektu zapisany w systemie szesnastkowym, co nie jest zbyt przydatne:
Person p = new Person();
System.out.println(p.toString()); // Wynik: Person@1a2b3c4dDlatego często nadpisujesz te metody we własnych klasach, aby zapewnić sensowne działanie. Zrozumienie, że Object jest uniwersalną klasą nadrzędną, pomaga wyjaśnić, dlaczego możesz przechowywać dowolny obiekt w zmiennej typu Object oraz dlaczego niektóre metody są dostępne dla każdego tworzonego przez Ciebie obiektu.
Wyzwanie
ŁatwySprawdźmy, jak klasa Object pełni rolę uniwersalnej klasy nadrzędnej wszystkich klas Java, tworząc prosty system inwentaryzacji gadżetów, który pokazuje dziedziczone metody z Object.
Utworzysz trzy pliki, aby uporządkować swój kod:
Gadget.java: Utwórz klasę reprezentującą elektroniczny gadżet. Twoja klasa powinna mieć:- Prywatne pola dla
name(String) iyear(int) - Konstruktor inicjalizujący oba pola
- Metody pobierające
getName()igetYear()
- Prywatne pola dla
Smartphone.java: Utwórz podklasę rozszerzającą Gadget i dodającą funkcje charakterystyczne dla smartfona:- Prywatne pole dla
brand(String) - Konstruktor przyjmujący name, year i brand — użyj
super(name, year)dla części dotyczącej klasy nadrzędnej - Metodę
getBrand(), która zwraca markę - Nadpisz metodę
toString(), aby zwracała:Smartphone: [brand] [name] ([year])
- Prywatne pole dla
Main.java: Pokaż różnicę między domyślnymi a nadpisanymi metodamiObject. Otrzymasz trzy dane wejściowe: nazwę gadżetu, rok i markę. Utwórz obiektGadgeti obiektSmartphone, używając tej samej nazwy i roku (oraz marki dla smartfona), a następnie:- Wyświetl nazwę klasy gadżetu za pomocą
getClass().getSimpleName() - Wyświetl informację, czy domyślna metoda
toString()gadżetu zawiera symbol "@"; wyświetltruelubfalse - Wyświetl smartfona za pomocą nadpisanej metody
toString()
- Wyświetl nazwę klasy gadżetu za pomocą
Otrzymasz trzy dane wejściowe: nazwę gadżetu/smartfona (String), rok (int) i markę (String).
To wyzwanie pokazuje, dlaczego nadpisywanie metod Object ma znaczenie — domyślna metoda toString() zwraca coś w rodzaju Gadget@1a2b3c, podczas gdy Twoja własna wersja dostarcza przydatnych informacji!
Spróbuj swoich sił
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Wczytaj dane wejściowe
String name = scanner.nextLine();
int year = scanner.nextInt();
scanner.nextLine(); // pomiń znak nowego wiersza
String brand = scanner.nextLine();
// TODO: Utwórz obiekt Gadget z name i year
// TODO: Utwórz obiekt Smartphone z name, year i brand
// TODO: Wypisz nazwę klasy obiektu gadget za pomocą getClass().getSimpleName()
// TODO: Wypisz, czy toString() obiektu gadget zawiera "@" (true lub false)
// TODO: Wypisz obiekt smartphone (używa przesłoniętej metody toString())
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe thisMetodyPola (atrybuty)Metoda konstruktoraPrzeciążanie konstruktoraPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawy dziedziczenia (extends)Słowo kluczowe superPrzesłanianie metod (@Override)Łańcuch wywołań konstruktorówKlasa ObjectDziedziczenie jedno- i wielopoziomoweDlaczego Java nie obsługuje wielodziedziczenia klasPodsumowanie – hierarchia pracowników7Metody specjalne i klasa Object
Metoda toString()equals() i hashCode()Metoda clone()compareTo() i ComparableInterfejs ComparatorPodsumowanie — własne sortowanie10Obsługa wyjątków w programowaniu obiektowym
Hierarchia klas wyjątkówWłasne wyjątkiBłędy sprawdzane a niesprawdzaneWzorzec try-with-resourcesPodsumowanie – zweryfikowany użytkownik2Modyfikatory dostępu i enkapsulacja
Przegląd poziomów dostępuMetody pobierające i ustawiająceUkrywanie informacjiSłowo kluczowe finalPodsumowanie — menedżer kont bankowych5Polimorfizm
Podstawy przeciążania metodPrzesłanianie metod (w czasie wykonywania)Rzutowanie w górę i w dółOperator instanceofKlasy i metody abstrakcyjnePowtórka — kalkulator figur8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieAgregacja a kompozycjaKlasy wewnętrzne, zagnieżdżone i anonimoweEnumy i metody enumówRekordy (Java 16+)Klasy zapieczętowane (Java 17+)11Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec BuilderWzorzec ObserverWzorzec Strategy3Właściwości klas i składowe statyczne
Zmienne instancji a zmienne statyczneMetody statyczneBloki statyczneStałe (static final)Powtórka – Counter i Utility6Interfejsy i klasy abstrakcyjne
Wprowadzenie do interfejsówImplementowanie interfejsówImplementacja wielu interfejsówMetody domyślne i statyczne w interfejsieKlasy abstrakcyjne a interfejsyInterfejsy funkcyjnePodsumowanie — system płatnościPoćwicz samodzielnie: Kompilator Java online