2014-04-01 13 views
6

Tôi biết từ ngữ hơi khó hiểu và kỳ lạ, nhưng phải chịu đựng tôi, tôi không biết làm sao để cụm từ ngắn hơn.Trong Java, bạn có thể gọi hàm tạo siêu lớp của lớp cha thông qua hàm tạo của lớp con của lớp cha không?

Giả sử bạn có một lớp được gọi là SuperBlah, và bạn thừa hưởng nó trong một lớp được gọi là Blah sau đó bạn thừa hưởng Blah thành một lớp được gọi là ChildBlah (Vì vậy SuperBlah-Blah-ChildBlah). Sẽ từ khóa super(); sử dụng trong ChildBlah 'constructor s gọi là SuperBlah' constructor s nếu Blah không có một constructor?

Đối với những người bạn nói không, thì tại sao điều này lại hiệu quả? Chúng ta có một lớp được gọi là BlusterBug mở rộng lớp Critter và gọi siêu trong trình xây dựng của BlusterBug. Critter không có một hàm tạo, nhưng lớp mà Critter mở rộng không có một hàm tạo. (Tôi cố tình bỏ qua phần còn lại của mã trên các lớp học)

public class BlusterCritter extends Critter { 
    // instance vaiables 
    private int courageFactor; 
    private static final double DARKENING_FACTOR = 0.05; 
    // create a constructor(include what is necesary for parent) 
    public BlusterCritter(int c) 
    { 
     super(); 
     courageFactor = c; 
    } 

Sau đó, trong lớp Critter, nó không có bất kỳ nhà thầu nào!

public class Critter extends Actor// omitted all the code 
{ 
    /** 
    * A critter acts by getting a list of other actors, processing that list, 
    * getting locations to move to, selecting one of them, and moving to the 
    * selected location. 
    */ 
    public void act() 
    { 
     if (getGrid() == null) 
      return; 
     ArrayList<Actor> actors = getActors(); 
     processActors(actors); 
     ArrayList<Location> moveLocs = getMoveLocations(); 
     Location loc = selectMoveLocation(moveLocs); 
     makeMove(loc); 
    } 

Nhưng sau đó lớp diễn viên có hàm tạo!

public class Actor 
{ 
    private Grid<Actor> grid; 
    private Location location; 
    private int direction; 
    private Color color; 

    /** 
    * Constructs a blue actor that is facing north. 
    */ 
    public Actor() 
    { 
     color = Color.BLUE; 
     direction = Location.NORTH; 
     grid = null; 
     location = null; 
    } 

Và phần lạ nhất? Chương trình làm việc hoàn toàn tốt đẹp và trình biên dịch không làm bắt bất kỳ lỗi! Làm thế nào điều này xảy ra?

+4

Loại câu hỏi này thực sự được trả lời tốt nhất bằng cách chỉ viết các lớp với các câu lệnh in và kiểm tra. Tôi nghĩ rằng bạn có thể nhận được câu trả lời của bạn trong ít hơn 30 dòng mã, và bạn có thể tìm hiểu rất nhiều chi tiết. – merlin2011

+0

** Mọi lớp Java đều có ít nhất một hàm tạo. Nếu nó không khai báo một hàm tạo, nó có một hàm tạo mặc định không nhận tham số và chỉ chứa một lệnh gọi 'super();'. –

Trả lời

3

Nếu Blah không có bất kỳ constructor, trình biên dịch sẽ tạo ra một constructor không tham số ngầm cho Blah đó chỉ là super() --that là, nó sẽ gọi constructor SuperBlah 's.

Vì vậy, khi hàm xây dựng của ChildBlah gọi super(), nó sẽ gọi hàm tạo ngầm này mà trình biên dịch tạo ra cho Blah, kết quả là hàm tạo của SuperBlah được gọi. Vì vậy, theo một nghĩa nào đó, tôi nghĩ câu trả lời cho câu hỏi của bạn là "có".

Nhưng điều này chỉ hoạt động nếu Blah không có nhà xây dựng. (Và trong mã thực tế của bạn, Critter không có bất kỳ nhà xây dựng, vì vậy nó hoạt động.) Nếu bất kỳ nhà thầu khác được định nghĩa cho Blah, nhưng không có truy cập constructor không tham số, sau đó sẽ không phải là một tiềm ẩn constructor không tham số và kết quả sẽ là lỗi khi biên dịch.

+0

Đó là một tính năng thực sự thú vị mà Java đã có. – user3421796

2

Không, nó sẽ không. Nó sẽ gọi hàm tạo ngầm mặc định trong Blah.
Nếu Blah định nghĩa các hàm tạo khác (có tham số) nhưng không có
hàm tạo mặc định, thì điều này sẽ tạo ra lỗi biên dịch.

Ngoài ra, lưu ý rằng các nhà xây dựng không được thừa hưởng
(nếu điều đó liên quan đến bất kỳ cách nào đối với câu hỏi/suy nghĩ của bạn).

0

Nó sẽ gọi hàm tạo của Blah, ném lỗi trình biên dịch nếu Blah không có.

1

Có. Nếu Blah không có bất kỳ nhà xây dựng, nó sẽ gọi mặc định constructor rỗng và transitively nó sẽ gọi phi tham số SuperBlah constructor.

0

No. Các nhà xây dựng không giống như các phương pháp liên quan đến việc ghi đè tùy chọn bởi một lớp trung gian trong cấu trúc phân cấp. Nếu một phương thức cá thể của lớp siêu không được thực hiện trong lớp trung gian, gọi phương thức từ lớp con thông qua super.method() sẽ gọi phương thức siêu lớp. Nhưng một hàm tạo cho mỗi lớp trong hệ thống phân cấp phải được gọi - bạn không thể bỏ qua các hàm tạo của lớp trung gian.

Các vấn đề liên quan