2010-01-20 49 views

Trả lời

9

sẽ có những lúc bạn có một số khởi tạo chung của các biến mẫu mà tất cả các lớp kế thừa cần phải thiết lập. Bạn khởi tạo một lớp trừu tượng khi bạn mở rộng nó và lớp bê tông đó có một hàm tạo sẽ cung cấp các tham số cho hàm tạo của lớp trừu tượng.

+2

Ví dụ là javax.swing.AbstractAction –

5

Chúng vẫn có thể được gọi bởi các hàm tạo của các lớp kế thừa từ đó, làm cho việc tái cấu trúc mã sử dụng tốt để có một hàm tạo trong lớp trừu tượng.

3

Nếu bạn có các trường cuối cùng chưa được khởi tạo trong lớp trừu tượng, bạn cần phải khởi tạo chúng trong một hàm tạo.

Ví dụ:

abstract class A { 
    final int x; 
} 

sẽ không biên dịch nếu không có một hàm tạo gán cho x.

3

Nếu lớp học của bạn không khai báo hàm tạo, javac sẽ tạo một hàm tạo no-arg, do-nothing cho bạn. Sau đó, khi lớp con của bạn được khởi tạo, nó sẽ gọi hàm tạo non-op được tạo ra và cuộc sống là tốt.

Tuy nhiên, nếu lớp của bạn khai báo bất kỳ hàm tạo nào, javac sẽ KHÔNG tạo một cho bạn. Trong trường hợp đó, hàm tạo lớp con cần gọi một cách rõ ràng hàm khởi tạo của lớp cha. Nếu không, bạn sẽ không thể khởi tạo thành viên của lớp cha, như câu trả lời ở trên đề cập đến.

2

Các nhà xây dựng cho các lớp trừu tượng được sử dụng bởi các lớp con (được gọi từ các hàm tạo lớp con sử dụng super(params)).

Bạn nên thực hiện các công cụ xây dựng này protected để làm rõ điều đó.

2

Bạn không khởi tạo các lớp trừu tượng nhưng hàm tạo được gọi khi một lớp con được khởi tạo.

Việc sử dụng có thể là để khởi tạo các thuộc tính phổ biến tức là.

import java.util.List; 
import java.util.ArrayList; 
abstract class BaseClass { 
    protected List list; // visible from subclasses 

    public BaseClass() { 
     System.out.println("to abstract..."); 
     // common initialization to all subclasses 
     list = new ArrayList(); 
     list.add("a"); 
     list.add("a"); 
     list.add("a"); 
    } 
} 

class ConcreteClass extends BaseClass { 
    public ConcreteClass(){ 
     // The list is initialized already 
     System.out.println("now it is concrete and the list is: = "+ this.list); 


    } 
} 

class TestAbstractClass { 
    public static void main(String [] args) { 
     BaseClass instance = new ConcreteClass(); 
    } 

} 

Output

$ java TestAbstractClass 
to abstract... 
now it is concrete and the list is: = [a, a, a] 
1

De-sao chép phổ biến kiến ​​thức/hành vi.

Ví dụ: một chiếc xe: tất cả các xe của bạn sẽ được xây dựng ra khỏi một cơ thể và bốn bánh xe và một động cơ. Vì vậy, bạn làm điều này một phần của việc xây dựng trong constructor cho lớp Car trừu tượng bằng cách gọi các hàm như Body(), Wheel (int x), Engine(). Mỗi lớp xe cụ thể sẽ có việc thực hiện riêng Body(), Wheel() và Engine() - nhưng tất cả họ sẽ thực hiện các bước tương tự để xây dựng chiếc xe từ họ, vì vậy không cần lặp lại các bước đó trong mỗi các lớp học. Trong trường hợp này, bạn thực hiện hành vi chung đó trong tổ tiên.

-1

Tôi đồng ý, Constructors được tạo giả định sẽ có các phiên bản. Nếu bạn có nhiều mã chung, bạn có thể nghĩ đến việc tạo một Constructor nhưng tốt hơn là nên đặt nó theo phương thức init().

+1

đây là lời khuyên không tốt, sau đó mọi lớp vô tính cần phải nhớ gọi siêu.init() và nó được nhanh chóng lộn xộn, đây là lời khuyên không chuẩn và thực sự xấu. –

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