15. Abstraction¶
Oldingi boblarda inheritance va polymorphismni o‘rgandik.
Endi Java'dagi yana bir muhim tushuncha — abstraction bilan tanishamiz.
Abstraction — kerakli narsalarni ko‘rsatib, keraksiz tafsilotlarni yashirish.
Oddiy misol: mashinani haydash uchun uning dvigateli ichida qanday ishlashini bilish shart emas. Siz faqat rul, gaz va tormozdan foydalanasiz.
Java'da abstraction asosan abstract class va interface yordamida amalga oshiriladi.
Abstract class nima?¶
abstract so‘zi classni to‘liq tayyor class emasligini bildiradi.
Masalan:
abstract class Animal {
abstract void ovoz();
}
Bu yerda Animal — abstract class.
ovoz() esa abstract method.
Abstract methodning ichida kod bo‘lmaydi.
Abstract classdan object yaratib bo‘lmaydi¶
Quyidagi kod ishlamaydi:
Animal hayvon = new Animal();
Chunki Animal abstract class.
Lekin undan meros olish mumkin:
class Dog extends Animal {
@Override
void ovoz() {
System.out.println("Vov-vov!");
}
}
Endi:
Dog it = new Dog();
it.ovoz();
Natija:
Vov-vov!
Abstract method¶
Abstract method faqat nima qilish kerakligini bildiradi.
Masalan:
abstract void ovoz();
Bu:
"Bu classdan meros olgan class
ovoz()methodini yaratishi kerak"
degan ma'noni anglatadi.
To‘liq misol¶
abstract class Animal {
abstract void ovoz();
}
class Dog extends Animal {
@Override
void ovoz() {
System.out.println("Vov-vov!");
}
}
class Cat extends Animal {
@Override
void ovoz() {
System.out.println("Miyov!");
}
}
public class Main {
public static void main(String[] args) {
Animal it = new Dog();
Animal mushuk = new Cat();
it.ovoz();
mushuk.ovoz();
}
}
Natija:
Vov-vov!
Miyov!
Bu yerda abstraction va polymorphism birga ishlayapti.
Abstract class oddiy methodga ham ega bo‘lishi mumkin¶
Abstract class ichida faqat abstract methodlar bo‘lishi shart emas.
Oddiy method ham bo‘lishi mumkin:
abstract class Animal {
abstract void ovoz();
void ovqatlan() {
System.out.println("Hayvon ovqatlanyapti.");
}
}
Endi Dog:
class Dog extends Animal {
@Override
void ovoz() {
System.out.println("Vov-vov!");
}
}
Dog ikkala methoddan ham foydalanishi mumkin:
Dog it = new Dog();
it.ovoz();
it.ovqatlan();
Natija:
Vov-vov!
Hayvon ovqatlanyapti.
Abstract classga field qo‘shish¶
Abstract classda fieldlar ham bo‘lishi mumkin.
abstract class Animal {
String ism;
abstract void ovoz();
}
Child class bu fielddan foydalanishi mumkin:
class Dog extends Animal {
@Override
void ovoz() {
System.out.println(ism + ": Vov-vov!");
}
}
Keyin:
Dog it = new Dog();
it.ism = "Bobik";
it.ovoz();
Natija:
Bobik: Vov-vov!
Nima uchun abstraction kerak?¶
Tasavvur qiling, biz dasturda turli transportlar bilan ishlaymiz:
Car
Bus
Bicycle
Ularning barchasida yur() methodi bo‘lishi kerak.
Biz umumiy abstract class yaratishimiz mumkin:
abstract class Vehicle {
abstract void yur();
}
Keyin har bir transport o‘z yur() methodini yozadi:
class Car extends Vehicle {
@Override
void yur() {
System.out.println("Mashina yurmoqda.");
}
}
class Bicycle extends Vehicle {
@Override
void yur() {
System.out.println("Velosiped yurmoqda.");
}
}
Shunday qilib, Vehicle bizga umumiy qoidani beradi.
Abstract class va oddiy class¶
Oddiy classdan object yaratish mumkin:
class Car {
}
Car mashina = new Car();
Abstract classdan esa object yaratib bo‘lmaydi:
abstract class Vehicle {
}
Quyidagi kod xato:
Vehicle transport = new Vehicle();
Abstract class qachon kerak?¶
Abstract class quyidagi holatlarda foydali:
- Bir nechta classda umumiy qoidalar bo‘lsa.
- Child classlar ma'lum methodlarni yozishi shart bo‘lsa.
- Umumiy field yoki methodlarni parent classda saqlash kerak bo‘lsa.
Masalan:
Animal
|
+--- Dog
|
+--- Cat
|
+--- Horse
Bu yerda Animal umumiy qoidalarni berishi mumkin.
Interface haqida qisqacha¶
Java'da abstractionning yana bir usuli — interface.
Masalan:
interface Animal {
void ovoz();
}
Class interface'dan implements yordamida foydalanadi:
class Dog implements Animal {
@Override
public void ovoz() {
System.out.println("Vov-vov!");
}
}
Interface mavzusini keyingi bobda batafsil o‘rganamiz.
Oddiy tasavvur¶
Abstractionni televizorga o‘xshatish mumkin.
Siz televizorni ishlatishda:
yoqish
ovozini oshirish
kanal almashtirish
kabi tugmalardan foydalanasiz.
Televizor ichida elektronika qanday ishlashini bilishingiz shart emas.
Dasturlashda ham abstraction bizga kerakli imkoniyatlarni ko‘rsatib, ichki murakkablikni yashirishga yordam beradi.
Amaliy mashqlar¶
1-mashq¶
Animal nomli abstract class yarating.
Unda:
abstract void ovoz();
methodi bo‘lsin.
2-mashq¶
Dog classini Animaldan meros oldiring.
ovoz() methodida:
Vov-vov!
chiqaring.
3-mashq¶
Cat classini yarating.
ovoz() methodida:
Miyov!
chiqaring.
4-mashq¶
Vehicle abstract classini yarating.
Unda:
abstract void yur();
methodi bo‘lsin.
Keyin Car va Bus classlarini yarating.
5-mashq¶
Abstract class ichida bitta field va bitta oddiy method yarating.
Keyin child classdan ulardan foydalanib ko‘ring.
Muhim narsalarni eslab qoling¶
Abstraction — kerakli narsalarni ko‘rsatish va keraksiz tafsilotlarni yashirish.
Abstract class:
abstract class Animal {
}
Abstract method:
abstract void ovoz();
Abstract classdan to‘g‘ridan-to‘g‘ri object yaratib bo‘lmaydi.
Child class abstract methodlarni implement qilishi kerak.
Abstraction katta dasturlarda umumiy qoidalarni belgilash uchun ishlatiladi.