Android面试笔记总结(三)

有总结的工作才有意义,有总结的人生才会有进步。

本系列面试笔记所有问题,源自面试过程中的记录总结,主要涉及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属性





















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章