关于java接口跟object类的关系

前情提要

今天在琢磨java原型设计模式的时候发现一个困惑的事情,如下代码
原型接口

public interface Prototype {
	
	public Object clone();
}

具体原型类

public class ConcretePrototype implements Cloneable,Prototype {
	
}

我发现这里我如果直接这么写的话,直接是报错

Exception CloneNotSupportedException in throws clause of 
Object.clone() is not compatible with Prototype.clone()

意思就是说Object类的clone方法与Prototype的clone方法不兼容,为什么不兼容呢,因为Object会的clone方法会抛出CloneNotSupportedException异常,子类重写的方法没有抛出CloneNotSupportedException异常或者CloneNotSupportedException异常子类导致报错(子类在重写父类抛出异常的方法时,要么不抛出异常,要么抛出与父类方法相同的异常或该异常的子类),也就是说,Object将接口Prototype的clone方法定义当成重写了,如果像下面这么写,则不会报错,:

public class ConcretePrototype implements Cloneable,Prototype {

	public Prototype clone(){
		Object object = null;
		try {
			object = super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return (Prototype)object;
	}
}

但是这么写我发现一个奇怪的问题,重写的clone方法中我返回了一个Prototype接口,跟接口中定义的Object不一致,根据重写规则,Prototype应该是Object的子类或者实现类,可是Prototype是一个接口,难道接口可以继承Object?

分析

  1. 观点1:因为老师说,你可以把接口看作是特殊的类,所以不假思索的就认为接口也 继承 根类Object (这种看法是最无厘头的)
  2. 观点2:毫无关系,因为如果直接将接口继承Object类会报错;
  3. 观点3:隐含继承,如下,list是接口,讲道理调用toString方法会报错,实际上不会报错;
List array= new ArrayList();
array.add("hello");
System.out.println(array.toString());

我的观点

  1. 接口与类在定义上毫无关系
    1. java中基本数据类型有4类8种:
      1. 整型:byte,short,int,long
      2. 浮点型:float,double
      3. 字符型:char
      4. 布尔型:boolean
    2. java中引用数据类型有3种:
      1. 接口
      2. 数组
  2. 因此按照定义来说类跟接口是并列的,没有继承等关系;
  3. 至于为什么接口可以直接调用Object类的方法,因为接口肯定对应一个具体的实现类,这个实现类肯定是继承的Object,因此可以用Object来接收,使用接口调用某个Object方法实际上是调用具体实现类调用,只是这个具体类还没有定义,但是最终这个具体的实现类肯定会定义并且肯定有Object的方法,这个可以理解成设计模式的依赖倒置原则;

你可能感兴趣的:(java,接口跟Object,java)