2011-03-19 46 views
5

Nếu có một hàm tạo riêng, thì JVM có chèn một lệnh gọi tới hàm tạo siêu không?sử dụng hàm tạo riêng trong lớp

Tôi đang đề cập đến cuộc gọi super() trong hàm tạo riêng tư đó.

class Alpha { 
    static String s=""; 
    protected Alpha(){ 
     s+="alpha"; 
    } 
} 

class SubAlpha extends Alpha{ 
    private SubAlpha(){ 
     s+="sub"; 
    } 
} 

class SubSubAlpha extends Alpha{ 
    private SubSubAlpha(){ 
     s+="subsubAlpha"; 
    } 

    public static void main(String[] args){ 
     new SubSubAlpha(); 
     System.out.print(s); 
    } 
} 

Ở đây tôi không nhận được bất kỳ lỗi biên dịch nào. Ở đây trong lớp SubSubAlpha có hàm tạo riêng. Là trình biên dịch chèn super() gọi trong đó nếu như vậy, những gì sẽ xảy ra trong lớp SubAlpha. Thậm chí có một hàm tạo riêng. Và nếu đó không phải là truy cập như thế nào cây thừa kế tiếp tục cho đến đầu trang.

+0

(Nếu siêu lớp không-args constructor là tư nhân (và có nguồn gốc lớp không nằm trong cùng lớp bên ngoài, hoặc là lớp truy cập mặc định và lớp dẫn xuất không nằm trong cùng một gói; hoặc chỉ thiếu) sau đó nếu các hàm tạo của lớp dẫn xuất thiếu một 'super()' hoặc 'this()', sau đó họ sẽ không biên dịch. 'class Base {private Base() {} } class Derived mở rộng Base {} ') –

+2

bạn có nghĩa là' lớp SubSubAlpha mở rộng SubAlpha'? –

Trả lời

4

Yes. Nhà xây dựng riêng tư có cuộc gọi super() tiềm ẩn nếu không rõ ràng super hoặc this cuộc gọi hàm tạo. Về mặt này, nó không khác với các nhà xây dựng khác. Đương nhiên, đối với điều này để biên dịch, lớp cha phải có một hàm tạo no-args có thể nhìn thấy được từ lớp.

Tuy nhiên, nếu một hàm tạo là private, thì không thể là được gọi là từ một lớp con ... hoặc từ bất kỳ mã nào khác ngoài chính lớp đó.

-1

Ya, u có thể sử dụng super() để sử dụng hàm và thuộc tính từ lớp cha. giống với bình thường của java

+0

Đó không phải là câu hỏi. – dty

8

Nếu có hàm tạo riêng thì JVM có gọi hàm tạo siêu không?

Các nhà xây dựng siêu sẽ luôn được gọi. (Bạn không thể khởi tạo một lớp học, mà không cần phải khởi tạo lớp siêu cùng một lúc.)

Nếu bạn không tự mình làm rõ, sẽ có một cuộc gọi ngầm được chèn vào cho bạn, bất kể là người tạo là riêng tư hoặc công khai.


Để có kén chọn: Nó thực sự không phải là JVM mà chèn nó, nhưng trình biên dịch Java:

public class Test { 
    private Test() { 
    } 
} 

được biên dịch vào

private Test(); 
    Code: 
    Stack=1, Locals=1, Args_size=1 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 
4

Lý do bạn không gặp phải lỗi biên dịch là phân cấp lớp học của bạn không phải là thứ bạn nghĩ. Tôi nghĩ rằng bạn có nghĩa là điều này:

class SubSubAlpha extends Alpha { 

được điều này:

class SubSubAlpha extends SubAlpha { 

... lúc này bạn thực sự sẽ nhận được một lỗi thời gian biên dịch.

(Nói cách khác, có, có luôn là cuộc gọi tới siêu cấu trúc.)

+0

CÓ ... SORRY QUYỀN CỦA BẠN ... – satheesh

+0

tôi đã hiểu .... – satheesh

1

Đây là ví dụ hay từ Java Programmer's SourceBook. Kể từ khi các nhà xây dựng in khi được gọi, bạn sẽ thấy ngay lập tức chuỗi các cuộc gọi. Nó là từ tư duy trong Java.

//: Cartoon.java 
// Constructor calls during inheritance 

class Art { 
    Art() { 
    System.out.println("Art constructor"); 
    } 
} 

class Drawing extends Art { 
    Drawing() { 
    System.out.println("Drawing constructor"); 
    } 
} 

public class Cartoon extends Drawing { 
    Cartoon() { 
    System.out.println("Cartoon constructor"); 
    } 
    public static void main(String[] args) { 
    Cartoon x = new Cartoon(); 
    } 
} ///:~ 

Kết quả cho chương trình này cho thấy các cuộc gọi tự động:

Art constructor
Vẽ constructor
Cartoon constructor

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