2013-05-31 42 views
7
class Parent 
{ 
    private void method1() 
    { 
     System.out.println("Parent's method1()"); 
    } 
    public void method2() 
    { 
     System.out.println("Parent's method2()"); 
     method1(); 
    } 
} 
class Child extends Parent 
{ 
    public void method1() 
    { 
     System.out.println("Child's method1()");   
    } 

    public static void main(String args[]) 
    { 
     Child p = new Child(); 
     p.method2(); 
    } 
} 

ans làđầu ra Tại sao thừa kế là bất ngờ

Parent's method2() 
Parent's method1() 

Nếu tôi đang tạo ra đối tượng của lớp trẻ thì tại sao sản lượng là phương pháp lớp cha mẹ ?? thậm chí phương thức 1 là riêng tư ở cấp độ gốc. Nó lắc tất cả các khái niệm kế thừa của tôi.

Trả lời

13

Nó sẽ gọi phương thức con nếu nó vượt quá phương thức gốc. Nhưng nó không, vì phương thức cha mẹ là riêng tư, và do đó không thể bị ghi đè.

Khi ý định của bạn là ghi đè phương thức từ lớp cha hoặc giao diện cha mẹ, bạn nên luôn chú thích phương thức với @Override. Nếu bạn đã làm, trong trường hợp này, bạn sẽ nhận được một lỗi từ trình biên dịch, vì method1 của trẻ không ghi đè lên bất kỳ phương thức nào.

Khi lớp cha được biên dịch, trình biên dịch tìm kiếm phương thức1 trong lớp cha. Nó tìm thấy nó, và thấy rằng nó là riêng tư. Vì nó là riêng tư, nó biết rằng nó không thể ghi đè bởi bất kỳ lớp con nào, và do đó liên kết tĩnh cuộc gọi phương thức với phương thức riêng mà nó đã tìm thấy.

Nếu phương pháp 1 được bảo vệ hoặc công khai, trình biên dịch sẽ tìm phương thức và biết rằng phương thức này có thể bị ghi đè bởi một lớp con. Vì vậy, nó sẽ không liên kết tĩnh với phương thức. Thay vào đó, nó sẽ tạo ra bytecode sẽ tìm kiếm phương thức1 trong lớp cụ thể, khi chạy, và sau đó bạn sẽ nhận được hành vi mà bạn mong đợi.

Hãy suy nghĩ về điều đó: nếu một lớp con có thể ghi đè phương thức riêng tư, phương thức sẽ không còn là riêng tư nữa.

+0

vâng tôi biết điều đó. Nhưng im làm đối tượng của lớp con. –

+0

@ankitagahoi Tôi không thấy điểm "nhưng" trong câu lệnh của bạn :) –

+0

Nếu đây là đối tượng lớp con và lớp con có method1 thì nó không phải là trường hợp ghi đè. Child p = new Child(); –

1

Thành viên riêng tư không được kế thừa bởi các lớp con. Vì vậy, bạn chỉ cần xác định hoàn toàn độc lập public void method1 trong lớp con. Đương nhiên, nó không tham gia vào công văn động.

2

theo lớp con mặc định sẽ có quyền truy cập vào phương thức gốc. bạn đang gọi p.method2() ... mà không tồn tại trong lớp con để nó được thực hiện từ cha mẹ ...

Mặc dù method1() là riêng tư là phụ huynh .. nó được gọi từ phương thức cục bộ method2() ... do đó method1() đã có khả năng truy cập trong phương thức 2() ....

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