อินเทอร์เฟซสืบทอดจากคลาส Object ใน java


157

อินเตอร์เฟสได้รับมรดกจากObjectคลาสใน Java หรือไม่?

ถ้าไม่เช่นนั้นเราจะสามารถเรียกใช้เมธอดคลาสอ็อบเจ็กต์บนอินสแตนซ์ของอินเตอร์เฟสได้อย่างไร

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

interface Employee {
}

@EJP เทคนิคการพูดมันไม่สำคัญว่า java / io / Serializable.class ประกอบด้วย ฉันคิดว่าคุณสับสน Java Lang Spec กับ JVM spec
aioobe

@aioobe ตามที่ฉันไม่ได้กล่าวถึงข้อกำหนดเหล่านั้นฉันไม่เข้าใจประเด็นของคุณ Serializableเป็นอินเทอร์เฟซที่ง่ายที่สุดที่เป็นไปได้; วิ่งjavapบนมันจะบอกคุณว่ามันสืบทอดมาจาก; และถูกกำหนดโดย Java Language Specification หากคุณคิดว่า JVM Spec มาอยู่ในที่ใดที่หนึ่งโปรดให้ความกระจ่างแก่เรา
มาร์ควิสแห่ง Lorne

2
@EJP คำถามเกี่ยวกับภาษา Java (เช่นข้อกำหนดภาษา Java) สิ่งที่เคยมี java / io / Serializable.class ประกอบด้วยเกี่ยวข้องกับสิ่งที่ JVM spec พูด เทคนิคการพูดไม่มีการรับประกันว่ามีการติดต่อแบบหนึ่งต่อหนึ่งระหว่างคุณสมบัติของข้อมูลจำเพาะทั้งสอง
aioobe

ฉันเนื้อหาเกี่ยวกับเรื่องนี้ในที่ผ่านมาโพสต์บล็อก
aioobe

คำตอบ:


161

อินเตอร์เฟสได้รับมรดกจากObjectคลาสใน Java หรือไม่?

ไม่พวกเขาทำไม่ได้ และไม่มีอินเทอร์เฟซ "รูท" ทั่วไปที่สืบทอดโดยนัยโดยอินเตอร์เฟสทั้งหมดเช่น (ในกรณีที่มีคลาส) สำหรับเรื่องนั้น (*)

ถ้าไม่เช่นนั้นเราจะสามารถเรียกใช้เมธอดคลาสอ็อบเจ็กต์บนอินสแตนซ์ของอินเตอร์เฟสได้อย่างไร

Objectอินเตอร์เฟซที่ประกาศโดยปริยายวิธีหนึ่งสำหรับแต่ละวิธีของประชาชนใน ดังนั้นequalsเมธอดจะถูกประกาศโดยนัยในฐานะสมาชิกในอินเทอร์เฟซ (เว้นแต่ว่ามันจะสืบทอดมาจาก superinterface)

นี่คือคำอธิบายในรายละเอียดในภาษาข้อมูลจำเพาะ Java, § 9.2 การเชื่อมต่อของสมาชิก

9.2 สมาชิกส่วนต่อประสาน

[ ... ]

  • หากมีอินเตอร์เฟซที่ไม่เคยมีใคร superinterfaces โดยตรงแล้วอินเตอร์เฟซโดยปริยายประกาศสาธารณะนามธรรมวิธีสมาชิกเมตรที่มีลายเซ็นของผลตอบแทนประเภทRและพ่นประโยคทีสอดคล้องกับแต่ละกรณีประชาชนวิธีเมตรที่มีลายเซ็นของประเภทผลตอบแทนRและพ่นประโยคทีประกาศในObjectเว้นแต่ว่ามีวิธีการที่มีลายเซ็นเดียวกันกลับประเภทเดียวกันและประโยคพ่นที่เข้ากันได้จะถูกประกาศโดยอินเตอร์เฟซ

[ ... ]


โพสต์นี้ได้รับการเขียนใหม่เป็นบทความที่นี่


(*) หมายเหตุว่าแนวความคิดของการเป็นที่ย่อยของจะไม่เทียบเท่ากับสืบทอดจาก : การเชื่อมต่อกับอินเตอร์เฟซสุดแน่นอนเชื้อObject( § 4.10.2 Subtyping หมู่ระดับและการเชื่อมต่อประเภท. ) Objectถึงแม้ว่าพวกเขาจะไม่ได้รับมรดกจาก


1
@aioobe หากเราติดตั้งส่วนต่อประสานใด ๆ แล้วทำไมเราไม่ให้การใช้งานของ "เท่ากับ" วิธีการในชั้นเรียนที่มีการใช้อินเตอร์เฟซที่ ตามแนวคิดของฉันเราต้องใช้วิธีการอินเทอร์เฟซในการใช้คลาสมิฉะนั้นคลาสจะเป็นนามธรรม
Vikas Mangal

1
คุณไม่จำเป็นต้องใช้วิธีการสืบทอด ดูตัวอย่างนี้ กล่าวอีกนัยหนึ่งเท่ากับถูกกำหนดไว้แล้วและสืบทอดไปยังชั้นเรียนการใช้อินเตอร์เฟซ
aioobe

3
ฉันได้จุดที่นี่ แต่คำถามหนึ่ง - ทำไมเราต้องการสิ่งนี้ จะมีความแตกต่างอะไรหากวิธีการObjectเรียนไม่ได้ประกาศไว้ในส่วนต่อประสาน
Vikas Mangal

2
หากเราไม่มีสิ่งนี้โปรแกรมในคำถามจะไม่รวบรวม มีequalsวิธีการในEmployeeส่วนต่อประสาน
aioobe

1
คำถามและคำตอบนี้ยังเตือนฉันว่าแม้หลังจากประสบการณ์ฉันควรมุ่งเน้นการทำให้พื้นฐานของฉันแข็งแกร่ง
อานันท์เจ Kadhi

13

Object เป็น supertype ของอินเตอร์เฟสใด ๆ [1]

อย่างไรก็ตามอินเตอร์เฟซที่ไม่ได้implements, extendsหรือ"สืบทอดมาจาก" Object

JLS มีส่วนคำสั่งพิเศษเพื่อเพิ่มObjectวิธีการในอินเตอร์เฟส [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


นั่นเป็นคำตอบที่ถูกต้องที่สุด ควรเป็นที่ยอมรับ เช่นวิธีการที่ใช้java.lang.Objectจะยอมรับการอ้างอิงของประเภทอินเตอร์เฟสใด ๆ ยิ่งกว่านั้นคุณสามารถส่งอินเตอร์เฟซไปที่Objectปริยายโดยไม่มีข้อผิดพลาดคอมไพเลอร์
nme

12

จริงๆแล้วมีฟิลด์ซูเปอร์คลาสในทุก.classไฟล์รวมถึงฟิลด์ที่เป็นตัวแทนของอินเทอร์เฟซ

java.lang.Objectสำหรับอินเตอร์เฟซก็มักจะชี้ไปยัง แต่นั่นไม่ได้ใช้เพื่ออะไร

อีกวิธีในการดู:

interface MyInterface {
    // ...
}

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

นี่หล่ออยู่เสมอที่ถูกต้องซึ่งหมายถึงว่าทุกประเภทอินเตอร์เฟซที่เป็นชนิดย่อยของ(Object) paramjava.lang.Object


4
ไฟล์. class เป็นสิ่งประดิษฐ์ของไฟล์. java เพื่อให้เหตุผลว่าทำไมบางสิ่งบางอย่างทำงานในภาษาจาวาโดยการดูที่ไฟล์. class ที่ได้นั้นเป็นการให้เหตุผลย้อนหลัง
aioobe

วัตถุ obj = (Object) พารามิเตอร์; ไม่ทิ้งข้อผิดพลาดในการรวบรวม แต่วิธีการของ MyInterface (สาธารณะ) ไม่สามารถมองเห็นได้ด้วย obj ดังนั้นจึงไม่สามารถถือว่า MyInterface ได้ทุกประเภทอินเตอร์เฟสเป็นประเภทย่อยของ java.lang.Object
sabarinathan คุณ

5

นั่นเป็นเพราะemployee e = ...อ่านว่ามีชั้นเรียนที่ดำเนินการ และมีการกำหนดให้กับตัวแปรemployee eคลาสที่ใช้อินเตอร์เฟซที่ขยายวัตถุโดยปริยายดังนั้นเมื่อคุณทำทุกภาษาที่รู้ว่าคุณมีชั้นเรียนที่เป็นชนิดย่อยของe.equals(null)employee

JVM จะทำการตรวจสอบรันไทม์สำหรับรหัสของคุณ (เช่นการโยนNullPointerException)


3

อินเทอร์เฟซสืบทอดคลาสของวัตถุเราจะสามารถเข้าถึงวิธีการของคลาสวัตถุผ่านการอ้างอิงประเภทอินเทอร์เฟซ
ไม่มีอินเทอร์เฟซไม่สืบทอดObjectคลาส แต่ให้การเข้าถึงวิธีการทั้งหมดของObjectคลาส สมาชิกของอินเตอร์เฟสคือ:

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

บอกวิธีการที่สมาชิกของประชาชนที่เป็นนามธรรมที่สอดคล้องกับวิธีการเช่นแต่ละสาธารณะประกาศในObjectชั้นเรียน
มันเป็นข้อผิดพลาดเวลารวบรวมถ้าอินเตอร์เฟซอย่างชัดเจนประกาศวิธีการดังกล่าวเมตรในกรณีที่ม. จะประกาศให้เป็นในfinalObject

ตอนนี้ก็เป็นที่ชัดเจนว่า superinterface ทุกคนมีabstractวิธีการของสมาชิกที่สอดคล้องกับแต่ละวิธีการเช่นการประกาศในpublicObject

แหล่งที่มา: http://ohmjavaclasses.blogspot.com/2011/11/is-intreface-inherits-object-clashow.html


0

คลาสที่ใช้อินเตอร์เฟสใด ๆ ก็ได้มาจากObjectนิยามด้วยเช่นกัน


0

" ประเภทการอ้างอิงทั้งหมดสืบทอดมาจาก java.lang.Objectคลาส, enums, อาร์เรย์และอินเทอร์เฟซเป็นประเภทการอ้างอิงทั้งหมด "

ยกมาจาก: http://docs.oracle.com/javase/tutorial/reflect/class/index.html ประโยคที่สองให้ชัดเจน


Classes, enums, and arrays (which all inherit from java.lang.Object) as well as interfaces are all reference types: ไม่ได้บอกว่าอินเตอร์เฟสสืบทอดมาจาก Object เฉพาะคลาส, enums และอาร์เรย์
หมายเลข 945

พวกเขาเปลี่ยนมัน :)
dalvarezmartinez1

แม้ว่า "พวกเขาเปลี่ยนเป็น" (ซึ่งฉันสงสัย) การสอนอาจผิด การอ้างอิงเชิงบรรทัดคือ Java Language Specification (JLS)
Lew Bloch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.