2012-02-23 38 views
8

Trường hợp "siêu" thực sự được xác định? [Khi chúng tôi đang sử dụng super.someMethod()]. Nó được định nghĩa là một trường trong lớp java.lang.Object hay lớp java.lang.Class?Cách siêu được triển khai trong Java?

Khi chúng ta gọi từ một lớp con, siêu chứa tham chiếu đến siêu lớp của nó. Theo cách tương tự, siêu trong siêu lớp chính nó có tham chiếu đến siêu lớp của nó [Theo cách này tối đa java.lang.Object]. Vì vậy, làm thế nào java injects các siêu tham chiếu đến trường "siêu" cho phép chúng ta gọi các phương thức siêu lớp?

Có bất kỳ dưới implementaations mui xe như sau:

Class current = this.getClass(); 
    Class parent = current.getSuperclass(); 
    System.out.println("name is =" + parent); 

Trả lời

2

super là từ khóa đối tượng cụ thể tham chiếu, tăng cấp bậc đối tượng bắt đầu từ đối tượng gọi cho đến khi tìm thấy đối tượng tổ tiên có ký hiệu phương thức khớp hoặc thuộc tính/trường. Tham khảo Java documentation.

15

super như this là một từ khóa. Nó có ý nghĩa trong Java mà không được phản ánh trong mã byte Java. Điều đó có nghĩa là việc triển khai các lớp cha mẹ của tôi (có thể được kế thừa)

Ở cấp mã byte, nó sẽ gọi phương thức cho lớp cha của nó một cách rõ ràng.

+0

1 Tôi thứ hai này. Trong mã byte, nó không khác với lời gọi phương thức chuẩn. – Jivings

+0

Bạn đã đúng, đến mức có thể ở cấp độ bytecode vi phạm các quy tắc mà trình biên dịch thực thi và gọi super() không phải là điều đầu tiên trong một hàm tạo. Bạn có thể sửa đổi bytecode để làm điều này và JVM sẽ vui vẻ chạy nó. –

1

Trường có định nghĩa là trường trong lớp java.lang.Object hoặc lớp java.lang.Class không?

Nó hoàn toàn không phải là trường.

super.someMethod() là phần tử cú pháp Java có nội dung "gọi phương thức như được xác định trong siêu lớp của tôi".


OK, giả sử rằng giả thuyết đó là một lĩnh vực. Loại của nó sẽ là gì? Nó sẽ đề cập đến cái gì? Nếu nó được khai báo là:

Class<ParentClass> super = ... // the relevant class object. 

sau đó super.someMethod() sẽ không làm việc vì:

  • Class không có bất kỳ phương pháp dùng định nghĩa, và
  • super.someMethod() cần phải được một cuộc gọi đến một Ví dụ, và chúng tôi không cung cấp một ví dụ phù hợp.

Mặt khác nếu nó được khai báo là:

ParentClass super = this; 

sau đó super.someMethod() sẽ tương đương với this.someMethod() và sẽ gọi phương thức trong lớp này, không phải là ghi đè trên.

+0

Có bất kỳ cơ hội nào mà phương thức getSuperClass() của lớp java.lang.Class đang được sử dụng hay không (tức là có lẽ sự phản chiếu java đang được sử dụng dưới mui xe để tiêm tham chiếu] http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#getSuperclass%28%29 –

+0

No. không có cơ hội nào đang xảy ra. –

2

Đó không phải là trường - đó là số language keyword.

Có một tham chiếu đến siêu lớp ở cấp JVM, tất nhiên, nhưng ở cấp Java bạn chỉ có thể truy cập thông qua từ khóa. Sự khác biệt là bạn có thể không thực sự truy cập vào một phương thức siêu lớp thông qua một tham chiếu - nó cần sự hỗ trợ đặc biệt từ trình biên dịch để làm điều đó.Và tất nhiên là không có super.super

0

Tôi đoán nó sẽ bắt đầu leo ​​chuỗi tổ tiên cho đến khi nó tìm thấy lớp đầu tiên có phương pháp bạn đặt sau siêu. Có vẻ là cách dễ nhất. Điều này được thực hiện tại thời gian biên dịch nếu bạn nghĩ về nó. Cuối cùng, một phương thức chỉ là một con trỏ hàm, với một phương thức invokation chấp nhận cá thể được đề cập (trong trường hợp của bạn là this). Nhìn tài liệu Method.invoke

Nó sẽ được sử dụng bởi trình biên dịch với một trường hợp phương pháp từ lớp siêu và đây là trường hợp đối tượng

+0

Nó luôn gọi các lớp siêu trực tiếp nên không có "leo" liên quan. Nhưng rõ ràng là một lớp kế thừa tất cả các phương thức công cộng/được bảo vệ của cha mẹ, vì vậy sự khác biệt chủ yếu là tách lông (bạn nhận thấy sự khác biệt khi cố gắng gọi các nhà thầu theo độ phân giải quá tải siêu và wrt) – Voo

+0

khái niệm giống như bạn nói. Nhưng thực tế mã không được lặp lại, các lớp con sẽ chỉ có các con trỏ tới các phương thức biên dịch siêu lớp. Ý tôi là, bởi vì anh ấy quan tâm nhiều hơn đến việc thực hiện. – gotch4

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