Java-da miras


JavaBaxılıb 160

Sistem dizaynı ilə bağlı müsahibə sualları o qədər açıq ola bilər ki, düzgün hazırlaşmağı bilmək çox çətindir. İndi satın aldıqdan sonra Amazon, Microsoft və Adobe-nin dizayn dövrlərini sındıra bilirəm Bu kitabı. Gündəlik bir yenidən nəzərdən keçirin dizayn sualı və söz verirəm ki, dizayn dövrünü sındıra bilərsiniz.

Java-da irsiyyət, Obyekt yönümlü bir proqramlaşdırma sisteminin (OOP) ən vacib xüsusiyyətlərindən biridir. Əvvəlki təlimdə mirasın ümumi icmalını gördük Java-da OOP konsepsiya. Bu dərsdə java-dakı miras və onun növü barədə müxtəlif nümunələrlə ətraflı məlumat alacağıq.

Java-da miras nədir

Java-da irsiyyət, bir sinifin metodlarını və dəyişənlərini başqa bir sinifdə yenidən istifadə etməyə kömək edən bir xüsusiyyətdir. Başqa sözlə, yeni bir sinifə kodu yenidən yazmadan mövcud bir sinifin xüsusiyyətlərini və funksiyalarını miras almağa imkan verir. Bu həyata keçirir ana-övlad münasibət. Bu o deməkdir ki, uşaq sinfi birbaşa ana sinifin dəyişənlərini və funksiyalarını yenidən istifadə edə bilər.

Java mirasındakı terminologiyalar

Aşağıda javada mirasla bağlı istifadə olunan ümumi terminlər verilmişdir.

Super sinif - Bu valideyn sinif və ya baza yeni bir sinifin xüsusiyyətlərini və ya metodlarını miras aldığı sinif.

Alt sinif - Ana sinfi uzadan sinif bir alt sinifdir və ya uşaq sinif.

uzanır - mirası dəstəkləyən bir söz

super - açar söz bir ana sinifin metodunu, konstruktorunu və ya dəyişənini ifadə edən.

Mirasın xüsusiyyətləri

  • Bir sinifin mövcud kodunu yenidən istifadə etmək bacarığı
  • Metodu ləğv etməyi dəstəkləyir
  • Alt sinifin metodları daxilində super sinif metodlarına zəng etməyə imkan verir super açar söz.
  • Son sinfi miras almağa və ya son metodları ləğv etməyə imkan vermir.
  • İnterfeyslərdən istifadə edərək çoxsaylı irsi dəstəkləyir.

sintaksis

class A {
 //code 
} 
class B extends class A { 
 //code
 }

A sinfi baza sinif və B sinfi uşaq əsas sinfi uzadan sinif. -Dən istifadə edərək javada miras tətbiq edə bilərik uzanır açar söz.

Java miras nümunəsi

Aşağıda adla ana sinif yaratdığımız javada sadə bir miras nümunəsi verilmişdir Vehicle və uşaq sinfi kimi Avtomobil.

Ana sinifdə bir dəyişən elan etdik ad və 3 fərqli metod müəyyən etmişdir.

Açar sözdən istifadə edərək ana sinfi genişləndirərək uşaq sinifində bu metodları miras ala bilərik uzanır. Bu şəkildə dəyişənlərə və metodlara birbaşa bu vəziyyətdə olan uşaq sinfi obyektindən istifadə edərək daxil ola bilərik c. Diqqət yetirsəniz, dəyişkənliyi yenidən elan etməyə və ya uşaq sinifindəki metodları yenidən təyin etməyə ehtiyacımız yoxdur.

Bu nümunədən bir avtomobilin java təriflərində miras mənasını verən bir vasitə olduğunu söyləyə bilərik münasibətdir.

/* Faylın adı: Vehicle.java * /

public class Vehicle {
  String name;
  
  public void startVehicle() {
    System.out.println("Starting the vehicle");
  }
  
  public void applyBrakes() {
    System.out.println("Apply brakes");
  }
  
  public void stopVehicle() {
    System.out.println("Stopping the vehicle");
  }
  
}

/ * Fayl adı: Car.java * /

public class Car extends Vehicle{

  public static void main(String[] args) {
    Car c = new Car();
    c.name = "BMW";
    System.out.println("Vehicle name: " + c.name);
    c.startVehicle();
    c.applyBrakes();
    c.stopVehicle();

  }

}
Vehicle name: BMW
Starting the vehicle
Apply brakes
Stopping the vehicle

Bizə daxil ola bilərik müdafiəictimai birbaşa uşaq sinfində bir ana sinifinin dəyişənləri. Lakin, ana sinifdəki bir dəyişən varsa xüsusi, o zaman bu dəyişənə birbaşa hər sinifdən deyil, eyni sinif daxilində daxil ola bilərik. Bir valideyn sinfinin xüsusi dəyişənlərinə daxil olmaq lazımdırsa, istifadə etməliyik alıcıqurucu uşaq sinfində valideyn sinfinin metodları.

Bunu eyni nümunə ilə, lakin dəyişəni elan edərək başa düşək ad as özəl. Bu vəziyyətdə, c.name-dən birbaşa istifadə edə bilmərik, çünki “dəyişən görünmür” səhvini verəcəkdir. Buna görə dəyişən dəyəri almaq və dəyəri təyin etmək üçün getName və setName metodlarından istifadə etməliyik. Şəxsi, ictimai və qorunan hamısıdır giriş dəyişdiriciləri və ayrı-ayrı təlimlərdə onları müzakirə edəcəyik.

// Ana sinif

public class Vehicle {
  private String name;
  
  public void startVehicle() {
    System.out.println("Starting the vehicle");
  }
  
  public void applyBrakes() {
    System.out.println("Apply brakes");
  }
  
  public void stopVehicle() {
    System.out.println("Stopping the vehicle");
  }
  
  public void setName(String name) {
    this.name = name;
  }
  
  public String getName() {
    return name;
  }
}

// Uşaq sinfi

public class Car extends Vehicle{

  public static void main(String[] args) {
    Car c = new Car();
    c.setName("BMW");
    System.out.println("Vehicle name: " + c.getName());
    c.startVehicle();
    c.applyBrakes();
    c.stopVehicle();

  }

}
Vehicle name: BMW
Starting the vehicle
Apply brakes
Stopping the vehicle

Miras növü

Javada mirasPin

Tək miras

Bu, java-da bir sinifin başqa bir sinfi genişləndirdiyi sadə bir miras növüdür. Təsviri nümayəndəlikdən A sinfinin əsas sinif, B sinfinin alt sinif olduğunu başa düşə bilərik.

Vahid

Tək miras nümunəsi

Bu nümunədə, ana sinifdə bir dəyişən və bir metod var. Uşaq sinifinin obyektindən istifadə edərək uşaq sinifindən buna daxil ola bilərik.

/ * Fayl adı: SingleA.java * /

public class SingleA {
  public String baseclass;
  
  public void singlebaseclass() {
    System.out.println("Base class method");
  }
}

/ * Fayl adı: SingleB.java * /

public class SingleB extends SingleA {
  public void singlechildclass() {
    System.out.println("Child class method");
  }

  public static void main(String[] args) {
    SingleB b = new SingleB();
    b.baseclass = "Base class name";
    System.out.println(b.baseclass);
    b.singlebaseclass(); //calls parent method
    b.singlechildclass(); //calls child method
  }

}
Base class name
Base class method
Child class method

Çoxsəviyyəli Miras

Java'daki bu cür mirasda, uşaq sinfi özü başqa bir sinifin bir ana sinfi olur. Aşağıdakı diaqramdan başa düşə bilərik ki, A sinfi ana sinifdir, B sinifi uşaq sinfi. Ancaq B sinifi yenidən uşaq sinfi olan C sinfinin ana sinifidir.

Çoxsəviyyəli

Çox səviyyəli miras nümunəsi

Aşağıdakı bu nümunədə 3 sinif yaratdıq. MultiA ana sinifdir MultiBMultiB -ın ana sinfi MultiC. Bu, multiA-nın MultiC-nin babası olduğu mənasını verir. Buna görə MultiC sinfi MutliA sinifinin metodlarına və dəyişənlərinə belə daxil ola bilər.

Nənə və babanın sinfi: / * Faylın adı: MultiA.java * /

public class MultiA {
  public void methodA() {
    System.out.println("Method A");
  }
}

Ana sinif: / * Fayl adı: MultiB.java * /

public class MultiB extends MultiA {
  public void methodB() {
    System.out.println("Method B");
  }
}

Uşaq sinfi: / * Fayl adı: MultiC.java * /

public class MultiC extends MultiB{
  public void methodC() {
    System.out.println("Method C");
  }
  public static void main(String[] args) {
    MultiC c = new MultiC();
    c.methodA();
    c.methodB();
    c.methodC();

  }

}
Method A
Method B
Method C

Hiyerarşik miras

Java-da bu növ mirasda eyni ana sinif birdən çox uşaq sinifinə sahib ola bilər. Aşağıdakı şəkildən A sinfinin həm B sinfinin, həm də C sinifinin ana sinfi olduğunu başa düşə bilərik. Sadə sözlə, A sinifi ana, B sinfi və C sinfi isə qardaşdır.

İyerarxikPin

Hiyerarşik miras nümunəsi

Aşağıdakı nümunədən hər iki uşaq sinifinin də daxil ola biləcəyini görə bilərik metod A ana sinif.

/ * Ana sinif * /

public class HierarchyA {
  public void methodA() {
    System.out.println("Method A");
  }
}

/ * Uşaq sinfi * /

public class HierarchyB extends HierarchyA {

  public void methodB() {
    System.out.println("Method B");
  }
  public static void main(String[] args) {
    HierarchyB b = new HierarchyB();
    b.methodA();
    b.methodB();

  }

}
Method A
Method B

/ * Uşaq sinfi * /

public class HierarchyC extends HierarchyA{
  public void methodC() {
    System.out.println("Method C");
  }
  public static void main(String[] args) {
    HierarchyC c = new HierarchyC();
    c.methodA();
    c.methodC();

  }

}
Method A
Method C

Hibrid miras

Hibrid birləşmə olan bir şey deməkdir. Eyni şəkildə, java-dakı miras 1-dən çox növün birləşməsinə sahib ola bilər. Bu nümunədə A sinifinin B sinifinin və C sinifinin valideyn olduğunu görə bilərik ki, bu da hiyerarşik bir mirasdır. Ancaq B sinfi, tək miras olan D Sınıfının ana babasıdır. Bunu B səviyyəli A sinifinin uşaq sinfi olduğundan çox səviyyəli deyə bilərik.

 

HibridPin

Hibrid irs nümunəsi

Bu nümunə java-da hibrid mirasın başa düşülməsinə kömək edəcəkdir. classB classA və classB metodlarına giriş imkanı var. classC classC və classA metodlarına giriş imkanı var. classD classB və classA metodlarına giriş imkanı var. ClassD yeganə classB-ni genişləndirsə də, classA metodlarına daxil ola bilər, çünki classA classB-in ana sinfi olur.

class classA {
  public void methodA() {
    System.out.println("Method A");
  }
}

class classB extends classA {
  public void methodB() {
    System.out.println("Method B");
  }
}

class classC extends classA {
  public void methodC() {
    System.out.println("Method C");
  }
  
}

class classD extends classB {
  public void methodD() {
    System.out.println("Method D");
  }
}
public class HybridExample {

  public static void main(String[] args) {
    classB b = new classB();
    classC c = new classC();
    classD d = new classD();
    System.out.println("Calling from class B");
    b.methodA();
    b.methodB();
    System.out.println("Calling from class C");
    c.methodA();
    c.methodC();
    System.out.println("Calling from class D");
    d.methodA();
    d.methodB();
    d.methodD();

  }

}
Calling from class B
Method A
Method B
Calling from class C
Method A
Method C
Calling from class D
Method A
Method B
Method D

Birdən çox miras - javada dəstəklənmir

Java, icra zamanı yaratdığı mürəkkəblik və qeyri-müəyyənlik səbəbindən çoxlu mirası dəstəkləmir. Birdən çox miras, bir sinifin 1-dən çox sinfi genişləndirə biləcəyi deməkdir. Başqa sözlə, bir uşaq sinifində 1-dən çox valideyn sinfi ola bilər. Bunu real həyatla müqayisə etsək, bunu başa düşə bilərik. Bir uşağın 1-dən çox anası olması mümkün deyil. Eyni şəkildə, java-da miras, 1-dən çox valideynə sahib olan 1 uşaq sinfi ola bilməz.

Çoxlu mirasPin

 

Məsələn, javada buna icazə verilibsə, aşağıdakı nümunəni nəzərdən keçirin. Obj.show () - yı çağırdığımızda, hər iki sinifdə olduğu üçün hansı sinif metoduna zəng edəcəyimizi bilmir.

Birdən çox miras C ++ dilində dəstəklənir. Java-da, bu təlimatı sonuna qədər görəcəyimiz interfeyslərdən istifadə edərək bu konsepsiyanı həyata keçirə bilərik.

class classA {
  public void show() {
    System.out.println("Class A");
  }
}
class classB {
  public void show() {
    System.out.println("Class B");
  }
}

public class MultipleInheritance extends classA,classB { //Suppose if allowed

  public static void main(String[] args) {
    MultipleInheritance obj = new MultipleInheritance();
    obj.show();

  }

}
Compile time error

Java mirasında qurucu

Java-da mirasda konstruktorlardan istifadə edə bilərik. Bir konstruktor, bir sinifin yaradılması zamanı çağırılan xüsusi bir metoddur. Siz müraciət edə bilərsiniz Javada konstruktorlar inşaatçılar haqqında daha çox məlumat əldə etmək üçün təlimat.

Java mirasında, konstruktor həm ana sinifdə, həm də uşaq sinifində olduqda, əvvəlcə ana sinifin konstruktoru dolayısı ilə çağırılır və bundan sonra uşaq sinfindəki konstruktoru çağırır. -Dən istifadə edərək açıq şəkildə super sinifin qurucusuna zəng edə bilərik super açar söz. Əgər istifadə etsək super açar söz, o zaman bu uşaq konstruktorun ilk ifadəsi olmalıdır. Əcdad sinifinə zəng etmək üçün super açar sözdən istifadə edə bilmərik. Yalnız birbaşa ana sinif üçün istifadə edə bilərik.

Aşağıdakı bir nümunə ilə bunu başa düşək. İşçi sinfi konstruktoru olan ana sinifdir, Developer də konstruktoru olan uşaq sinfi. İndi Developer üçün bir obyekt yaratdığımız zaman, daxili olaraq Employee konstruktoru adlandırdığı Developer sinfinin qurucusunu çağırır. Buna görə əvvəlcə İşçi konstruktorunu, ardından Developer konstruktorunu yazdırır.

mirasda qurucuPin

class Employee {
  
  Employee() {
    System.out.println("I am an employee");
  }
}
public class Developer extends Employee {
  
  Developer() {
    System.out.println("I am a developer");
  }
  
  public static void main(String[] args) {
    Developer d = new Developer();
    System.out.println("This is an example of constructors in inheritance");
  }

}
I am an employee
I am a developer
This is an example of constructors in inheritance

Aşağıda göstərildiyi kimi üst sinif konstruktorunu eyni nəticəni verəcək şəkildə açıq şəkildə çağırmaq üçün super açar sözdən də istifadə edə bilərik.

class Employee {
  
  Employee() {
    System.out.println("I am an employee");
  }
}
public class Developer extends Employee {
  
  Developer() {
    super();
    System.out.println("I am a developer");
  }
  
  public static void main(String[] args) {
    Developer d = new Developer();
    System.out.println("This is an example of constructors in inheritance");
  }

}

Java varisliyində ləğv etmə üsulu

Həm ana sinif, həm də uşaq sinfi eyni imza ilə eyni metod adlarına sahib olduqda, buna a üsulu ləğv etmək. Java-da miras dəstəkləyir üsul super açar sözdən istifadə edərək ləğv etmək. Ana sinif metoduna zəng etmək istədikdə, super açar sözdən istifadə edərək zəng edə bilərik.

Aşağıda, ana sinifdə mövcud olan eyni dəyişən ada və eyni metod adına daxil olmaq üçün super açar sözdən istifadə sintaksisidir.

super.variablename;
super.methodname();


Aşağıdakı nümunədə eyni üsula sahibik getEmpid həm valideyn, həm də uşaq sinifində. Burada, Əməkdaş ana sinifdir və Developer uşaq sinifidir. Uşaq sinfi metodu daxilində super açar sözdən istifadə edərək ana sinif metoduna zəng edirik.

class Employee {
  public int empid = 111;
  Employee() {
    System.out.println("I am an employee");
  }
  public void getEmpid() {
    System.out.println("Employee id: " + empid);
  }
}
public class Developer extends Employee {
  
  public int empid = 123;
  Developer() {
    System.out.println("I am a developer");
  }
   public void getEmpid() {
     super.getEmpid();
     System.out.println("Developer id: " + empid);
   }
  
  public static void main(String[] args) {
    Developer d = new Developer();
    d.getEmpid();
    System.out.println("This is an example of method overriding in inheritance");
  }

}

I am an employee
I am a developer
Employee id: 111
Developer id: 123
This is an example of method overriding in inheritance

Java mirasındakı interfeys

İstifadə edə bilərik interface javada çoxlu miras konsepsiyasını həyata keçirmək. Əvvəlki dərsdə öyrəndiyimiz OOPs konsepsiyalarını xatırlatmaq üçün yalnız bir interfeysdə metod bəyannaməsini təqdim etdiyimiz abstraksiya əldə etmək üçün bir interfeysdən istifadə edilə biləcəyini gördük. İnterfeysi həyata keçirən sinif metodun həyata keçirilməsini təmin edir.

Java bir sinifin birdən çox interfeys tətbiq etməsinə imkan verir. Bu şəkildə birdən çox miras konsepsiyasını dəstəkləyir.

Aşağıda, javada çoxlu mirasda bir interfeysin istifadəsini göstərmək üçün sadə bir proqram var. 2 interfeys təyin etdik hesabƏmanət hər birinin metodu var hesab detallarıdepozit detalları heç bir kodu yoxdur. Sonra bir sinif yaradırıq Müştəri 2 arayüzü tətbiq edən. Bunun üçün açar söz tətbiq edir. Daha sonra bu sinifdəki interfeysdəki bütün metodların funksionallığını təmin edirik. Sonra müştəri obyektindən istifadə edərək hər iki üsula daxil ola bilərik.

interface Account {
  public void accountdetails();
}
interface Deposit {
  public void depositdetails();
}
public class Customer implements Account,Deposit {
  public void accountdetails() {
    System.out.println("Account details");
  }
  public void depositdetails() {
    System.out.println("Deposit Details");
  }

  public static void main(String[] args) {
    Customer c = new Customer();
    c.accountdetails();
    c.depositdetails();

  }

}
Account details
Deposit Details

Mirasdakı son söz

Bir sinif olaraq təyin edilirsə yekun, deməli bu sinfi və ya xüsusiyyətlərini və metodlarını miras ala bilməyəcəyimiz deməkdir. Son sinfi uzatmağa çalışsaq, tərtib səhvini alacağıq. Bu səbəbdən java'da miras dəstəklənmir yekun sinif.

public final class SingleA {
  public String baseclass;
  
  public void singlebaseclass() {
    System.out.println("Base class method");
  }
}

public class SingleB extends SingleA {
  public void singlechildclass() {
    System.out.println("Child class method");
  }

  public static void main(String[] args) {
    SingleB b = new SingleB();
    b.baseclass = "Base class name";
    System.out.println(b.baseclass);
    b.singlebaseclass();
    b.singlechildclass();
  }

}
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
  baseclass cannot be resolved or is not a field
  baseclass cannot be resolved or is not a field
  The method singlebaseclass() is undefined for the type SingleB

  at SingleB.main(SingleB.java:8)

Eynilə, elan edilmiş metodu ləğv edə bilmərik final. Aşağıda ana sinifdə son elan olunan metodu ləğv etməyə çalışdığımızda tərtib səhvini atan bir nümunə var. Beləliklə, son metodu ləğv etmək üçün javada mirasdan istifadə edə bilmərik.

class Employee {
  public int empid = 111;
  public final void getEmpid() {
    System.out.println("Employee id: " + empid);
  }
}
public class Developer extends Employee {
  
  public int empid = 123;
   public void getEmpid() {
     super.getEmpid();
     System.out.println("Developer id: " + empid);
   }
  
  public static void main(String[] args) {
    Developer d = new Developer();
    d.getEmpid();
    System.out.println("This is an example of method overriding in inheritance");
  }

}

Error: LinkageError occurred while loading main class Developer
  java.lang.VerifyError: class Developer overrides final method Employee.getEmpid()V

varislik operatoru

Biz istifadə edə bilərsiniz instansiya operatorda javada miras yoxlamaq is-a münasibət. Bunu interfeysdən istifadə edərək edə bilərik.

Aşağıda bir olduğumuz bir nümunə var interface adlı meyvələr. Sonra, a yaradırıq sinif Seasonalfruits tətbiq edir bu meyvə interface. Java-da miras anlayışını göstərmək üçün a yaradırıq sinif Apple uzanır bu Mövsüm meyvələri sinif

İndi obyektlər yaradırıq s və a həm ana sinif (Seasonalfruits), həm də uşaq sinfi (Apple) üçün. İlk məhsul doğrudur, çünki s meyvələrin bir hissəsidir. (interface tətbiqetmə). İkinci nəticə doğrudur, çünki Seasonalfruits-un bir hissəsidir ( vahid irs) və üçüncü nəticə doğrudur, çünki a meyvələrin bir hissəsidir (ana sinif interfeysi tətbiq edir).

interface fruits {
  
}

class Seasonalfruits implements fruits {
  
}
public class Apple extends Seasonalfruits {

  public static void main(String[] args) {
    Seasonalfruits s = new Seasonalfruits();
    Apple a = new Apple();
    System.out.println(s instanceof fruits);
    System.out.println(a instanceof Seasonalfruits);
    System.out.println(a instanceof fruits);
  }

}
true
true
true

arayış

Crack Sistemi Dizayn Müsahibələri
Translate »
1