2009-08-28 30 views
12

Tôi có hai câu hỏi về mã nàyKhó hiểu "ghi đè lên một phương pháp riêng"

public class Override { 
    private void f() { 
     System.out.println("private f()"); 
    } 
    public static void main(String[] args) { 
     Override po = new Derived(); 
     po.f(); 
    } 
} 

class Derived extends Override { 
    public void f() { 
     System.out.println("public f()"); 
    } 
} 

/* 
* Output: private f() 
*/// :~ 

1) Làm thế nào là hàm f có thể nhìn thấy trên tham chiếu của Override po;

2) Tại sao là đầu ra "f tin()"

+0

Nhưng cách tham chiếu với đối tượng của phân lớp có thể gọi phương thức riêng của một lớp siêu ??? Đây có phải là một lỗi??? –

+0

Không, đây không phải là lỗi, điều này là chính xác như nó sẽ làm việc. – Jesper

+0

nhưng không phải là vi phạm các quy tắc thừa kế và ràng buộc muộn –

Trả lời

24
  1. Phương pháp main là bên trong lớp Override, vì vậy tất nhiên đó chỉ có thể nhìn thấy các thành viên private của lớp Override.

  2. Bạn đang không phương pháp ghi đè f trong lớp Derived, không có đa hình. Loại biến số poOverride, do đó, nó sẽ có phương thức f từ lớp Override.

Lưu ý rằng phương pháp f trong lớp Override không hiển thị ở tất cả các lớp Derived. Phương thức f trong lớp Derived là một phương thức khác, không có gì để làm với phương thức f trong siêu lớp.

+0

Nhưng khi ràng buộc được thực hiện trong thời gian chạy thì po sẽ có đối tượng của lớp Derived để làm thế nào nó có thể gọi một phương thức riêng của siêu lớp. –

+3

Không có nơi nào trong mã của bạn có một cuộc gọi đến một phương thức riêng của một siêu lớp. Khi bạn gọi po.f(), f của Ghi đè được gọi vì kiểu thời gian biên dịch của po là Ghi đè. Vì không có trọng số, không có ràng buộc động (không có đa hình) - Java không nhìn vào kiểu khi chạy. – Jesper

2
Override po = new Derived(); 
po.f(); 

Bạn đang truy cập vào phương pháp riêng Override thậm chí nếu đối tượng có nguồn gốc vì theo quy định phạm vi, các thành viên private của lớp được coi là đầu tiên, và như bằng văn bản trong phạm vi Override nó được tham chiếu đến f tư nhân, và kể từ khi riêng tư của nó không overriden trong lớp Derived ở tất cả, họ sẽ chỉ ghi đè nếu chữ ký phương pháp là như nhau.

Derived po = new Derived(); 
po.f(); 

Thsi là mã chính xác mà sẽ gọi nguồn gốc của f

+0

Câu hỏi đặt ra là về Java chứ không phải C#. 'ảo' không tồn tại trong Java. – Jesper

+0

Cảm ơn nhận xét, tôi cũng đã sửa trả lời. –

0

Các ghi đè phương pháp có ba lớp conditions.child phải có cùng tên và các thông số và giá trị trả về như class.But siêu của mình nếu cả hai các tham số và giá trị trả về là khác nhau, do đó, ghi đè không tồn tại! ngay cả khi hai phương pháp là phương pháp khác nhau! ok như thế này:

public class Parent { 
      public int addV(int a,int b){ 
     int s; 
     s = a + b; 
     return s; 
    } 
} 

class Child extends Parent{ 
    public void addV(){ 
     //do...something 
    } 
} 

Eclipse sẽ không nói lỗi! bởi vì phương thức addV trong lớp Child khác với phương thức addV trong lớp Parent.As instance của bạn!

+0

Chỉ có tên của phương thức và danh sách các đối số phải giống hệt nhau. Giá trị trả về của con có thể là lớp con của giá trị trả về của cha. Và có thêm hai quy tắc mà bạn đã bỏ qua. Phương pháp ở trẻ em phải ít nhất là có thể truy cập được với phương thức ở cấp độ gốc. Và lớp con không thể ném ngoại lệ đã kiểm tra mới hoặc các trường hợp ngoại lệ rộng hơn. – pkkoniec

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