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

看看这个面试题!!!!
1.public   class   test{
2.   public   static   void   main(String   args[]){
3.       class   Foo{
4.               public   int   i=3;
5.   }
6.     Object   o=(Object)new   Foo();      
7.       Foo   foo=(Foo)o;    

8.   System.out.println( "i= "+foo.i);
  9.     }
10.}
A.i=3;B.Compilation   fails;
C.A   ClassCastException   is   throw   at   line   6
D..A   ClassCastException   is   throw   at   line   6
选那个答案呢     并说明原因。
另外   java异常有那些类型????

------解决方案--------------------
我没有运行,不过先说一下我的想法
Object o=(Object)new Foo();
这个强制转型,会丢失Foo 类的i的信息
然后又吧Object 转换为Foo类型,在输出foo.i的时候由于前面已经丢失i的信息,所以会编译错误
------解决方案--------------------
楼上强制转换为什么会丢失Foo的i的信息?
------解决方案--------------------
Object是任何class的最终父类,你这样强制转化只不过是把他的父类指针指向它,并不会丢失原来地任何数据,只不过在Object o=(Object)new Foo();的时候,你无法取得i罢了,但在new Foo()的实际内存中,并为改变任何数据,所以,Foo foo=(Foo)o; 再用Foo foo指针指向这块内存的时候,i保持不变。所以,编译正常,i=3。
------解决方案--------------------
俺同意楼上说法~~
------解决方案--------------------
编译正常,i=3!
------解决方案--------------------
(Object是任何class的最终父类,你这样强制转化只不过是把他的父类指针指向它,并不会丢失原来地任何数据,只不过在Object o=(Object)new Foo();的时候,你无法取得i罢了)

请问为什么父类指针指向它却无法取得i的值?

原因是父类对象引用的变量一定是父类的,而父类即Object中没有定义变量i,自然无法取到了
------解决方案--------------------
可以在
=================
6. Object o=(Object)new Foo();
7. Foo foo=(Foo)o;
=================
中间输出i,看看i的值

------解决方案--------------------
关注
------解决方案--------------------
i =3 ! 关于内部类的问题!
内部类的方法可以访问,该类定义所在类(外围类)的作用域中的数据,包括private的数据.对于其他类,该类被隐藏.

关于强制类型转换的问题:
在继承上,一个superClass变量既可以引用一个superClass对象,也可以引用一个subClass对象.反之不可以.强制类型转换只是暂时忽略对象的实际类型,使用对象的全部功能.
------解决方案--------------------
i始终存在 只不过Object o=(Object)new Foo(); 这句后对于o来说子类里的i是“不可见的”但只是“暂时的不可见” i并没有丢失(相当于用手遮住了白纸上的东西 只是让你看不见 但纸上写的东西还在) 当 Foo foo=(Foo)o; 这句后foo又转会了Foo所以对于foo来说i是“可见的”(相当于把之前遮在纸上的手移开了 当然就能看到纸上写的什么了) 因此System.out.println( "i= "+foo.i);这句会正常输出i=3
------解决方案--------------------
此题如果考察类型转换。
public class ClassCastExceptionextends RuntimeException当试图将对象强制转换为不是实例的子类时,抛出该异常。例如,以下代码将生成一个 ClassCastException:


Object x = new Integer(0);
System.out.println((String)x);
这道题正确输出i=3;如果换成下面的情况,就会发生异常了。
class Foo1{
public int i = 4;
}
class Foo {
public int i = 3;
}
Object o = (Object) new Foo1();
Foo foo = (Foo) o;

System.out.println( "i= " + foo.i);
}
------解决方案--------------------
不知道哪里存在丢失的问题
这个题目考察了2个方面:
1.内部类的创建
2.类型转换(Object是一切类的父类)

------解决方案--------------------