2012-07-24 57 views
7

Tôi mới sử dụng Java và tôi có một câu hỏi rất cơ bản.Ghi đè phương pháp được bảo vệ

Tôi có 2 Cấp độ gốc trong cùng một gói. Animal Lớp trừu tượng và Lớp học Machine.

Hiện tại, lớp trừu tượng Animal có phương pháp được bảo vệ. Tôi biết rằng các phương thức được bảo vệ có thể truy cập được nếu các lớp nằm trong cùng một gói.

Tôi có thể truy cập phương thức được bảo vệ đó trong Lớp Machine của mình và câu hỏi là .. Có thể ghi đè phương thức được bảo vệ đó không? Không mở rộng lớp Animal.

+2

Bạn đã cố gắng làm điều đó chưa? Thế kết quả là gì? –

+0

Ghi đè đến sau khi kế thừa ... những gì bạn đang nói là không thể ... :) –

Trả lời

21
  • bảo vệ - Có thể được ghi đè bởi lớp con, cho dù họ đang ở trong cùng một gói hay không
  • mặc định (không truy cập modifier) ​​- chỉ có thể được truy cập hoặc ghi đè nếu cả hai lớp học nằm trong cùng một gói
+1

cảm ơn bạn đã trả lời câu hỏi cơ bản này. :) –

+0

câu trả lời đúng là câu trả lời đúng. Denis Salibio, Bạn nên chơi một chút với phân cấp lớp. – TecHunter

5

Bạn chỉ có thể ghi đè phương thức thông qua tiện ích mở rộng.

Bạn có thể ghi đè phương thức được bảo vệ bằng lớp con ẩn danh nếu muốn. Ví dụ.

public class Animal { 

    protected String getSound() { 
     return "(Silence)"; 
    } 

    public void speak() { 
     System.out.println(getSound()); 
    } 
} 

Trong lớp khác:

public static void main(String ... args) { 

    Animal dog = new Animal() { 

     @Override 
     protected String getSound() { 
      return "Woof!"; 
     } 
    } 

    dog.speak(); 
} 

Will đầu ra:

Woof! 
+0

Animal animal = new Dog(); Tôi đã sử dụng mã này để truy cập phương thức, tôi chỉ tự hỏi liệu tôi có thể ghi đè phương thức được bảo vệ sau đó không. –

+0

cảm ơn bạn đã trả lời câu hỏi cơ bản này. :) –

+0

Tôi đã cập nhật câu trả lời của mình để cho thấy cách bạn có thể tạo một lớp con ẩn danh của Animal để biểu diễn một chú chó, mà không thực sự tạo một lớp có tên là Dog. –

0

Để ghi đè lên một phương pháp mà bạn cần phải mở rộng lớp đó. Đó là ý nghĩa quan trọng: có phương pháp có chữ ký giống như siêu hạng.

+0

cảm ơn bạn đã trả lời câu hỏi cơ bản này. :) –

1

Không, ghi đè có nghĩa là kế thừa hành vi từ lớp cha và không thể mở rộng lớp học.

public class PClass 
    { 



protected boolean methodA() 
      { 
    return true; 
     } 

    } 

public class CClass extends PClass 
     { 

protected boolean methodA() 
      { 
    return false; 
     } 
     } 

Chạy mã dưới đây để kiểm tra nó

public static void main(String[] args) 
    { 

    PClass pc=new CClass(); 
    System.out.println(pc.methodA()); 

    } 

O/p=false

đây chúng ta đang trọng hành vi của methodA

+0

cảm ơn bạn đã trả lời câu hỏi cơ bản này. :) –

0

Overriding theo định nghĩa nói ..

Một dụ metho d trong một phân lớp có cùng chữ ký (tên, cộng với số và kiểu tham số của nó) và kiểu trả về như một phương thức cá thể trong siêu lớp sẽ ghi đè phương thức của lớp cha.

Vì vậy, AFAIK nếu bạn không mở rộng siêu lớp thì không có cách nào để ghi đè phương thức.

0

Được bảo vệ chỉ có thể được truy cập bởi các lớp con trong các gói khác. Các lớp trong cùng một gói cũng có thể truy cập các trường, phương thức và các hàm tạo được bảo vệ, ngay cả khi chúng không phải là lớp con của lớp của thành viên được bảo vệ.

Ghi đè: Phương pháp thể hiện trong phân lớp có cùng chữ ký.

trả lời của câu hỏi của bạn:
Nhưng nếu bạn không muốn extendsAnimal class trong Machine class sau đó nó không trọng chỉ là một chức năng bình thường của nó lại lớp riêng bạn.

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