看看这个面试题!!!!
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是一切类的父类)
------解决方案--------------------