İçeriğe geç
Educora
Orta18 dk7 / 18

Sınıflar ve nesneler

Kendi türlerini oluştur: alanlar, yapıcılar, this, metotlar, kapsülleme, getter ve setter'lar, static üyeler.

Kendini test et
Bu derste öğreneceklerin
  • Alanları, yapıcısı ve metotları olan bir sınıf yazmak ve ondan nesneler oluşturmak
  • this anahtar kelimesinin anlamını açıklamak
  • Bir nesneyi private alanlar, getter ve setter'larla kapsüllemek

Bir taksi uygulaması binlerce arabayı takip eder: her birinin markası, üretim yılı ve kilometresi vardır ve her biri yol gidebilir. Her araba için ayrı değişkenler oluşturmak imkânsızdır. Java'nın cevabı sınıflardır: “araba nedir” sorusunu bir kez tanımlarsın, ardından bu tanımdan istediğin kadar nesne oluşturursun.

Sınıf, nesne ve yapıcı

Sınıf, nesnelerin planıdır: bir nesnenin hangi verileri tutacağını (alanlar) ve neler yapabileceğini (metotlar) tanımlar. Nesne ise new operatörüyle oluşturulan somut bir örnektir. Nesne oluşturulurken özel bir metot çalışır: yapıcı (constructor). Adı sınıfın adıyla aynıdır ve dönüş türü yoktur.

Java
public class Main {
    public static void main(String[] args) {
        Car first = new Car("Toyota", 2019);
        Car second = new Car("Kia", 2023);
        first.drive(120);
        first.drive(35);
        second.drive(60);
        System.out.println(first.brand + ": " + first.mileage + " km");
        System.out.println(second.brand + ": " + second.mileage + " km");
    }
}

class Car {
    String brand;
    int year;
    int mileage;

    Car(String brand, int year) {
        this.brand = brand;
        this.year = year;
        this.mileage = 0;
    }

    void drive(int km) {
        mileage += km;
    }
}
Beklenen çıktı
Toyota: 155 km
Kia: 60 km
  • Car sınıfının üç alanı (brand, year, mileage) ve bir metodu (drive) vardır.
  • new Car("Toyota", 2019) bellekte yeni bir nesne oluşturur ve yapıcıyı çağırır.
  • **this**, o anki nesnenin kendisidir. this.brand = brand yazımında soldaki nesnenin alanı, sağdaki ise yapıcının parametresidir; adlar aynı olduğu için this onları birbirinden ayırır.
  • Her nesnenin kendi alanları vardır: first 155 km, second ise 60 km yol gitti; biri diğerini etkilemez.

Kapsülleme: getter ve setter'lar

Car sınıfında herkes first.mileage = -500; yazabilir; bu ise anlamsızdır. Kapsülleme, bir nesnenin verilerini gizlemek ve onlara yalnızca denetim yapan metotlar üzerinden erişim vermek demektir. Alanlar private tanımlanır; okumak için getter, değiştirmek için setter ya da başka açık (public) metotlar yazılır.

Java
public class Main {
    public static void main(String[] args) {
        BankAccount acc = new BankAccount("Leyla", 50);
        acc.deposit(30);
        acc.withdraw(100);
        acc.withdraw(20);
        System.out.println(acc.getOwner() + " has " + acc.getBalance() + " AZN");
        System.out.println(acc);
    }
}

class BankAccount {
    private final String owner;
    private double balance;

    BankAccount(String owner, double balance) {
        this.owner = owner;
        this.balance = balance;
    }

    public String getOwner() { return owner; }
    public double getBalance() { return balance; }

    public void deposit(double amount) {
        if (amount > 0) balance += amount;
    }

    public void withdraw(double amount) {
        if (amount > balance) {
            System.out.println("Not enough money!");
            return;
        }
        balance -= amount;
    }

    @Override
    public String toString() {
        return "BankAccount[" + owner + ", " + balance + "]";
    }
}
Beklenen çıktı
Not enough money!
Leyla has 60.0 AZN
BankAccount[Leyla, 60.0]

Artık bakiyeyi yalnızca deposit ve withdraw metotları değiştirebilir ve bunlar kurallara uyar: negatif tutar kabul edilmez, hesapta olandan fazla para çekilemez. owner alanı final'dır: yapıcıda bir kez atanır ve sonra değişmez; bu yüzden setter'ı yoktur. toString() metodu, nesnenin println ile yazdırıldığında nasıl görüneceğini belirler.

BelirleyiciKim erişebilir?
publicherkes
protectedaynı paket ve alt sınıflar
(belirleyici yok)yalnızca aynı paket
privateyalnızca sınıfın kendisi
Erişim belirleyicileri — en açıktan en kapalıya

Birden fazla yapıcı ve static üyeler

Yapıcılar da metotlar gibi aşırı yüklenebilir. Bir yapıcı, this(...) ile başka bir yapıcıyı çağırabilir; böylece kod tekrarlanmaz. static bir alan ise tek tek nesnelere değil, sınıfın tamamına aittir: tüm nesnelerin paylaştığı tek bir kopyası vardır.

Java
public class Main {
    public static void main(String[] args) {
        Student a = new Student("Aysel");
        Student b = new Student("Murad", 9);
        System.out.println(a.info());
        System.out.println(b.info());
        System.out.println("Students created: " + Student.count);
        Student c = b;
        c.setGrade(10);
        System.out.println(b.info());
    }
}

class Student {
    static int count = 0;
    private String name;
    private int grade;

    Student(String name, int grade) {
        this.name = name;
        setGrade(grade);
        count++;
    }

    Student(String name) {
        this(name, 5);
    }

    public void setGrade(int grade) {
        if (grade >= 1 && grade <= 11) {
            this.grade = grade;
        }
    }

    public String info() {
        return name + ", grade " + grade;
    }
}
Beklenen çıktı
Aysel, grade 5
Murad, grade 9
Students created: 2
Murad, grade 10
1 / 5

Önemli noktalar

  • Sınıf bir plandır; nesne ise new ile oluşturulan somut bir örnektir.
  • Yapıcı sınıfın adını taşır, dönüş türü yoktur ve alanlara başlangıç değerlerini verir.
  • this o anki nesnedir; this(...) ise aynı sınıfın başka bir yapıcısını çağırır.
  • Kapsülleme: alanlar private'tır; erişim, veriyi denetleyen getter, setter ve metotlar üzerinden olur.
  • static bir alan tüm nesneler için ortaktır; nesne değişkenleri ise referans tutar.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
Yapıcı sıradan bir metottan nasıl ayrılır?