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;
为什么第一句没错,而第二句会出错呢?两句有什么区别吗?

解决方案 »

  1.   

    说下我的看法,第一个问题,我之前好像在那看过,说接口都是继承Object类。
    第二个问题,Test test1 = (Test) b;报错,说明这个错误是在编译期间能确定的,Test test =(Test) a这个不报错,只是在编译期间不能确定。个人觉的应该是和A实现接口有关系吧。
      

  2.   

    Object是生物
    A 是男人那么男人如果是生物的话
      

  3.   

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

  4.   

    Object是所有类的父类,接口只是一种特殊的类,也继承了Object
    第二个问题的原因是你的B没有实现接口A,编译检查的时候就能知道你的B不能强制转换为A。
      

  5.   

    1,Object是根基类。老祖宗  //当然不会报错
    2,Test test =(Test) a; //不同级,父类转子类。当然不会报错
    3,Test test1 = (Test) b;//两个毫无关系的类。转换,当然报错
      

  6.   

    接口最后还是类实现的 不管接口是否继承Object 但是实现接口的类肯定 继承Object
    A a = new C();
    Object object = a;
    等效于 Object object=new C(); 不会错误Test test =(Test) a;  
    因为a是接口 编译器不知道你实现这接口的是哪个类 不会报错 如果实现接口a的类是Test的子类 那么运行就不会错 否则 会转换错误估计
    //Test test1 = (Test) b;
    两个都是类 没有父子关系。转换,当然报错
      

  7.   

    你程序中Test test =(Test) a; 也不是正确的,只是骗过了编译器可以编译通过,但是一旦解释执行便会报类型转换错误,为什么会编译通过呢,以为你是将一个接口类型转换为某种类型,但接口类型在运行时都会被实现类替换,而编译器无法判断你此时被转型的接口的具体实现类是什么,所以它不会阻止你这样转型。
    而Test test1 = (Test) b,编译器便不能允许你将类型B转型为类型A。
    支持3楼