Java asoslari 3-qism

08.06.2026 | Muallif: Jaxongir a.k.a | Kategoriya: Java tili | 19 daqiqa o'qish

4. OOP Fundamentals

OOP - Object-Oriented Programming, ya’ni obyektga yo‘naltirilgan dasturlash.

Java asosan OOP til hisoblanadi. Shuning uchun Java’da yaxshi backend developer bo‘lish uchun class, object, field, method, constructor, this, static, inheritance, overriding kabi tushunchalarni kuchli tushunish kerak.

Roadmapdagi Beginner bo‘limida OOP fundamentals quyidagilarni o‘z ichiga oladi: classes and objects, fields, methods, constructors, this keyword, access modifiers, static vs instance members, inheritance basics, method overriding.


4.1. OOP nima?

Oddiy qilib aytganda, OOP - real hayotdagi narsalarni dastur ichida obyekt sifatida ifodalash.

Masalan real hayotda:

Mashina
Foydalanuvchi
Buyurtma
Mahsulot
Bank hisob
Telefon

Java’da bularni class va object orqali ifodalaymiz.

Masalan, User:

public class User {
    String name;
    int age;
}

Bu yerda User - class.

Keyin undan object yaratamiz:

User user = new User();
user.name = "Ali";
user.age = 25;

Bu yerda user - object.


4.2. Class nima?

Class - object yaratish uchun qolip.

Masalan, pechenye qolipi bor. Qolipning o‘zi yeyilmaydi, lekin shu qolip orqali ko‘p pechenye tayyorlanadi.

Java’da class ham shunaqa:

public class Car {
    String color;
    String model;
    int year;
}

Bu hali real mashina emas. Bu faqat mashina qanday ma’lumotlarga ega bo‘lishini bildiradi.

Car class:
- color
- model
- year

4.3. Object nima?

Object - class asosida yaratilgan real nusxa.

Car car1 = new Car();

car1.color = "Black";
car1.model = "Cobalt";
car1.year = 2023;

Bu yerda:

Car   → class
car1  → object
new   → yangi object yaratadi

Yana bitta object:

Car car2 = new Car();

car2.color = "White";
car2.model = "Gentra";
car2.year = 2022;

Endi bizda bitta Car class bor, lekin ikki object bor:

car1 → Black Cobalt 2023
car2 → White Gentra 2022

4.4. Field nima?

Field - class ichidagi variable.

public class User {
    String name;
    int age;
    boolean active;
}

Bu yerda:

name
age
active

bular field.

Field objectning holatini saqlaydi.

Masalan:

User user = new User();

user.name = "Ali";
user.age = 25;
user.active = true;

Bu objectning holati:

name = Ali
age = 25
active = true

4.5. Method nima?

Method - class ichidagi funksiya. Ya’ni object nima ish qila olishini bildiradi.

public class User {
    String name;
    int age;

    void sayHello() {
        System.out.println("Salom, mening ismim " + name);
    }
}

Ishlatish:

public class Main {
    public static void main(String[] args) {
        User user = new User();
        user.name = "Ali";
        user.age = 25;

        user.sayHello();
    }
}

Natija:

Salom, mening ismim Ali

Demak:

Field  → object nimaga ega?
Method → object nima qila oladi?

4.6. Method parameter

Method tashqaridan qiymat qabul qilishi mumkin.

public class Calculator {
    int add(int a, int b) {
        return a + b;
    }
}

Ishlatish:

Calculator calculator = new Calculator();

int result = calculator.add(10, 20);

System.out.println(result);

Natija:

30

Bu yerda:

a, b     → parameter
10, 20   → argument
return   → natijani qaytaradi

4.7. void va return

Agar method natija qaytarmasa, void yoziladi.

void printHello() {
    System.out.println("Hello");
}

Agar method natija qaytarsa, qaytaradigan type yoziladi.

int add(int a, int b) {
    return a + b;
}

Yana misol:

boolean isAdult(int age) {
    return age >= 18;
}

Ishlatish:

boolean result = isAdult(20);
System.out.println(result);

Natija:

true

4.8. Constructor nima?

Constructor - object yaratilganda avtomatik ishlaydigan maxsus method.

public class User {
    String name;
    int age;

    User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

Object yaratish:

User user = new User("Ali", 25);

Bu yerda constructor ishlaydi va field’larga qiymat beradi.

Constructor xususiyatlari:

Class nomi bilan bir xil bo‘ladi
Return type bo‘lmaydi
Object yaratilganda avtomatik chaqiriladi

4.9. Default constructor

Agar class ichida constructor yozilmasa, Java o‘zi default constructor beradi.

public class User {
    String name;
    int age;
}

Bunday object yaratish mumkin:

User user = new User();

Lekin sen constructor yozsang:

public class User {
    String name;
    int age;

    User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

Endi bu ishlamaydi:

User user = new User(); // xato

Chunki Java endi default constructorni avtomatik qo‘shmaydi.

Agar ikkala variant ham kerak bo‘lsa:

public class User {
    String name;
    int age;

    User() {
    }

    User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

4.10. this keyword

this - hozirgi objectni bildiradi.

Masalan:

public class User {
    String name;

    User(String name) {
        this.name = name;
    }
}

Bu yerda:

this.name → object field’i
name      → constructor parameter’i

Agar this yozilmasa:

User(String name) {
    name = name;
}

Bu noto‘g‘ri mantiq. Chunki parameter o‘ziga o‘zi tenglashtiriladi. Field o‘zgarmaydi.

To‘g‘ri:

User(String name) {
    this.name = name;
}

Oddiy tilda:

this.name = name

shu objectning name field’iga tashqaridan kelgan name qiymatini ber

4.11. Access modifiers

Access modifier - class, field, method qayerdan ko‘rinishini belgilaydi.

Java’da asosiylari:

Modifier

Ma’nosi

public

hamma joydan ko‘rinadi

private

faqat shu class ichida ko‘rinadi

protected

package va child classlarda ko‘rinadi

default

faqat shu package ichida ko‘rinadi

Default degani - hech narsa yozilmagan holat:

class User {
}

4.12. private nima uchun kerak?

Field’larni odatda private qilish yaxshi amaliyot.

Yomonroq variant:

public class User {
    public String name;
    public int age;
}

Bu holatda istalgan joydan qiymatni buzib yuborish mumkin:

user.age = -100;

Yaxshiroq variant:

public class User {
    private String name;
    private int age;

    public void setAge(int age) {
        if (age < 0) {
            System.out.println("Age manfiy bo‘lishi mumkin emas");
            return;
        }

        this.age = age;
    }

    public int getAge() {
        return age;
    }
}

Endi ageni to‘g‘ridan-to‘g‘ri buzib bo‘lmaydi. Faqat setAge() orqali qiymat beriladi.

Bu encapsulation deyiladi.


4.13. Getter va Setter

Private field’larga tashqaridan nazoratli kirish uchun getter/setter ishlatiladi.

public class User {
    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) {
        if (age < 0) {
            throw new IllegalArgumentException("Age manfiy bo‘lishi mumkin emas");
        }

        this.age = age;
    }
}

Ishlatish:

User user = new User();

user.setName("Ali");
user.setAge(25);

System.out.println(user.getName());
System.out.println(user.getAge());

Natija:

Ali
25

4.14. Static vs Instance

Java’da memberlar ikki xil bo‘ladi:

instance member → objectga tegishli
static member   → classga tegishli

Instance field

public class User {
    String name;
}

Har bir objectda alohida name bo‘ladi:

User user1 = new User();
user1.name = "Ali";

User user2 = new User();
user2.name = "Vali";

Bu yerda:

user1.name = Ali
user2.name = Vali

Har objectda alohida qiymat.


Static field

public class User {
    static int count = 0;

    User() {
        count++;
    }
}

Ishlatish:

User user1 = new User();
User user2 = new User();
User user3 = new User();

System.out.println(User.count);

Natija:

3

count bitta. U barcha objectlar uchun umumiy.


4.15. Static method

Static method object yaratmasdan class nomi orqali chaqiriladi.

public class MathUtils {
    static int add(int a, int b) {
        return a + b;
    }
}

Ishlatish:

int result = MathUtils.add(10, 20);
System.out.println(result);

Natija:

30

Static method misollari Java’da ko‘p:

Math.max(10, 20);
Integer.parseInt("123");
String.valueOf(100);

4.16. Static method ichida instance field ishlatib bo‘lmaydi

public class User {
    String name;

    static void printName() {
        System.out.println(name); // xato
    }
}

Nega xato?

Chunki name objectga tegishli. Static method esa object yaratilmasdan chaqirilishi mumkin.

To‘g‘ri variant:

public class User {
    String name;

    void printName() {
        System.out.println(name);
    }
}

Yoki static field ishlatish:

public class AppConfig {
    static String appName = "My App";

    static void printAppName() {
        System.out.println(appName);
    }
}

4.17. Inheritance nima?

Inheritance - bitta class boshqa classdan xususiyat va methodlarni meros qilib olishi.

Java’da extends ishlatiladi.

public class Animal {
    void eat() {
        System.out.println("Animal eating");
    }
}
public class Dog extends Animal {
    void bark() {
        System.out.println("Dog barking");
    }
}

Ishlatish:

Dog dog = new Dog();

dog.eat();
dog.bark();

Natija:

Animal eating
Dog barking

Bu yerda:

Animal → parent class / superclass
Dog    → child class / subclass

Dog Animaldagi eat() methodni meros qilib oldi.


4.18. Inheritance qachon ishlatiladi?

Agar bir class haqiqatan boshqa classning turi bo‘lsa, inheritance ishlatish mumkin.

Masalan:

Dog is an Animal
Cat is an Animal
Car is a Vehicle
Manager is an Employee

Lekin har doim inheritance ishlatish shart emas. Ko‘p real loyihalarda composition yaxshiroq bo‘ladi. Bu Junior/Middle bosqichda chuqurroq o‘rganiladi.

Beginner uchun asosiy qoida:

A extends B deyish uchun A haqiqatan B ning turi bo‘lishi kerak.

4.19. Method overriding

Overriding - child class parent classdagi methodni o‘ziga moslab qayta yozishi.

public class Animal {
    void makeSound() {
        System.out.println("Animal sound");
    }
}
public class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Woof");
    }
}

Ishlatish:

Dog dog = new Dog();
dog.makeSound();

Natija:

Woof

Bu yerda Dog Animaldagi makeSound() methodini qayta yozdi.


4.20. @Override nima uchun kerak?

@Override - "men parent methodni qayta yozmoqchiman" degani.

@Override
void makeSound() {
    System.out.println("Woof");
}

Agar method nomini xato yozsang, Java darhol xato beradi.

Masalan:

@Override
void makesound() {
    System.out.println("Woof");
}

Bu xato bo‘ladi, chunki parent classda makesound() degan method yo‘q. Bor method makeSound().

Shuning uchun @Override ishlatish yaxshi amaliyot.


4.21. Polymorphismga kichik kirish

OOP’da muhim tushuncha bor: polymorphism.

Bu beginner bo‘limda juda chuqur emas, lekin inheritance bilan bog‘liq.

Animal animal = new Dog();
animal.makeSound();

Agar Dog makeSound()ni override qilgan bo‘lsa, natija:

Woof

Variable type Animal, lekin real object Dog.

Bu degani:

Parent type orqali child objectni ushlash mumkin.

Bu Spring, collections, interface, abstraction mavzularida juda kerak bo‘ladi.


4.22. To‘liq kichik misol

public class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        setAge(age);
    }

    public void sayHello() {
        System.out.println("Salom, men " + name);
    }

    public boolean isAdult() {
        return age >= 18;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age < 0) {
            throw new IllegalArgumentException("Age manfiy bo‘lishi mumkin emas");
        }

        this.age = age;
    }
}

Ishlatish:

public class Main {
    public static void main(String[] args) {
        User user = new User("Ali", 25);

        user.sayHello();

        if (user.isAdult()) {
            System.out.println("Voyaga yetgan");
        } else {
            System.out.println("Voyaga yetmagan");
        }
    }
}

Natija:

Salom, men Ali
Voyaga yetgan

Bu misolda bor:

class
object
private field
constructor
this
method
getter
setter
boolean return
encapsulation

4.23. Inheritance bilan to‘liq misol

public class Employee {
    private String name;
    private double salary;

    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    public void work() {
        System.out.println(name + " ishlayapti");
    }

    public double getSalary() {
        return salary;
    }
}
public class Manager extends Employee {
    private int teamSize;

    public Manager(String name, double salary, int teamSize) {
        super(name, salary);
        this.teamSize = teamSize;
    }

    @Override
    public void work() {
        System.out.println("Manager jamoani boshqaryapti");
    }

    public int getTeamSize() {
        return teamSize;
    }
}
public class Main {
    public static void main(String[] args) {
        Manager manager = new Manager("Ali", 2000, 5);

        manager.work();
        System.out.println(manager.getSalary());
        System.out.println(manager.getTeamSize());
    }
}

Natija:

Manager jamoani boshqaryapti
2000.0
5

Bu yerda yangi narsa:

super(name, salary);

super parent class constructorini chaqiradi.

Ya’ni Manager yaratilganda avval Employee qismi ham to‘g‘ri yaratilishi kerak.


4.24. Beginner xatolar

Xato 1: Class va objectni adashtirish

Class:

public class User {
}

Object:

User user = new User();

Class - qolip. Object - shu qolipdan yaratilgan real nusxa.


Xato 2: Fieldlarni public qilish

Yomon:

public class User {
    public int age;
}

Yaxshi:

public class User {
    private int age;

    public void setAge(int age) {
        if (age < 0) {
            throw new IllegalArgumentException("Invalid age");
        }

        this.age = age;
    }
}

Xato 3: thisni tushunmaslik

Noto‘g‘ri:

public User(String name) {
    name = name;
}

To‘g‘ri:

public User(String name) {
    this.name = name;
}

Xato 4: Static’ni hamma joyda ishlatish

Yomon amaliyot:

public class UserService {
    static void createUser() {
    }
}

Real Spring/Backend loyihalarda service’lar odatda object sifatida boshqariladi. Hamma narsani static qilish OOP mantiqni buzadi va test qilishni qiyinlashtiradi.

static asosan quyidagilar uchun yaxshi:

utility methodlar
constant qiymatlar
class-level umumiy hisoblagichlar

Xato 5: Inheritance’ni noto‘g‘ri ishlatish

Noto‘g‘ri mantiq:

User extends Database
Order extends EmailSender

Bu noto‘g‘ri, chunki User database turi emas. Order email sender turi emas.

Yaxshi mantiq:

Dog extends Animal
Manager extends Employee
Car extends Vehicle

4.25. OOP’da 4 ta asosiy prinsip

OOP’da 4 ta katta prinsip bor:

Prinsip

Qisqa ma’nosi

Encapsulation

Ma’lumotni yashirish va nazorat qilish

Inheritance

Meros olish

Polymorphism

Bir xil interface, turli xatti-harakat

Abstraction

Keraksiz detalni yashirish, muhim qismini ko‘rsatish

Beginner bosqichida eng muhimlari:

Class va objectni tushunish
private field + getter/setter
constructor
this
static vs instance
extends
@Override

4.26. Kichik mashq

Quyidagi classni o‘zing yozib ko‘r:

Product class:
- name
- price
- quantity

Constructor:
- name, price, quantity qabul qilsin

Methodlar:
- getTotalPrice() → price * quantity qaytarsin
- printInfo() → product ma’lumotlarini chiqarsin

Yechim:

public class Product {
    private String name;
    private double price;
    private int quantity;

    public Product(String name, double price, int quantity) {
        this.name = name;
        this.price = price;
        this.quantity = quantity;
    }

    public double getTotalPrice() {
        return price * quantity;
    }

    public void printInfo() {
        System.out.println("Product: " + name);
        System.out.println("Price: " + price);
        System.out.println("Quantity: " + quantity);
        System.out.println("Total: " + getTotalPrice());
    }
}

Ishlatish:

public class Main {
    public static void main(String[] args) {
        Product product = new Product("Laptop", 1000, 2);

        product.printInfo();
    }
}

Natija:

Product: Laptop
Price: 1000.0
Quantity: 2
Total: 2000.0

Qisqa xulosa

OOP fundamentals Java’ning yuragi hisoblanadi:

class        → object yaratish uchun qolip
object       → classdan yaratilgan real nusxa
field        → object holati
method       → object bajaradigan ish
constructor  → object yaratilganda ishlaydi
this         → hozirgi object
private      → tashqaridan yashirish
getter/setter→ nazoratli kirish
static       → classga tegishli
instance     → objectga tegishli
extends      → inheritance
@Override    → methodni qayta yozish

Eng muhim fikr:

OOP’da kod ma’lumot va xatti-harakatni bitta mantiqiy model ichida jamlaydi.

Keyingi mavzu: Arrays & Collections Intro - 1D/2D arrays, ArrayList, HashMap, collection bo‘ylab yurish.