发布于 2015-01-19 08:57:06 | 690 次阅读 | 评论: 0 | 来源: 网友投递
Android移动端操作系统
Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。
本文为大家整理分享的是一份CVTE2015校园招聘面试题-Android开发,感兴趣的同学参考下。
以下为面试题:
1. Java中abstract的用法
abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型,抽象类就像当于一类的半成品,需要子类继承并覆盖其中的抽象方法。abstract修饰方法,会使这个方法变成抽象方法,也就是只有声明(定义)而没有实现,实现部分以";"代替。需要子类继承实现(覆盖)。
2. Java反射式如何实现的,有什么缺点?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;也就是具有动态获取的信息以及动态调用对象的方法的功能。反射主要解决动态编程,即使用反射时,所有的对象生成是动态的,因此调用的方法也是动态的.反射可以简化开发,但是代码的可读性很低。
3. Android ANR异常及解决方法
ANRs (“Application Not Responding”),意思是”应用没有响应“。在如下情况下,Android会报出ANR错误:
– 主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件
– BroadcastReceiver 没有在10秒内完成返回
通常情况下,下面这些做法会导致ANR
1)在主线程内进行网络操作
2)在主线程内进行一些缓慢的磁盘操作(例如执行没有优化过的SQL查询)
应用应该在5秒或者10秒内响应,否则用户会觉得“这个应用很垃圾”“烂”“慢”…等等
解决方法:
1)运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。有时候需要做一些和网络相互交互的耗时操作就采用asyntask异步任务的方式(它的底层其实Handler+mesage有所区别的是它是线程池)等,在主线程中更新UI。(可以采用重新开启子线程的方式,然后使用Handler+Message的方式做一些操作,比如更新主线程中的ui等)
2)应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为 BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service。(此处需要注意的是可以在广播接受者中启动Service,但是却不可以在Service中启动broadcasereciver,关于原因后续会有介绍,此处不是本文重点)
3)避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广 播时需要向用户展示什么,你应该使用Notification Manager来实现。
4. IP、TCP、UDP分别在OSI的那一层?及其作用。
IP在网络层:为计算机网络相互连接进行通信而设计的协议,为位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。
TCP、UDP:提供了节点间的数据传送服务DP在传输层。
5. 下面程序的输出是什么?
public class FinallyTest1 {
static char label;
public static void main(String[] args) {
System.out.println(test1());
System.out.println(label);
}
public static char test1() {
try {
System.out.println('A');
return label = 'A';
}
finally {
System.out.println('B');
label = 'B';
}
}
}
输出:
A
B
A
B
6. 下面的空改填什么代码?
public static void main(String[] args) throws IOException {
FileReader inputStream = null;
FileWriter outputStream = null;
try {
inputStream = new FileReader("xanadu.txt");
outputStream = new FileWriter("characteroutput.txt");
int c;
while ((c = inputStream.read()) != -1) {
outputStream.write(c);
}
} finally {
//在这里填代码
}
}
答案:
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
7. 有M个台阶,一个人从地面开始,每次可以上一个或两个,问上到第M个有多少种方法。
思路:
走第一台阶只有1种方法;
走第二台阶有2种方法,(一步或两步..);
走第三台阶的时候就是分两步了:可以从第一台阶直接到第三台阶,也可以是从第二台阶到第三台阶,所以有1+2=3种方法;
走第四台阶也是分两步:可以从第二台阶直接到第四台阶,也可以是从第三台阶到第四台阶,所以有3+2=5种方法;
…………
以此类推,走1-9台阶需要的步数就是:1,2,3,5,8,13,21,34,55(斐波那契数列:每项等于前两项和)。
8.给一个数M,则有自然数1~N前面加上符号运算得到M,求出最小的N并输出,例如:M=12,-1+2+3+4+5+6-7=12 输出7;
思路:
下面几行代码能找到一个最小的n,这个n使得1~n全部取+号时候正好大于等于M.注意得到的这个n是最小的
n = (int)(( sqrt(8 * M) - 1 ) / 2); // <<== n(n+1)/2 >= M
if( n * (n+1)/2 < M )
n ++;
然后计算和M之间的差,如果差为0显然全部取正号已经满足要求,如果不是0又分为奇数和偶数来区别对待.如果是偶数T,那么显然把T/2前面的符号从+改为-就可以了.这个T/2一定是小于n的,也就是说在1~n之间能够找到的。如果是奇数Y,那么显然n还不对,那么可以继续尝试后面的n直到这个差为偶数为止.。
9. 写一个UML表示类、属性、方法。
这个要熟悉UML的类图啦