您的位置:首页 > 职场人生

Android面试笔记总结(三)

2014-12-07 22:16 267 查看
有总结的工作才有意义,有总结的人生才会有进步。

本系列面试笔记所有问题,源自面试过程中的记录总结,主要涉及Java和Android,但是由于面试过程中任何问题都有可能被问到,所以也会涉及一些其他方向的知识。部分答案参考网上朋友的文章,如有错误之处,欢迎批评指正。


在面试的过程中,经常被问到一些平时编程忽略的细节问题,比如强制类型转换什么时候可以强制转换,什么可以编译通过却报运行错误。这些细节如果不是平时加以实践并注意,在真正被问到时还真有点蒙 - -
以下是我对父类子类之间类型转换,以及动态链接等问题的总结。
强制类型转换规则(个人总结):
1)在同一个继承树上的类都可以相互进行强制类型转换,这些转换在编译是都可以通过,但是在运行时,部分情况会报ClassCastException异常(规则第五条后续讲解)。比如:A extends B, B extends
C; 则A B C 三个类的对象都可以相互强转。
2)不在同一个继承树上的类型不可以进行强制类型转换(编译不会通过)。
3)两个子类不可以进行强制类型转换。
4)一个子类的对象可以强制转换成父类的对象。
5)一个父类的对象在强制转换成子类对象编译可以通过,但是运行时会报ClassCastException异常。
注意:一个对象进行强制类型转换之后,对象的类型就发生了改变,当使用这个对象调用属性和方法时,调用的是转换之后类的属性和方法。(注意动态链接问题,后文介绍)
从内存角度理解强制转换:
假设现在有一个父类father,他里面的变量需要占用1M的内存。这个father类有一个子类Son,需要占用0.5M的内存。
结合实例来分析强制类型转换:
Father f = new Father(); //系统将为其分配1M的内存空间。

Son s = new Son();//系统将为其分配1.5M的内存空间。因为子类会有一个隐藏的super指向父类实例,所以在实例 化子类对象之前,会先去实例化一个父类对象。也就是会先执行父类的构造函数。也是由于对象s中包含了父类的实例,所以子类对象s才可以调用父类father的方法。

Son s1 = s; // s1指向s的1.5M内存

Father f1 = (Father)s; //这是f1将指向对象s那1.5M内存中的属于父类实例的1M内存,所以f1这个对象只能调用父 类的方法和属性(存在1M内存中的),而不能调用子类的方法(存在0.5M内存中)

Son s2 = (Son) f;//编译通过,运行时报ClassCastException异常。因为f中只有1M的内存,而子类的引用s2必须有 1.5M的内存才能运行,所以在运行时,会报类型转换的异常。

Son s3 = (Son)f1;//这个语句可以正常运行。因为f1是有子类对象s转换而来的,所以她是具有1.5M内存的。只不 过f1指向的只有1M内存,但是既然他具备1.5M的内存,s3自然会指向1.5M的内存,所以这局运行时正常。

什么是动态链接?
前提:父类引用指向了子类对象。Father f = new Son();
当父类引用f调用一个方法时,比如f.foo();
若 foo()这个方法在子类被重写了,调用子类的foo();
若foo()这个方法在子类没有被重写。调用父类的foo();
以上两点就是java语言的动态链接。这个特点也体现了Java语言的多态性。
注意:只有方法才会被重写,属性不可以重写。所以动态链接这个性质只是针对方法而言。f.name 一定指的是父类的name属性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: