zoukankan      html  css  js  c++  java
  • 接口与object的关系

    在学习集合的时候,遇到以下的代码
    Lisi list =new ArrayList();
    .......
    
    syso(list);

    大家都知道List接口中并没有定义toString()方法,应该是无法多态使用子类中的ArrayList中的toString()方法的,但是结果却是用到了,这是怎么回事呢?

    参考:java语言规范 9.2 Interface Members

    If an interface has no direct superinterfaces, then the interface implicitly declares a public abstract member method m with signature s, return type r, and throws clause t corresponding to each public instance method m with signature s, return type r, and throws clause t declared in Object, unless a method with the same signature, same return type, and a compatible throws clause is explicitly declared by the interface. It is a compile-time error if the interface explicitly declares such a method m in the case where m is declared to be final in Object. 

    如果一个接口没有直接的父接口,那么,这个接口就隐含的声明了这样的一些成员方法m,这个方法是public abstract的,签名是s,返回类型是r,抛出t类型异常,与Object类中声明的public的,签名是s,返回类型是r,抛出t类型异常的方法相对应,除非,接口中明确定义了这样的方法。
    如果接口明确的声明了这样的方法m,m在Object类中是final的,这将会产生编译时error。

    Object的public方法:

    public final native Class<?> getClass();
    public final native void notify();
    public final native void notifyAll();
    public final void wait() throws InterruptedException
    public boolean equals(Object obj)
    public native int hashCode();
    public String toString()
    protected native Object clone() throws CloneNotSupportedException;
    protected void finalize() throws Throwable { }

    也就是说,接口里面默认有equals、hashcode、toString、clone和finalize这5个方法。

    做了个实验,挺有意思:

    在eclipse里面:
    public interface MyInterfsace {
        public void toString();//compile error! The return type is incompatible with Object.toString()
        public void equals(Object obj);//compile error!The return type is incompatible with Object.equals(Object)
        public String finalize() throws Throwable;//compile OK!but:The return type is incompatible with Object.finalize(), thus this interface cannot be implemented
        public String hashCode();//compile error! The return type is incompatible with Object.hashCode()
        public String clone() throws CloneNotSupportedException;//没啥特别的反应。
    }


    It follows that is a compile-time error if the interface declares a method with a signature that is override-equivalent (§8.4.2) to a public method of Object, but has a different return type or incompatible throws clause.
    如果接口声明了一个方法,跟Object的方法构成override,但是却有不一样的返回类型或者是不兼容的异常类型,也是编译时error。

    另外也有说法是接口继承了Object类

    《深入java虚拟机》第二版第126页第六行


    《The JavaTM Virtual Machine Specification》Second Edition CHAPTER 4 The class File Format
    4.1 The ClassFile Structure中对于super_class标志的描述,我就复制一下内容吧:
    super_class 
    For a class, the value of the super_class item either must be zero or must be a valid index into the constant_pool table. If the value of the super_class item is nonzero, the constant_pool entry at that index must be a CONSTANT_Class_info (§4.4.1) structure representing the direct superclass of the class defined by this class file. Neither the direct superclass nor any of its superclasses may be a final class.
    If the value of the super_class item is zero, then this class file must represent the class Object, the only class or interface without a direct superclass.

    For an interfacethe value of the super_class item must always be a valid index into the constant_pool table. The constant_pool entry at that index must be a CONSTANT_Class_info structure representing the class Object.


    两本都是很著名的书,都阐述一个道理,接口中Object中方法,所以List可以多态调用子类中的toString方法。

  • 相关阅读:
    why why why
    为什么又显示了呢?
    Hello
    兼容性问题
    前端性能优化
    ES6新增API
    详解面向对象、构造函数、原型与原型链
    post请求导出表单。
    vue在生产环境清除console.log
    js 延迟加载的几种方法
  • 原文地址:https://www.cnblogs.com/JSD1207ZX/p/9386226.html
Copyright © 2011-2022 走看看