- Sahələri, konstruktoru və metodları olan sinif yazmaq və ondan obyektlər yaratmaq
thisaçar sözünün mənasını izah etməkprivatesahələr, getter və setter-lərlə obyekti inkapsulyasiya etmək
Taksi tətbiqi minlərlə avtomobili izləyir: hər birinin markası, buraxılış ili və yürüşü var, hər biri də yol gedə bilir. Hər avtomobil üçün ayrıca dəyişənlər yaratmaq mümkün deyil. Java-nın cavabı siniflərdir: sən bir dəfə «avtomobil nədir» sualını təsvir edirsən, sonra ondan istədiyin qədər obyekt yaradırsan.
Sinif, obyekt və konstruktor
Sinif obyektlərin çertyojudur: o, obyektin hansı məlumatları (sahələri) saxlayacağını və nə edə biləcəyini (metodları) təsvir edir. Obyekt isə new operatoru ilə yaradılmış konkret nüsxədir. Obyekt yaradılanda xüsusi metod — konstruktor işə düşür: onun adı sinfin adı ilə eynidir və qaytarılan tipi yoxdur.
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
Carsinfinin üç sahəsi (brand,year,mileage) və bir metodu (drive) var.new Car("Toyota", 2019)yaddaşda yeni obyekt yaradır və konstruktoru çağırır.- **
this** cari obyektin özüdür.this.brand = brandyazılışında soldakı obyektin sahəsi, sağdakı isə konstruktorun parametridir — adlar eyni olduğu üçünthisonları ayırır. - Hər obyektin öz sahələri var:
first155 km yol getdi,secondisə 60 km — biri digərinə təsir etmir.
İnkapsulyasiya: getter və setter-lər
Car sinfində hər kəs first.mileage = -500; yaza bilər — bu isə mənasızdır. İnkapsulyasiya obyektin məlumatını gizlətmək və ona yalnız yoxlama aparan metodlar vasitəsilə çıxış vermək deməkdir. Sahələr private elan olunur, oxumaq üçün getter, dəyişmək üçün isə setter və ya başqa açıq (public) metodlar 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]
İndi balansı yalnız deposit və withdraw metodları dəyişə bilər və onlar qaydalara əməl edir: mənfi məbləğ qəbul olunmur, hesabda olandan artıq pul çıxarmaq olmur. owner sahəsi final-dır: konstruktorda bir dəfə təyin olunur və sonra dəyişmir, ona görə onun setter-i yoxdur. toString() metodu obyektin println ilə necə göstəriləcəyini müəyyən edir.
| Modifikator | Kim görür? |
|---|---|
public | hamı |
protected | eyni paket və törəmə siniflər |
| (modifikatorsuz) | yalnız eyni paket |
private | yalnız sinfin özü |
Bir neçə konstruktor və static üzvlər
Konstruktorlar da metodlar kimi yüklənə bilər. Bir konstruktor digərini this(...) ilə çağıra bilər — bu, kodun təkrarlanmasının qarşısını alır. static sahə isə ayrı-ayrı obyektlərə deyil, bütün sinfə aiddir: onun bütün obyektlər üçün ortaq olan bir nüsxəsi var.
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
Əsas fikirlər
- Sinif obyektlərin çertyojudur, obyekt isə
newilə yaradılan konkret nüsxədir. - Konstruktor sinfin adını daşıyır, qaytarılan tipi yoxdur və sahələri ilkin qiymətlərlə doldurur.
thiscari obyektdir;this(...)isə eyni sinfin başqa konstruktorunu çağırır.- İnkapsulyasiya: sahələr
private, çıxış isə yoxlama aparan getter, setter və metodlarla. staticsahə bütün obyektlər üçün ortaqdır; obyekt dəyişənləri isə istinaddır.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.