Hai! Dalam pelajaran sebelum ini, kita telah mengenali secara ringkas konsep pewarisan. Hari ini, kita akan menyentuh topik ini sekali lagi, tetapi sekali lagi tidak terlalu mendalam. Kami masih akan mempunyai pelajaran yang lebih terperinci mengenai perkara ini pada masa hadapan. Hari ini kita hanya akan melihat beberapa contoh praktikal dan berkenalan dengan pengendali yang menarik di Jawa.
Warisan ialah mekanisme pengaturcaraan (termasuk dalam Java) yang membolehkan anda mengisytiharkan kelas baharu berdasarkan kelas sedia ada. Kelas terbitan kemudiannya mendapat akses kepada medan dan kaedah kelas induk. Mengapa kita memerlukan ini? Nah, bayangkan anda perlu mencipta beberapa kelas kereta dalam program: Lori, RaceCar, Sedan, Pickup, dll. Malah sebelum menulis sebarang kod, anda pasti tahu bahawa semua kelas ini mempunyai banyak persamaan: semua kereta mempunyai model nama, tahun pembuatan, saiz enjin, kelajuan maksimum, dsb. (apatah lagi fakta bahawa mereka semua mempunyai roda dan bahagian lain yang sama). Dalam keadaan ini, anda boleh:
Warisan
Jadi, apakah warisan?![instanceof dan Warisan 101 - 1](https://cdn.codegym.cc/images/article/ac265834-d8aa-41dc-9c44-bd16e5b5b557/800.jpeg)
- Cipta medan ini dalam setiap kelas (tambahkannya pada setiap kelas kereta baharu semasa anda menciptanya)
- Bawa medan biasa kepada semua kereta ke dalam
Car
kelas induk, kemudian gunakan kata kunci lanjutan untuk memperoleh semua kelas bagi jenis kereta tertentu daripadaCar
kelas tersebut.
public class Car {
private String model;
private int maxSpeed;
private int yearOfManufacture;
public Car(String model, int maxSpeed, int yearOfManufacture) {
this.model = model;
this.maxSpeed = maxSpeed;
this.yearOfManufacture = yearOfManufacture;
}
}
public class Truck extends Car {
public Truck(String model, int maxSpeed, int yearOfManufacture) {
super(model, maxSpeed, yearOfManufacture);
}
}
public class Sedan extends Car {
public Sedan(String model, int maxSpeed, int yearOfManufacture) {
super(model, maxSpeed, yearOfManufacture);
}
}
Sekurang-kurangnya, kami mengelakkan pertindihan kod yang tidak perlu (dan kami harus sentiasa berusaha untuk itu semasa menulis program). Selain itu, kami mempunyai struktur kelas yang ringkas dan mudah difahami, dengan semua medan yang sama untuk semua kereta disatukan menjadi satu kelas. Jika trak mempunyai medan khas yang tidak dimiliki oleh kereta lain, ia boleh diisytiharkan dalam Truck
kelas. Begitu juga dengan kaedah. Semua kereta mempunyai tingkah laku biasa tertentu yang boleh diterangkan dengan kaedah, cth menghidupkan kereta, memecut/brek, dsb. Kaedah biasa ini boleh disatukan ke dalam kelas induk Car
, dan setiap jenis kereta tertentu boleh menentukan tindakan uniknya dalam kelas terbitannya .
public class Car {
public void gas() {
// Accelerate
}
public void brake() {
// Brake
}
}
public class F1Car extends Car {
public void pitStop() {
// Only race cars make pit stops
}
public static void main(String[] args) {
F1Car formula1Car = new F1Car();
formula1Car.gas();
formula1Car.pitStop();
formula1Car.brake();
}
}
Kami menambahkan kaedah biasa kepada semua kereta ke Car
kelas. Tetapi, lihat F1Car
kelas, yang mewakili kereta lumba "Formula 1". Hentian pit (hentian untuk penyelenggaraan kereta segera) hanya dilakukan dalam perlumbaan, jadi kami menambahkan fungsi khusus ini pada kelas terbitan yang berkaitan. ![instanceof dan Warisan 101 - 2](https://cdn.codegym.cc/images/article/181b78e9-c0bb-4326-9cf4-3e7b315120de/800.jpeg)
instanceof operator
Di Java, terdapat pengendali khas, instanceof , untuk menyemak sama ada objek dicipta berdasarkan kelas tertentu. Ia mengembalikan benar atau salah bergantung pada hasil semakan. Mari lihat cara ia berfungsi menggunakan kelas dalam contoh kereta kami:
public class Truck extends Car {
public static void main(String[] args) {
Truck truck = new Truck();
System.out.println(truck instanceof Car);
}
}
Output: true Operator instanceof
mengembalikan true , kerana kita mempunyai Truck
objek, dan semua trak adalah kereta. Kelas Truck
berasal daripada Car
kelas. Semua trak dicipta berdasarkan induk biasa, kelas Car
. Lihat dengan teliti bagaimana instanceof
operator digunakan. Anda menulisnya tanpa noktah, kerana ia adalah pengendali, bukan kaedah ("objek instanceof Class”). Mari cuba cara lain:
public static void main(String[] args) {
Car car = new Car();
System.out.println(car instanceof Truck);
}
Output: false Kelas Car
(dan objek kereta) tidak terbit daripada Truck
kelas. Semua trak adalah kereta, tetapi tidak semua kereta adalah trak. Car
objek tidak berdasarkan Truck
kelas. Satu lagi contoh:
public static void main(String[] args) {
Car car = new Car();
Truck truck = new Truck();
System.out.println(car instanceof Object && truck instanceof Object);
}
Output: True Di sini logiknya juga mudah: semua kelas dalam Java, termasuk kelas yang anda buat, turun daripada kelas Object
(walaupun anda tidak menulis "extends Object"—ia sudah tersirat). Bagaimana dan bila ini berguna? Operator instanceof
paling biasa digunakan apabila mengatasi equals()
kaedah. Sebagai contoh, berikut ialah cara equals
kaedah dilaksanakan dalam String
kelas:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
Sebelum membandingkan a String
dengan objek yang diluluskan, kaedah menguji untuk melihat sama ada objek itu adalah rentetan? Hanya selepas itu ia mula membandingkan sifat dua objek. Jika ujian ini tidak wujud, mana-mana objek dengan medan nilai dan panjang boleh dihantar ke kaedah dan dibandingkan dengan String, yang tentunya salah.
GO TO FULL VERSION