2015-07-13 17 views
7

Chúng tôi sử dụng thừa kế trong Java để tóm tắt hành vi tương tự trong một lớp cha và cho phép tất cả các lớp con kế thừa nó. Một trong những ưu điểm của điều này là, bây giờ chúng ta chỉ có một bản sao của phương thức để duy trì (tức là trong siêu lớp).Trình biên dịch java biết về các phương thức kế thừa như thế nào?

Class Animal 
{ 
    public void makeNoise() 
    { 

    } 

    public void sleep() 
    { 

    } 
} 

Class Cat extends Animal 
{ 
    // Override the makeNoise method 
    public void makeNoise() 
    { 

    } 
} 

Class someClass 
{ 
    public static void main(String args[]) 
    { 
      Cat fluffy = new Cat(); 

      fluffy.sleep(); 
    } 
} 

Tôi cố gắng để hiểu làm thế nào trình biên dịch Java biết của phương pháp sleep() cho một tham chiếu Cat loại. Không thể có một bản sao của phương thức trong lớp con Cat (nó đánh bại mục đích của nó trong lớp cha và cho phép tất cả các lớp con kế thừa từ nó). Thông tin này có được lưu trữ ở một số nơi khác không?

Trả lời

9

Khi trình biên dịch nhìn thấy fluffy.sleep(), đầu tiên nó sẽ nhìn vào lớp Cat cho phương thức công khai được gọi là sleep không có tham số. Vì nó không tìm thấy nó, nó di chuyển chuỗi thừa kế lên Animal và thực hiện kiểm tra tương tự trên Animal. Nó tìm thấy nó ở đó, vì vậy tất cả đều tốt.

Thông tin này không thực sự được "lưu trữ" ở bất kỳ đâu ngoại trừ trong mã và sau đó là mã byte Java.

+0

Khi biên dịch mã, nó tạo ra một loại cấu trúc heirarchy/dữ liệu lớp. Đúng ? – Chiseled

+0

@Twister Có. Và khi các đối tượng được tạo ra trong thời gian chạy, chúng (hoặc ít nhất là máy ảo thời gian chạy) lưu trữ chúng là kiểu gì. – Jashaszun

+0

Tôi đang nói về thời gian biên dịch không phải là thời gian chạy. – Chiseled

0

Trong trường hợp giao diện, chúng tôi có thể gọi phương thức lớp đối tượng trên chúng mà không có đối tượng mở rộng giao diện. Ví dụ: -

public interface Test { 
} 

public class MyClass extends Object implements Test { 

public static void main() { 
Test test = new MyClass(); 
test.hashCode(); 
// You can call Object Class methods on Test interface and Test interface 
//does not extends Object. 

} 

// Trong Java Specification 9.2: - Nếu một giao diện không có superinterfaces trực tiếp, sau đó giao diện ngầm tuyên bố một public abstract method thành viên m với chữ ký s, kiểu trả về r, và ném mệnh đề t tương ứng với mỗi phương thức công khai m với chữ ký s, kiểu trả về r và mệnh đề ném t được khai báo trong đối tượng, trừ khi phương thức trừu tượng có cùng chữ ký, cùng kiểu trả về và mệnh đề ném tương thích là giao diện. Đây là lỗi biên dịch nếu giao diện khai báo rõ ràng phương thức m như vậy trong trường hợp m được khai báo là cuối cùng trong đối tượng.

+0

Đây là một trong những trường hợp ngoại lệ trong giao diện ... –

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