CodeGym/Blog Java/Ngẫu nhiên/Hàm tạo của lớp cơ sở

Hàm tạo của lớp cơ sở

Xuất bản trong nhóm
CHÀO! Lần trước chúng ta đã nói về các nhà xây dựng và đã học được rất nhiều điều về chúng. Bây giờ chúng ta sẽ nói về các hàm tạo của lớp cơ sở .
Hàm tạo của lớp cơ sở - 1
Lớp cơ sở là gì ? Nó liên quan đến thực tế là trong Java, một số lớp khác nhau có thể có một nguồn gốc chung.
Hàm tạo của lớp cơ sở - 2
Điều này được gọi là thừa kế . Một số lớp con có thể có một tổ tiên chung. Ví dụ, hãy tưởng tượng rằng chúng ta có một Animallớp:
public class Animal {

   String name;
   int age;
}
Chúng ta có thể khai báo 2 lớp con: CatDog. Điều này được thực hiện bằng cách sử dụng từ khóa kéo dài .
public class Cat extends Animal {

}

public class Dog extends Animal {

}
Chúng tôi có thể thấy điều này hữu ích trong tương lai. Ví dụ, nếu có nhiệm vụ bắt chuột, chúng ta sẽ tạo một Cat đối tượng trong chương trình của mình. Nếu nhiệm vụ là đuổi theo một cây gậy, thì chúng ta sẽ sử dụng một Dog đồ vật. Và nếu chúng ta tạo một chương trình mô phỏng phòng khám thú y, nó sẽ hoạt động với cả Animal lớp (và do đó có thể chữa bệnh cho cả mèo và chó). Điều rất quan trọng cần nhớ là khi một đối tượng được tạo, hàm tạo của lớp cơ sở của nó được gọi đầu tiên . Chỉ sau khi hàm tạo đó kết thúc, chương trình mới thực thi hàm tạo của lớp tương ứng với đối tượng mà chúng ta đang tạo. Nói cách khác, khi tạo một Catđối tượng, hàm Animaltạo được chạy trước và chỉ sau đó mới được chạy.Cathàm tạo được thực thi . Để thấy điều này, hãy thêm một số đầu ra của bảng điều khiển vào các hàm tạo CatAnimal.
public class Animal {

   public Animal() {
       System.out.println("Animal constructor executed");
   }
}


public class Cat extends Animal {

   public Cat() {
       System.out.println("Cat constructor executed!");
   }

   public static void main(String[] args) {
       Cat cat = new Cat();
   }
}
Đầu ra của bảng điều khiển: Hàm tạo động vật được thực thi Hàm tạo của mèo được thực thi! Thật vậy, nó hoạt động theo cách đó! Tại sao? Một lý do là để tránh trùng lặp các trường được chia sẻ giữa hai lớp. Ví dụ, mọi con vật đều có tim và não, nhưng không phải con vật nào cũng có đuôi. Chúng ta có thể khai báo các trường nãotim , chung cho tất cả các loài động vật, trong Animallớp cha và trường đuôi trong Catlớp con. . Bây giờ chúng ta sẽ khai báo một Cathàm tạo lớp nhận đối số cho cả 3 trường.
public class Cat extends Animal {

   String tail;

   public Cat(String brain, String heart, String tail) {
       this.brain = brain;
       this.heart = heart;
       this.tail = tail;
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
Lưu ý: Hàm tạo hoạt động chính xác mặc dù lớp Catkhông có trường brain and heart . Các trường này được "kế thừa" từ Animallớp cơ sở. Lớp kế thừa có quyền truy cập vào các trường của lớp cơ sở , vì vậy chúng hiển thị trong Catlớp của chúng ta. Do đó, chúng ta không cần sao chép các trường này trong Catlớp. Chúng ta có thể lấy chúng từ Animallớp học. Hơn nữa, chúng ta có thể gọi hàm tạo của lớp cơ sở một cách rõ ràng trong hàm tạo của lớp con. Lớp cơ sở còn được gọi là " lớp cha ". Đó là lý do tại sao Java sử dụng từ khóa super để chỉ lớp cơ sở. Trong ví dụ trước
public Cat(String brain, String heart, String tail) {
       this.brain = brain;
       this.heart = heart;
       this.tail = tail;
   }
Chúng tôi đã chỉ định riêng từng trường trong lớp cha của chúng tôi. Chúng tôi không thực sự phải làm điều này. Chỉ cần gọi hàm tạo của lớp cha và chuyển các đối số cần thiết là đủ:
public class Animal {

   String brain;
   String heart;

   public Animal(String brain, String heart) {
       this.brain = brain;
       this.heart = heart;
   }

public class Cat extends Animal {

   String tail;

   public Cat(String brain, String heart, String tail) {
       super(brain, heart);
       this.tail = tail;
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
Trong Cathàm tạo, chúng tôi đã gọi Animalhàm tạo và chuyển hai trường. Chúng tôi chỉ có một trường để khởi tạo rõ ràng: tail , không có trong Animal. Hãy nhớ rằng chúng tôi đã đề cập rằng hàm tạo của lớp cha được gọi đầu tiên khi một đối tượng được tạo? Đó là lý do tại sao super() phải luôn ở vị trí đầu tiên trong hàm tạo! Nếu không, logic của hàm tạo sẽ bị vi phạm và chương trình sẽ phát sinh lỗi.
public class Cat extends Animal {

   String tail;

   public Cat(String brain, String heart, String tail) {
       this.tail = tail;
       super(brain, heart);// Error!
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
Trình biên dịch biết rằng khi một đối tượng của lớp con được tạo, hàm tạo của lớp cơ sở sẽ được gọi trước. Và nếu bạn cố thay đổi hành vi này theo cách thủ công, trình biên dịch sẽ không cho phép.

Cách một đối tượng được tạo ra

Trước đây chúng ta đã xem xét một ví dụ với lớp cơ sở và lớp cha: AnimalCat. Sử dụng hai lớp này làm ví dụ, bây giờ chúng ta sẽ xem xét quá trình tạo một đối tượng và khởi tạo các biến. Chúng tôi biết rằng có các biến tĩnhbiến thể hiện (không tĩnh) . Chúng ta cũng biết rằng Animallớp cơ sở có các biến và Catlớp con có biến riêng. Để rõ ràng, chúng ta sẽ thêm một biến tĩnh vào mỗi lớp AnimalCat. Biến animalCount trong lớp sẽ đại diện cho tổng số loài động vật trên Trái đất catCountAnimalbiến sẽ biểu thị số lượng loài mèo. Ngoài ra, chúng tôi sẽ gán các giá trị bắt đầu cho tất cả các biến không tĩnh trong cả hai lớp (sau đó sẽ được thay đổi trong hàm tạo).
public class Animal {

   String brain = "Initial value of brain in the Animal class";
   String heart = "Initial value of heart in the Animal class";

   public static int animalCount = 7700000;

   public Animal(String brain, String heart) {
       System.out.println("Animal base class constructor is running");
       System.out.println("Have the variables of the Animal class already been initialized?");
       System.out.println("Current value of static variable animalCount = " + animalCount);
       System.out.println("Current value of brain in the Animal class = " + this.brain);
       System.out.println("Current value of heart in the Animal class = " + this.heart);
       System.out.println("Have the variables of the Cat class already been initialized?");
       System.out.println("Current value of static variable catCount = " + Cat.catCount);

       this.brain = brain;
       this.heart = heart;
       System.out.println("Animal base class constructor is done!");
       System.out.println("Current value of brain = " + this.brain);
       System.out.println("Current value of heart = " + this.heart);
   }
}

public class Cat extends Animal {

   String tail = "Initial value of tail in the Cat class";

   static int catCount = 37;

   public Cat(String brain, String heart, String tail) {
       super(brain, heart);
       System.out.println("The cat class constructor has started (The Animal constructor already finished)");
       System.out.println("Current value of static variable catCount = " + catCount);
       System.out.println("Current value of tail = " + this.tail);
       this.tail = tail;
       System.out.println("Current value of tail = " + this.tail);
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
Vì vậy, chúng tôi đang tạo một thể hiện mới của Catlớp, kế thừa Animal. Chúng tôi đã thêm một số đầu ra bảng điều khiển chi tiết để xem điều gì đang xảy ra và theo thứ tự nào. Đây là những gì sẽ được hiển thị khi một Catđối tượng được tạo: Hàm tạo của lớp cơ sở Animal đang chạy Các biến của lớp Animal đã được khởi tạo chưa? Giá trị hiện tại của biến tĩnh animalCount = 7700000 Giá trị hiện tại của brain trong lớp Animal = Giá trị ban đầu của brain trong lớp Animal Giá trị hiện tại của heart trong lớp Animal = Giá trị ban đầu của heart trong lớp Animal Đã có các biến của lớp Cat rồi đã được khởi tạo? Giá trị hiện tại của biến tĩnh catCount = 37 Hàm tạo của lớp cơ sở Animal đã hoàn tất! Giá trị hiện tại của brain = Brain Giá trị hiện tại heart = Heart Hàm tạo của lớp mèo đã bắt đầu (Hàm tạo Animal đã hoàn thành) Giá trị hiện tại của biến tĩnh catCount = 37 Giá trị hiện tại của đuôi = Giá trị ban đầu của đuôi trong lớp Cat Giá trị hiện tại của đuôi = Đuôi Vì vậy, bây giờ chúng ta có thể thấy rõ thứ tự khởi tạo biến và gọi hàm tạo khi một đối tượng mới được tạo:
  1. Các biến tĩnh của lớp cơ sở ( Animal) được khởi tạo. Trong trường hợp của chúng tôi, biến động vậtCountAnimal của lớp được đặt thành 7700000.

  2. Các biến tĩnh của lớp con ( Cat) được khởi tạo.

    Lưu ý: chúng tôi vẫn đang ở bên trong Animalhàm tạo và chúng tôi đã hiển thị:

    Hàm tạo của lớp cơ sở Animal đang chạy
    Các biến của lớp Animal đã được khởi tạo chưa?
    Giá trị hiện tại của biến tĩnh animalCount = 7700000
    Giá trị hiện tại của brain trong lớp Animal = Giá trị ban đầu của brain trong lớp Animal Giá trị
    hiện tại của heart trong lớp Animal = Giá trị ban đầu của heart trong lớp Animal
    Đã có các biến của lớp Cat rồi đã được khởi tạo?
    Giá trị hiện tại của biến tĩnh catCount = 37


  3. Sau đó, các biến không tĩnh của lớp cơ sở được khởi tạo. Chúng tôi đã chỉ định cụ thể cho chúng các giá trị ban đầu, sau đó các giá trị này sẽ được thay thế trong hàm tạo. Hàm khởi tạo Animal vẫn chưa kết thúc, nhưng các giá trị ban đầu của brain và heart đã được gán:

    Hàm tạo của lớp cơ sở Animal đang chạy
    Các biến của lớp Animal đã được khởi tạo chưa?
    Giá trị hiện tại của biến tĩnh animalCount = 7700000
    Giá trị hiện tại của não trong lớp Động vật = Giá trị ban đầu của não trong lớp Động vật Giá
    trị hiện tại của tim trong lớp Động vật = Giá trị ban đầu của tim trong lớp Động vật


  4. Trình xây dựng của lớp cơ sở bắt đầu.
    Chúng tôi đã tự thuyết phục rằng bước này là bước thứ tư: trong ba bước đầu tiên khi bắt đầu hàm Animaltạo, nhiều biến đã được gán giá trị.


  5. Các trường không tĩnh của lớp con ( Cat) được khởi tạo.
    Điều này xảy ra trước khi Cathàm tạo bắt đầu chạy.
    Khi bắt đầu chạy, biến đuôi đã có giá trị:

    Hàm tạo của lớp mèo đã bắt đầu (Trình tạo của động vật đã hoàn thành) Giá trị hiện tại của biến tĩnh catCount = 37 Giá trị hiện tại của đuôi = Giá trị ban đầu của đuôi trong lớp Cat


  6. Hàm tạo của Catlớp con được gọi

    Và đó là cách tạo một đối tượng trong Java!

    Tôi phải nói rằng chúng ta không phải là những người thích học thuộc lòng, nhưng tốt nhất là nên ghi nhớ thứ tự khởi tạo biến và lệnh gọi hàm tạo .

    Điều này sẽ làm tăng đáng kể sự hiểu biết của bạn về dòng chảy của chương trình và trạng thái của các đối tượng của bạn tại bất kỳ thời điểm cụ thể nào.

    Hơn nữa, nhiều lớp không sử dụng tính kế thừa. Trong trường hợp này, các bước liên quan đến lớp cơ sở không áp dụng.

Bình luận
  • Phổ biến
  • Mới
Bạn phải đăng nhập để đăng nhận xet
Trang này chưa có bất kỳ bình luận nào