之所以是面试总结一,作为自己遇到的面试问题的一个记录总结,不知道后面还有多少面试,所以标题就取了一个可以扩展的名字,这里只是知识点的一个总结记录不会讲的很深入全面;
第一,首先是一个对面试知识结构的总体的认识:
A.android的面试问题会分为两部分,一部分是java的知识点,一部分是android自身的知识点;
B.java的知识点一般说来不会太难,因为毕竟这是在面试android程序员,除非这个公司有些特殊的技术要求,所以面试前要了解一下这个公司是做什么的;一般java的面试题都是一些基础知识:
第二,java部分
java一般掌握一些在编程中常用到的知识点就可以,例如String的相关知识,基本类型及相互之间的转换,关键字及其作用,集合,一些语句块的了解如try...catch,抽象和接口,线程,java的一些常用设计模式,对java对象的理解,抽象、继承、封装、多态的理解;
1.string 是基本数据类型么,string是否可以更改,(因sting是final的);答案,不是基础数据类型,String 是一个final类型的类,这个类不可以更改和继承;
2.String s = new String(''a''),创建了几个对象;答案,两个;
这涉及到引用变量和对象、文字池和堆这四个概念,简单来说就是“s”是一个引用变量,new会出现一个对象,在new 的时候“a”会在文字池中出现并复制到堆中,由于“=”会把new的"a"的引用给“s”;顺便说一下相同字符串在文字池中是会被合并的,如String s = new String("a")、String b = new String("a"),这个时候其实是创建了三个对象,在文字池中由于字符串相同所以被合并了(存储空间也变为了一个),而堆中没有,所以文字池中一个,堆中两个;
这个问题可以看一下:http://www.cnblogs.com/zhoushengbing/p/3198375.html和http://bbs.csdn.net/topics/390806954;
3.final类型:
final的点会比较多这里简单说一下在程序中会常用到的:
首先final可以用到非抽象的类、非抽象的方法和成员变量;
其次final不可以被继承,final类型的方法不可以被重写,final类型的变量在赋值后不可以改变它的值;
最后final类中的方法默认是final类型;
可以参考:http://www.importnew.com/7553.html会有详细的final的知识点和http://lavasoft.blog.51cto.com/62575/18771/;
4.static类型:静态类型
相对于静态变量,没有staic声明的变量被称作实例变量;
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
还有就是静态方法等;
可以参考:http://lavasoft.blog.51cto.com/62575/18771/
有时候也会问final和static的区别,一个是不可修改,一个是内存只分配一次;
5.重载和重写:(多态)
这个我认为只区分几点就可以了,重载是在同一个类中对同一方法名的函数采用不同的参数,重写是在子类中用同样的方法名和参数重新写函数体代码块;
所以和这个关联的还有一个问题构造器是否可以重写,答案是不能;
6.抽象类和接口:(抽象和继承)
不对抽象类和接口做详细解释了,可以参考:http://blog.csdn.net/fengyunjh/article/details/6605085很有意思的一个说明和http://www.cnblogs.com/beanmoon/archive/2012/12/06/2805221.html
着重说一下不同点:
A.声明方式不同,一个用abstract一个用interface;
B.使用方式不同,一个用extends(看到extends就有些印象了吧),一个用implement(接口);
C.在抽象类中除了不能被实例化,包含abstract方法外于正常的java类没有太大区别,但是接口就和正常类完全不同了;
D.接口中只能用public修饰符,在抽象类中还可以用其他几个;
E.抽象类和接口都要求实现抽象类中的所有抽象方法;
F.抽象类中可以有非抽象方法,接口中只有抽象方法;
7.基本数据类型有:
byte,int,char(是单引用''和String的内容有些像'a'、'话'、'\n'、'十六进制编码形式也可以\u0061'),long,float(0.1f),double(0.1),boolean(true\false),short;
8.String、StringBuffer、StringBuilder的区别:
String 不可改如果用String来操作字符串面临着会创建多个对象的问题所以效率会比较低,另外两个不是final的效率会高上一些;
StringBuffer是线程安全的但是效率会比StringBuilder低一些,但是在多线程中不能保证StringBuider的安全;
9.对语句块try..catch的理解:
如果在语句块的不同部位出现return会如何运行,情况比较多,总的来说finally一定会执行但不一定是最后执行的,一个try{}finally{} 会先执行try然后try会保存结果,然后执行finally,finally执行完成之后在输出try的结果,这是没有return的一个过程,如果在try里加入return会在finally之后在执行return,如果finally里有return则直接跳出不会在去输出try里的内容了,如果问数据输出的情况,要结合是否有return和数据变量是局部的还是全局的来说;
10.java里的adapter:
要注意这个时候可能有两种,一个是适配器设计模式,一种是普通的adapter;
适配器模式,简单来说就是你比较贪心设计一个东西想让他有机器人的头脑还要有鸟的翅膀明明不兼容还要在一起,通常有目标接口(Target)、需要适配的类(Adaptee)、适配器(Adapter),适配器按照目标接口的需要把需要适配的类的接口转变为符合要求的接口;
普通的Adapter:主要的还是解决数据和界面的关系;
11.java的设计模式:
java的设计模式举例,工厂模式、单例模式、适配器模式、观察者模式,常用的有20多种,有些头疼;参考:http://www.cnblogs.com/zhoubang521/p/5200179.html;
因为android程序相对于java会小很多,所以很多时候其实不会完整的体现这些模式,一般都是遵循设计模式的一些思想,尽量避免一次性代码,增强可读性等;参考:http://www.cnblogs.com/hnrainll/archive/2011/12/29/2305582.html;
12.java单例要了解:
java的单例模式在android中也是常常被用到的,这个在我看到的这篇博客中讲解的比较全,http://www.blogjava.net/kenzhh/archive/2013/03/15/357824.html;