java中接口与Object的关系

xiangshan1234 2012-08-19 10:46:55
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;
为什么第一句没错,而第二句会出错呢?两句有什么区别吗?
...全文
548 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
maogc 2012-08-22
  • 打赏
  • 举报
回复
你程序中Test test =(Test) a; 也不是正确的,只是骗过了编译器可以编译通过,但是一旦解释执行便会报类型转换错误,为什么会编译通过呢,以为你是将一个接口类型转换为某种类型,但接口类型在运行时都会被实现类替换,而编译器无法判断你此时被转型的接口的具体实现类是什么,所以它不会阻止你这样转型。
而Test test1 = (Test) b,编译器便不能允许你将类型B转型为类型A。


支持3楼
风火轮 2012-08-22
  • 打赏
  • 举报
回复
接口最后还是类实现的 不管接口是否继承Object 但是实现接口的类肯定 继承Object
A a = new C();
Object object = a;
等效于 Object object=new C(); 不会错误

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

那么男人如果是生物的话。。。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧