日期:2014-05-20  浏览次数:20765 次

java中接口与Object的关系
public class Test{
public static void main(String[] args) {
A a = new C();
B b = new B();
Test test =(Test) a; 
//Test test1 = (Test) b;
Object object = a;
}
}
/**
 * 定义接口A
 */
interface A{
public int f();
}
/**
 *类B
 */
class B{

}
/**
 *类c继承了接口A
 */
class C implements A{

@Override
public int f() {
// TODO Auto-generated method stub
return 0;
}

}
问题一:
为什么Object object = a;是正确的?
a声明的是接口,接口类型能上转型成Object类型吗?接口是Object的子类吗?

问题二:
Test test =(Test) a; 
Test test1 = (Test) b;
为什么第一句没错,而第二句会出错呢?两句有什么区别吗?

------解决方案--------------------
想给你讲明白这个问题不是一两句话的事,建议楼主多看看接口的作用,以及跟类有什么关系跟区别的文章
这里我简单表述下我的理解:
首先、java中接口跟类是两个并行的概念,所有类都继承Object,但接口是接口,不继承Object,接口只能继承某一接口,但某个类可以实现接口(多个接口)。
其次、接口是一系列方法声明的开放集合,即所有实现了该接口的类都具备该接口公开的方法,通常为了隐藏实现以及程序的可拓展性用到接口,因为在所有可以使用接口的地方都可以使用它的实现类来替换。
再次、你程序中Test test =(Test) a; 也不是正确的,只是骗过了编译器可以编译通过,但是一旦解释执行便会报类型转换错误,为什么会编译通过呢,以为你是将一个接口类型转换为某种类型,但接口类型在运行时都会被实现类替换,而编译器无法判断你此时被转型的接口的具体实现类是什么,所以它不会阻止你这样转型。而Test test1 = (Test) b,编译器便不能允许你将类型B转型为类型A。
好吧,我就说这些吧,希望能帮到楼主
------解决方案--------------------
Object是所有类的父类,接口只是一种特殊的类,也继承了Object
第二个问题的原因是你的B没有实现接口A,编译检查的时候就能知道你的B不能强制转换为A。
------解决方案--------------------
1,Object是根基类。老祖宗 //当然不会报错
2,Test test =(Test) a; //不同级,父类转子类。当然不会报错
3,Test test1 = (Test) b;//两个毫无关系的类。转换,当然报错

------解决方案--------------------
接口最后还是类实现的 不管接口是否继承Object 但是实现接口的类肯定 继承Object
A a = new C();
Object object = a;
等效于 Object object=new C(); 不会错误

Test test =(Test) a;
因为a是接口 编译器不知道你实现这接口的是哪个类 不会报错 如果实现接口a的类是Test的子类 那么运行就不会错 否则 会转换错误估计
//Test test1 = (Test) b;
两个都是类 没有父子关系。转换,当然报错
------解决方案--------------------
你程序中Test test =(Test) a; 也不是正确的,只是骗过了编译器可以编译通过,但是一旦解释执行便会报类型转换错误,为什么会编译通过呢,以为你是将一个接口类型转换为某种类型,但接口类型在运行时都会被实现类替换,而编译器无法判断你此时被转型的接口的具体实现类是什么,所以它不会阻止你这样转型。
而Test test1 = (Test) b,编译器便不能允许你将类型B转型为类型A。


支持3楼