- Alanları, yapıcısı ve metotları olan bir sınıf yazmak ve ondan nesneler oluşturmak
thisanahtar kelimesinin anlamını açıklamak- Bir nesneyi
privatealanlar, 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.
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;
}
}Toyota: 155 km Kia: 60 km
Carsı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 = brandyazımında soldaki nesnenin alanı, sağdaki ise yapıcının parametresidir; adlar aynı olduğu içinthisonları birbirinden ayırır. - Her nesnenin kendi alanları vardır:
first155 km,secondise 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.
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 + "]";
}
}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.
| Belirleyici | Kim erişebilir? |
|---|---|
public | herkes |
protected | aynı paket ve alt sınıflar |
| (belirleyici yok) | yalnızca aynı paket |
private | yalnızca sınıfın kendisi |
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.
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;
}
}Aysel, grade 5 Murad, grade 9 Students created: 2 Murad, grade 10
Önemli noktalar
- Sınıf bir plandır; nesne ise
newile 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.
thiso 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. staticbir 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.