没有合适的资源?快使用搜索试试~ 我知道了~
首页2020版Android面试题集:操作系统详解与服务架构
2020版Android面试题集:操作系统详解与服务架构
需积分: 13 17 下载量 85 浏览量
更新于2024-07-15
收藏 16.09MB PDF 举报
Android面试题集2020版包含了针对Java和Android技术的深度考察,特别是从操作系统层面的理论和实践知识。首先,面试者可能会被问到关于操作系统的基本概念,比如它是什么,以及从应用层和内核层的不同视角来理解其功能。 在应用层视角,操作系统被定义为控制软件,负责管理应用程序的运行,确保它们合理使用资源,如CPU、内存、I/O设备等,并提供诸如文件系统、网络访问等服务,使用户能方便地使用计算机。它通过权限管理,限制不同应用程序之间的资源竞争,保持系统的稳定性和效率。 从底层视角,操作系统作为资源分配器,核心任务是协调和分配硬件资源,如CPU调度、内存分配,确保各个程序能够根据需求动态获取和释放资源,避免冲突,提高整体资源利用率。 此外,面试者还会被问及用户层与内核层的对应关系,如在计算机体系结构中,CPU被抽象为进程,硬盘被抽象为文件,内存被抽象为地址空间,这些都是为了便于应用程序的开发和使用。操作系统作为中间层,起到了连接硬件和应用程序的关键桥梁作用。 面试者还需要熟悉操作系统的基本层次结构,它位于硬件和应用程序之间,作为系统软件,与普通应用程序有着显著的区别,后者通常直接访问特定的资源。理解这个层次结构对于开发者来说,意味着需要掌握如何设计和实现高效的系统接口,以适应操作系统的要求。 这部分内容对于想要进入大厂的Android开发者来说,至关重要,因为它不仅测试了编程技能,还考察了对底层系统原理的掌握程度,这对于构建健壮、高效的Android应用至关重要。候选人需要准备好充分解释这些概念,以及相关的实际项目经验和解决操作系统相关问题的能力。
资源详情
资源推荐
super关键字和this作用类似,使被屏蔽的成员变量或者成员方法变为可见,或者说用来引用被屏蔽的成员变量和成员方
法。不过super是用在子类中,目的是访问直接父类中被屏蔽的成员,注意是直接父类(就是类之上最近的超类)。下
面是一个综合运用super的例子,有两个类:一个Father类,一个Father类的子类Son,通过这两个类完全演示了super
的用法,以下是代码:
package com.demo.test;
public class Father {
public String v = "Father";
public String x = "输出了Father类的public成员变量x!!!";
public Father() {
System.out.println("Father构造方法被调用!");
}
public Father(String v) {
this.v = "Father类的带参数构造方法!运行了.";
}
public void outinfo() {
System.out.println("Father的outinfo方法被调用");
}
public static void main(String[] args) {
// TODO 自动生成方法存根
}
}
package com.demo.test;
public class Son extends Father {
public String v = "Son";
public Son() {
super(); // 调用超类的构造方法,只能放到第一行.
System.out.println("Son无参数构造方法被调用!");
// super(); //错误的,必须放到构造方法体的最前面.
}
public Son(String str) {
super(str);
System.out.println("Son带参数构造方法被调用!");
}
// 覆盖了超类成员方法outinfo()
public void outinfo() {
System.out.println("Son的outinfo()方法被调用");
}
public void test() {
String v = "哈哈哈哈!"; // 局部变量v覆盖了成员变量v和超类变量v
System.out.println("------1-----");
System.out.println(v); // 输出局部变量v
System.out.println(this.v); // 输出(子类)成员变量v
System.out.println(super.v); // 输出超类成员变量v
System.out.println("------2-----");
System.out.println(x); // 输出超类成员变量v,子类继承而来
System.out.println(super.x); // 输出超类成员变量v
System.out.println("------3-----");
outinfo(); // 调用子类的outinfo()方法
this.outinfo(); // 调用子类的outinfo()方法
super.outinfo(); // 调用父类的outinfo()方法
}
public static void main(String[] args) {
new Son().test();
}
}
运行结果:
Father构造方法被调用!
Son无参数构造方法被调用!
------1-----
哈哈哈哈!
Son
Father
------2-----
输出了Father类的public成员变量x!!!
输出了Father类的public成员变量x!!!
------3-----
Son的outinfo()方法被调用
Son的outinfo()方法被调用
Father的outinfo方法被调用
说明:此例子仅仅为了说明super的用法,实际在设计类的时候一般都尽可能私有(private)化。
通过上面的例子,下面总结一下super的用法:
第一、在子类构造方法中要调用父类的构造方法,用“super(参数列表)”的方式调用,参数不是必须的。同时还要注意的
一点是:“super(参数列表)”这条语句只能用在子类构造方法体中的第一行。
第二、当子类方法中的局部变量或者子类的成员变量与父类成员变量同名时,也就是子类局部变量覆盖父类成员变量
时,用“super.成员变量名”来引用父类成员变量。当然,如果父类的成员变量没有被覆盖,也可以用“super.成员变量
名”来引用父类成员变量,不过这是不必要的。
第三、当子类的成员方法覆盖了父类的成员方法时,也就是子类和父类有完全相同的方法定义(但方法体可以不同),
此时,用“super.方法名(参数列表)”的方式访问父类的方法。
this、super的用法也不过这些,只有理解了其中的原理,才不会跌入陷阱!
1.3.5 接口和抽象类的区别。(校招&实习)
1.概述
一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框
架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体的业务实现
了。当你需要再开发另一个相近的项目时,你以前的抽象层说不定还可以再次利用 。*
面
对对
象
的
设计
,
复
用的
重
点
其
实应
该
是抽
象
层
的
复
用
,
而
不
是
具体
某
一
个代
码
块
的
复
用
*。
说到了抽象,我就不能不提到曾让我头痛的Java接口和Java抽象类了,这也是本文我想说的重点。
既然面向对象设计的重点在于抽象,那Java接口和Java抽象类就有它存在的必然性了。
Java接口(interface)和Java抽象类(abstract class)代表的就是抽象类型,就是我们需要提出的抽象层的具体表现。OOP
面向对象的编程,如果要提高程序的复用率,增加程序 的可维护性,可扩展性,就必须是面向接口的编程,面向抽象的
编程,正确地使用接口、抽象类这些有用的抽象类型作为你结构层次上的顶层。
Java接口和Java抽象类有太多相似的地方,又有太多特别的地方,究竟在什么地方,才是它们的最佳位置呢?把它们比
较一下,你就可以发现了。
1. Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以(就
是interface中只能定义方法,而不能有方法的实现,而在abstract class中则可以既有方法的具体实现,又有没
有具体实现的抽象方法),这大概就是Java抽象类唯一的优点吧,但这个优点非常有用。如果向一个抽象类里加入
一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个
Java接口里加入一个 新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这
个方法才行,这显然是Java接口的缺点。这个在我的另外一篇博客mapreduce 新旧API 区别中有提到类似的问
题,在新的mapreduce api中更倾向于使用抽象类,而不是接口,因为这更容易扩展。原因就是上面划线部分所说
的。
2. 一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的等级结构中,
而由于Java语言的单继承性,所以抽象类作为类型定义工具的效能大打折扣。在这一点上,Java接口的优势就出来
了,任何一个实现了一个Java接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个Java
接口,从而这个类就有了多种类型。(使用抽象类,那么继承这个抽象类的子类类型就比较单一,因为子类只能单
继承抽象类;而子类能够同时实现多个接口,因为类型就比较多。接口和抽象类都可以定义对象,但是只能用他们
的具体实现类来进行实例化。)
3. 从第2点不难看出,Java接口是定义混合类型的理想工具,混合类表明一个类不仅仅具有某个主类型的行为,而且
具有其他的次要行为。
4. 结合1、2点中抽象类和Java接口的各自优势,具精典的设计模式就出来了:声明类型的工作仍然由Java接口承担,
但是同时给出一个Java 抽象类,且实现了这个接口,而其他同属于这个抽象类型的具体类可以选择实现这个Java接
口,也可以选择继承这个抽象类,*
也
就
是
说
在
层
次
结
构
中
,
Java
接
口在
最
上
面
,
然
后
紧
跟
着
抽
象
类
*,这下两个
的最大优点都能发挥到极至了。这个模式就是*“
缺省
适
配
模
式
*”。在Java语言API中用了这种模式,而且全都遵循
一定的命名规范:Abstract +接口名。(A extends AbstractB implements interfaceC,那么A即可以选择实
现(@Override)接口interfaceC中的方法,也可以选择不实现;A即可以选择实现(@Override)抽象类AbstractB
中的方法,也可以选择不实现)
Java接口和Java抽象类的存在就是为了用于具体类的实现和继承的,如果你准备写一个具体类去继承另一个具体类的
话,那你的设计就有很大问题了。Java抽象类就是为了继承而存在的,它的抽象方法就是为了强制子类必须去实现的。
使用Java接口和抽象Java类进行变量的类型声明、参数是类型声明、方法的返还类型说明,以及数据类型的转换等。而
不要用具体Java类进行变量的类型声明、参数是类型声明、方法的返还类型说明,以及数据类型的转换等。
2.实例
下面给出一个具体的接口Action,代码如下所示:
package org.springframework.webflow.execution;
public interface Action {
public Event execute(RequestContext context) throws Exception;
}
在这个接口中,定义了一个没有具体实现的方法,方法名叫做execute(),返回类型是Event。如前面第一条所述,接口
中的方法都是没有实现的。这些方法的具体实现是在实现(implements)这个接口的类中给出的。
再来看一个实现Action接口的抽象类AbstractAction,代码如下。
package org.springframework.webflow.action;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanInitializationException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.ClassUtils;
import org.springframework.webflow.core.collection.AttributeMap;
import org.springframework.webflow.execution.Action;
import org.springframework.webflow.execution.Event;
import org.springframework.webflow.execution.RequestContext;
public abstract class AbstractAction implements Action, InitializingBean {
protected final Log logger = LogFactory.getLog(getClass());
public EventFactorySupport getEventFactorySupport() {
return new EventFactorySupport();
}
public void afterPropertiesSet() throws Exception {
try {
initAction();
} catch (Exception ex) {
throw new BeanInitializationException("Initialization of this Action failed: " +
ex.getMessage(), ex);
}
}
protected void initAction() throws Exception {
}
protected Event success() {
return getEventFactorySupport().success(this);
}
protected Event success(Object result) {
return getEventFactorySupport().success(this, result);
}
protected Event error() {
return getEventFactorySupport().error(this);
}
protected Event error(Exception e) {
return getEventFactorySupport().error(this, e);
}
protected Event yes() {
return getEventFactorySupport().yes(this);
}
protected Event no() {
return getEventFactorySupport().no(this);
}
protected Event result(boolean booleanResult) {
return getEventFactorySupport().event(this, booleanResult);
}
protected Event result(String eventId) {
return getEventFactorySupport().event(this, eventId);
}
protected Event result(String eventId, AttributeMap resultAttributes) {
return getEventFactorySupport().event(this, eventId, resultAttributes);
}
protected Event result(String eventId, String resultAttributeName, Object
resultAttributeValue) {
return getEventFactorySupport().event(this, eventId, resultAttributeName,
resultAttributeValue);
}
public final Event execute(RequestContext context) throws Exception {
Event result = doPreExecute(context);
if (result == null) {
result = doExecute(context);
doPostExecute(context);
} else {
if (logger.isInfoEnabled()) {
logger.info("Action execution disallowed; pre-execution result is '" +
result.getId() + "'");
}
}
return result;
}
protected String getActionNameForLogging() {
return ClassUtils.getShortName(getClass());
}
protected Event doPreExecute(RequestContext context) throws Exception {
return null;
}
//抽象方法
protected abstract Event doExecute(RequestContext context) throws Exception;
protected void doPostExecute(RequestContext context) throws Exception {
}
}
在抽象类AbstractAction中,既有具体实现的方法,又有没有具体实现的抽象方法
//抽象方法
protected abstract Event doExecute(RequestContext context) throws Exception;
剩余754页未读,继续阅读
ZyaireYolo
- 粉丝: 3
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 中国微型数字传声器:技术革新与市场前景
- 智能安防:基于Hi3515的嵌入式云台控制系统设计
- 手机电量低时辐射真增千倍?解析手机使用谣言
- 56F803型DSP驱动的高精度大功率超声波电源控制策略研究
- ARM与GPRS结合的远程监测系统设计
- GPS与RFID技术结合的智能巡检系统设计
- CPLD驱动的低功耗爆炸场温度测试系统设计
- 基于FPGA的智能驱动控制系统:可扩展设计与工业网络协议
- 基于ATmega128和CH374的嵌入式USB接口设计
- 基于AT89C52的温度补偿超声波测距仪:高精度设计与应用
- MSP430F448单片机在交流数字电压表中的应用
- 提升变频器应用效率的12项实用技巧
- STM32F103在数字电镀电源并联均流系统中的应用
- PSpice仿真下的升压开关电源设计:拓扑分析与CCM稳定性提升
- 轻巧高效:MSP430主导的低成本无线传感器网络节点设计
- FPGA在EDA/PLD中实现LVDS接口的应用解析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功