2010-03-03 76 views
23

Đây là câu hỏi được đặt ra trong cuộc phỏng vấn. Chúng ta có thể gọi một hàm khởi tạo từ một hàm khác nếu một lớp có nhiều hàm tạo trong java và khi nào?gọi một hàm khởi tạo từ một hàm khác trong java

+0

Bạn có thể làm rõ các câu hỏi? Nhiều nhà xây dựng ở đó để tạo ra các đối tượng khác nhau và có thể được gọi từ các lớp khác.Chúng được tạo ra chỉ vì mục đích đó. –

+4

anh ta có nghĩa là gọi một nhà xây dựng từ một người khác. – Woot4Moo

+0

anh ta hỏi liệu nó có được phép gọi một nhà xây dựng từ một nhà xây dựng khác hay không khi nào một lớp có nhiều hơn một nhà xây dựng – Francis

Trả lời

36

Bạn có thể, và cú pháp tôi biết là

this(< argument list >); 

Bạn cũng có thể gọi một lớp siêu constructor qua

super(< argument list >); 

Cả các cuộc gọi như vậy chỉ có thể được thực hiện như là câu lệnh đầu tiên trong hàm tạo (vì vậy bạn chỉ có thể gọi một hàm tạo khác, và trước khi bất cứ điều gì khác được thực hiện).

+6

Và bạn không thể làm bất cứ điều gì đòi hỏi một tham chiếu đến điều này. –

+0

nó cũng phải ở dòng đầu tiên của hàm tạo – sixtyfootersdude

+0

có, dòng đầu tiên để nó sẽ là người đầu tiên được triển khai – Francis

6
this(other, args); 
+3

Điều này hoặc là gây hiểu lầm hoặc chỉ đơn giản là sai! Cái gì khác? Bạn đơn giản gọi phương thức khởi tạo khác bằng cách sử dụng 'this (args-required-by-constructor)' hoặc 'super (args-required-by-constructor);' –

5

dụ:

public class FileDb { 

    /** 
    * 
    */ 
    public FileDb() { 
    this(null); 
    } 

    public FileDb(String filename) { 
    // ... 
    } 

} 
9

Có, bạn có thể làm điều đó.

Có xem xét việc thực hiện ArrayList ví dụ:

public ArrayList(int initialCapacity) { 
    super(); 
    if (initialCapacity < 0) 
     throw new IllegalArgumentException("Illegal Capacity: "+ 
              initialCapacity); 
    this.elementData = new Object[initialCapacity]; 
} 

/** 
* Constructs an empty list with an initial capacity of ten. 
*/ 
public ArrayList() { 
    this(10); 
} 

Các constructor thứ hai gọi là một đầu tiên với một default capacity của mười.

7

FYI, đây được gọi là telescoping/telescopic constructor pattern.

Nó được thảo luận trong JLS 8.8.7.1 Explicit Constructor Invokations

  • lời gọi constructor thay thế bắt đầu với từ khóa this (có thể mở đầu với các đối số kiểu tường minh). Chúng được sử dụng để gọi một hàm tạo thay thế của cùng một lớp.
  • Gọi hàm khởi tạo Superclass bắt đầu bằng từ khóa super (có thể được bắt đầu bằng đối số loại rõ ràng) hoặc biểu thức Chính. Chúng được sử dụng để gọi một hàm tạo của lớp cha trực tiếp.
9

Không có câu trả lời nào hoàn tất, vì vậy tôi sẽ thêm câu trả lời này vào ô trống.

Bạn có thể gọi một constructor từ khác trong cùng một lớp, hoặc gọi lớp siêu, với những hạn chế sau:

  1. Nó phải được dòng đầu tiên của mã trong constructor gọi.
  2. Nó không thể có bất kỳ tham chiếu rõ ràng hoặc ngầm định nào cho this. Vì vậy, bạn không thể vượt qua một lớp bên trong (ngay cả một lớp ẩn danh nếu nó tham chiếu bất kỳ phương thức thể hiện nào), hoặc kết quả của một cuộc gọi phương thức không tĩnh, như một tham số.

Cú pháp (như đã đề cập bởi những người khác) là:

MyClass() { 
    someInitialization(); 
} 

MyClass(String s) { 
    this(); 
    doSomethingWithS(s); 
} 
Các vấn đề liên quan