Các giao diện kế thừa từ lớp Object trong java


157

Các giao diện kế thừa từ Objectlớp trong Java?

Nếu không thì làm thế nào chúng ta có thể gọi phương thức của lớp đối tượng trên thể hiện giao diện

public class Test {
    public static void main(String[] args) {
        Employee e = null;
        e.equals(null);
    }
}

interface Employee {
}

56
+1, Câu hỏi xuất sắc.
aioobe

@EJP, về mặt kỹ thuật, nó không quan trọng java / io / serializable. Class chứa gì. Tôi nghĩ rằng bạn đang nhầm lẫn Java Lang Spec với đặc tả JVM.
aioobe

@aioobe Như tôi chưa đề cập đến một trong những thông số kỹ thuật đó, tôi không hiểu quan điểm của bạn. Serializablelà một giao diện, đơn giản nhất có thể; chạy javaptrên nó cho bạn biết những gì nó được thừa hưởng từ; và điều đó được quy định bởi Đặc tả ngôn ngữ Java. Nếu bạn nghĩ rằng Spec JVM xuất hiện ở đâu đó, xin hãy khai sáng cho chúng tôi.
Hầu tước Lorne

2
@EJP, câu hỏi là về ngôn ngữ Java (tức là Đặc tả ngôn ngữ Java). Những gì java / io / serializable. Class chứa có liên quan đến những gì đặc tả JVM nói. Về mặt kỹ thuật, không có gì đảm bảo rằng có sự tương ứng một-một giữa các tính năng của hai thông số kỹ thuật.
aioobe

Tôi đã giải thích về điều này trong một bài đăng trên blog gần đây .
aioobe

Câu trả lời:


161

Các giao diện kế thừa từ Objectlớp trong Java?

Không, họ không. Và không có giao diện "gốc" chung nào được kế thừa hoàn toàn bởi tất cả các giao diện (như trong trường hợp với các lớp) cho vấn đề đó. (*)

Nếu không thì làm thế nào chúng ta có thể gọi phương thức của lớp đối tượng trên thể hiện giao diện

Một giao diện ngầm định khai báo một phương thức cho mỗi phương thức công khai Object. Do đó, equalsphương thức này được khai báo ngầm là một thành viên trong một giao diện (trừ khi nó đã kế thừa nó từ một siêu giao diện).

Điều này được giải thích chi tiết trong Đặc tả ngôn ngữ Java, § 9.2 Thành viên giao diện .

9.2 Thành viên giao diện

[...]

  • Nếu một giao diện không có siêu giao diện trực tiếp, thì giao diện đó hoàn toàn khai báo một phương thức thành viên trừu tượng công khai 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à ném mệnh đề t được khai báoObject , trừ khi một phương thức có cùng chữ ký, cùng kiểu trả về và mệnh đề ném tương thích được giao diện khai báo rõ ràng.

[...]


Bài viết này đã được viết lại như một bài viết ở đây .


(*) Lưu ý rằng khái niệm là một subtype của không tương đương với thừa hưởng từ : Giao diện không có giao diện siêu có thực sự phân nhóm của Object( § 4.10.2 subtyping giữa Class và Interface loại. ) Mặc dù họ không kế thừa từ Object.


1
@aioobe Nếu chúng tôi triển khai bất kỳ giao diện nào, thì tại sao chúng tôi không cung cấp phương thức "bằng" trong lớp đang triển khai giao diện đó. Theo các khái niệm của tôi, chúng ta phải thực hiện các phương thức giao diện trong việc thực hiện lớp nếu không lớp sẽ trừu tượng.
Vikas Mangal

1
Bạn không cần phải (thực hiện lại) các phương thức được kế thừa. Hãy xem ví dụ này . Nói cách khác, đẳng thức đã được định nghĩa và kế thừa cho lớp thực hiện giao diện.
aioobe

3
Tôi đã nhận được điểm ở đây. Nhưng một câu hỏi - tại sao chúng ta cần điều này? Có gì khác biệt nếu các phương thức của Objectlớp không được khai báo trong giao diện?
Vikas Mangal

2
Nếu chúng tôi không có điều này, chương trình trong câu hỏi sẽ không được biên dịch. Có equalsphương pháp trong Employeegiao diện.
aioobe

1
Câu hỏi và câu trả lời này vẫn nhắc nhở tôi rằng ngay cả sau khi trải nghiệm tôi vẫn nên tập trung vào việc làm cho những điều cơ bản của mình trở nên mạnh mẽ.
Anand j. Kadhi

13

Object là một siêu kiểu của bất kỳ giao diện nào [1]

Tuy nhiên, một giao diện không thực hiện implements, extendshoặc, "kế thừa từ" Object .

JLS có một mệnh đề đặc biệt để thêm Objectcác phương thức vào các giao diện [2]

[1] http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.10.2

[2] http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.2


Đó là câu trả lời chính xác nhất. Nên là người được chấp nhận. Ví dụ, một phương thức java.lang.Objectcũng sẽ chấp nhận tham chiếu của bất kỳ loại giao diện nào. Ngoài ra, bạn có thể chuyển giao diện sang Objectngầm mà không có bất kỳ lỗi biên dịch nào.
NME

12

Thực sự có một trường siêu lớp trong mỗi .classtệp, bao gồm cả các trường đại diện cho giao diện.

Đối với một giao diện, nó luôn luôn trỏ đến java.lang.Object. Nhưng điều đó không được sử dụng cho bất cứ điều gì.

Một cách khác để xem xét nó là:

interface MyInterface {
    // ...
}

public myMethod(MyInterface param) {
    Object obj = (Object) param;
    // ...
}

Ở đây dàn diễn viên (Object) paramluôn hợp lệ, ngụ ý rằng mọi loại giao diện là một kiểu con của java.lang.Object.


4
Tệp. Class là một tạo phẩm của tệp .java. Để tranh luận lý do tại sao một cái gì đó hoạt động trong ngôn ngữ Java bằng cách nhìn vào tệp. Class kết quả là lý do lạc hậu.
aioobe

Đối tượng obj = (Đối tượng) param; không ném lỗi biên dịch. Nhưng phương thức của MyInterface (công khai) không thể nhìn thấy đối với obj. Do đó, không thể giả sử MyInterface là mọi loại giao diện là một kiểu con của java.lang.Object
sabarinathan u

5

Đó là bởi vì employee e = ...đọc rằng có một lớp thực hiện employee và được gán cho biến e. Mỗi lớp thực hiện một giao diện đều mở rộng Object, do đó khi bạn thực hiện e.equals(null), ngôn ngữ sẽ biết rằng bạn có một lớp là một kiểu con employee.

JVM sẽ thực hiện kiểm tra thời gian chạy cho mã của bạn (tức là ném NullPointerException).


Câu trả lời phải tuân thủ các quy ước đặt tên.
Lew Bloch

3

Là giao diện kế thừa lớp Đối tượng, làm thế nào chúng ta có thể truy cập các phương thức của lớp đối tượng thông qua tham chiếu loại giao diện
Không Giao diện không kế thừa Objectlớp, nhưng nó cung cấp khả năng truy cập cho tất cả các phương thức của Objectlớp. Các thành viên của một giao diện là:

Those members declared in the interface.
Those members inherited from direct superinterfaces.
If an interface has no direct superinterfaces, then the interface implicitly 

khai báo một phương thức thành viên trừu tượng công khai tương ứng với mỗi phương thức cá thể công khai được khai báo trong Objectlớp .
Đó là lỗi thời gian 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à finalnằm trong Object.

Bây giờ rõ ràng là tất cả superinterface có abstractphương thức thành viên tương ứng với từng publicphương thức cá thể được khai báo Object.

nguồn: http : // ohmjavac gốm.blogspot.com/2011/11/is-intreface-inherits-object-clashow.html


0

Bất kỳ lớp nào thực hiện bất kỳ giao diện nào cũng được bắt nguồn từ Objectđịnh nghĩa.


0

" Tất cả các kiểu tham chiếu kế thừa từ java.lang.Object . Các lớp, enum, mảng và giao diện đều là các kiểu tham chiếu. "

Trích dẫn từ: http://docs.oracle.com/javase/tutorial/reflect/ class / index.html Câu thứ hai sẽ rõ ràng.


Classes, enums, and arrays (which all inherit from java.lang.Object) as well as interfaces are all reference types: không nói giao diện kế thừa từ Object. Chỉ các lớp học, enums và mảng.
Số945

Họ đã thay đổi nó :)
dalvarezmartinez1

Ngay cả khi "họ đã thay đổi nó" (mà tôi nghi ngờ), hướng dẫn có thể sai. Tham chiếu quy phạm là Đặc tả ngôn ngữ Java (JLS).
Lew Bloch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.