秋招公司真题详解(Android方向)

/*以下都是我参加秋招一些公司的笔试真题,有线上的有线下的,自己用草稿纸记录下来的。如有错误,欢迎纠正。*/





1.

class A{
int a;
A(){
mb(1); //②父类A的构造方法调用方法mb(),由于子类B重写了A类的方法mb(),所以调用的是B的mb()
}
    void mb(int i){
a+=i;
}
void print(){
System.out.println(a);
}
}


class B extends A{
B(){
mb(2); //④子类B的构造方法调用自身的方法mb(),mb(2)结果为a=6
}
void mb(int i){
a+=i*2; //③定义int变量a默认值为0,mb(1)结果a=2
}
}


public class Main{
public static void m(A aa){
aa.mb(6); //⑤将B对象向上转型为A对象,调用方法mb()时,调用的是重写后的B类中的方法mb(),aa.mb(6)结果为a=18
aa.print(); //⑥调用方法print(),调用的是父类A中的print(),因子类B直接继承父类A的print()而没有重写,结果输出18
}
public static void main(String[] args) {
        m(new B()); //①创建B对象向上转型为A对象,先执行A的构造方法再到B的构造方法
    }
}


输出结果:    18


2.

public class B{
public static void main(String[] args) {
        B b=new B();
        b.amethod();
    }
void amethod(){
int i=99;
A a=new A();
a.i=30;
another(a,i);
System.out.println(a.i+" "+i); //②调用方法another传入了对象a,方法中a.i=20改变了i的值,所以输出20;i为amethod方法里的局部变量,初始赋值为99,而方法                                                                                   another传入了i只是值传递,不会实际改变amethod方法里的i,所以输出99
}
void another(A a,int i){
i=0;
a.i=20;
A aa=new A();
a=aa;
System.out.println(a.i+" "+i); //①a指向了新对象aa,所以a.i为10;i为another方法里的局部变量,初始赋值为0,所以输出也是0
}
}


class A{
public int i=10;
}


输出结果:

10 0

20 99


3.

public class A{
static String sm="1";
static String[] sn={"2"};
public static void main(String[] args){
A a=new A();
a.mb(sm,sn);
System.out.println(sm+sn[0]);
}
static void mb(String sm,String[] sn){
sm=new String("3"); //①sm指向新的字符串对象“3”,但不会对原本的sm对象造成实际的改变,这里的sm只是一个副本
sn[0]=new String("4"); //②字符串数组第0位指向新字符串对象“4”,这里实际改变了原本的sn对象数组,形参只要是数组传递、对象传递并在方法中执行对象的成员变                                                                 量赋值或调用对象的成员方法,即可真正地改变原本的对象
}
}

输出结果:

14


4.

class A{
void a(){
System.out.println("A-a");
}
static void b(){
System.out.println("A-b"); //静态方法b属于A类所有
}
}
public class B extends A{
void a(){
System.out.println("B-a"); //重写了A中的方法a
}
static void b(){
System.out.println("B-b"); //静态方法b属于B类所有,并不是对A中方法a的重写
}
public static void main(String[] args){
A a=new B();
a.a(); //①方法a被B类重写了,所以输出B-a
a.b(); //②通过对象a调用A的静态方法b,输出A-b
B b=new B();
b.a(); //③调用对象b的方法a,输出B-a
b.b(); //④通过对象b调用B的静态方法b,输出B-b
}
}

输出结果:

B-a

A-b

B-a

B-b


5.

class Two{
public static void main(String[] args){
One one=new One("Hello");
one.getString("Xiao Ming!");
}
}
class One{
private String s;
One(String str){
s=str;
}
void getString(String str){
System.out.println(s+" "+str);
}
}

输出结果:

Hello Xiao Ming!


6.

class A{
public static void mb(int i){
try{
if(i==1)throw new Exception();
System.out.print("1");
}catch(Exception e){
System.out.print("2");
return;
}finally{
System.out.print("3");
}
System.out.print("4");
}
public static void main(String[] args){
mb(0); //①依次输出134,finally块不管有无捕捉到异常都会执行
mb(1); //②抛出异常,异常后面的语句System.out.print("1");不会得到执行,catch和finally依次执行,然后catch里面的return,System.out.print("4");不会执行
}
}

输出结果:

13423


以下那个选项是错误的? D

A. final类的方法不能是抽象的,因为final类不能有子类

B. 抽象类不能实例化

C. 关键字abstract可以修饰类或方法

D. 抽象类的子类必须实现其超类的所有抽象方法

详解: 如果子类也是抽象类则无法实现父类的抽象方法


只要没有定义不带参数的构造函数,JVM都会为类生成一个默认构造函数(X)

详解:只有在类中没有定义任何构造方法时,编译器才会在该类中自动创建一个不带参数的构造方法


Java编译后会产生 字节码

详解:.java文件的程序代码经编译转换为.class文件的字节码,再由JVM转换为机器码


在继承中,关于构造方法的说明,下列说法错误的是(D

A、子类无条件的继承父类的无参构造方法,

B、子类可以引用父类中的有参构造方法,使用super关键字,

C、如果子类没有构造方法,则父类无参构造方法作为自已的构造方法,

D、如果子类有无参构造方法,而父类的无参构造方法则被覆盖。

详解:构造方法必须与类同名,则父类与子类的构造方法不可能同名,肯定不能覆盖。初始化时会先调用父类的构造方法,再调用子类的构造方法(by百度@和尚是个好人)


IntentService与Service的区别正确的是(C)

A. 没有区别

B. 启动方式不同

C. IntentService是Service的子类


screenOrientation= “portrait”,切换屏幕方向不会重新调用各个生命周期,只会调用onconfigurationchanged()   (X)

详解:屏幕只有一个方向不能改变,故不会调用 onconfigurationchanged() 
android:configChanges="keyboardHidden|orientation切换屏幕方向不会重新调用各个生命周期,只会调用onconfigurationchanged() keyboardHidden表示键盘辅助功能隐藏,如果你的开发API等级等于或高于13,还需要设置screenSize,因为screenSize会在屏幕旋转时改变,android:configChanges="keyboardHidden|orientation|screenSize" 
参考http://blog.youkuaiyun.com/dj0379/article/details/50906843


comparable与comparator的比较,参考http://www.cnblogs.com/aheizi/p/5207870.html


在一台256MB RAM的计算机上安装Linux系统,交换分区(swap)的大小合理的设置应该为(B)。

A.128MB

B.512MB

C.1024MB

D.4096MB

详解:交换分区用来支持虚拟内存,大小通常设为物理内存的2倍


什么是脏读、幻读和不可重复读?

1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
e.g.
        1.Mary的原工资为1000, 财务人员将Mary的工资改为了8000(但未提交事务)
        2.Mary读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!
        3.而财务发现操作有误,回滚了事务,Mary的工资又变为了1000
          像这样,Mary记取的工资数8000是一个脏数据。



2. 不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
    e.g.
    1.在事务1中,Mary 读取了自己的工资为1000,操作并没有完成
    2.在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务.
    3.在事务1中,Mary 再次读取自己的工资时,工资变为了2000

解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。



3. 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
   e.g.
   目前工资为1000的员工有10人。
   1.事务1,读取所有工资为1000的员工。
   2.这时事务2向employee表插入了一条员工记录,工资也为1000
   3.事务1再次读取所有工资为1000的员工 共读取到了11条记录,

解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题



不可重复读的重点是修改 :
同样的条件, 你读取过的数据,再次读取出来发现值不一样了
幻读的重点在于新增或者删除
同样的条件, 第 1 次和第 2 次读出来的记录数不一样
转载自http://www.360doc.com/content/13/0219/17/10504424_266580774.shtml

如何解决幻读?

增加范围锁RangeS,锁定检索范围为只读,这样就避免了幻读。


分代回收

基于对对象生命周期分析后得出的垃圾回收算法。把对象分为年青代、年老代、持久代,对不同生命周期的对象使用不同的算法(上述方式中的一个)进行回收。现在的垃圾回收器(从J2SE1.2开始)都是使用此算法的。

转载自https://my.oschina.net/shootercn/blog/15393


用有向无环图描述表达式(A+B)*((A+B)/A),至少需要顶点的数目为( 5 )

例如:
转载自http://wenku.baidu.com/link?url=_8fAcw66RfwQGzLd3DEiW7s79tkVRM-7ZSkoW2RVVmfoUf1wGfnGzFj5eVy8yth_gP_UCDAnuCVoqD3BHL2-iUY3Nf-HpMqtyPTULZ17JzK



java byte的理解

                byte b1=125,b2=3,b3,b6;
final byte b4=4,b5=6;
b6=b4+b5;
b3=(byte)(b1+b2);
System.out.println(b3+b6);

输出结果:13

详解:byte是8位,在运算时会转换为int,而int是32位,具体参考http://www.docin.com/p-678556760.html



Java类可以作为(B

A、数据封装机制
B、类型定义机制和数据封装机制
C、类型定义机制
D、上述都不对


以下关于Android应用程序的目录结构描述中,不正确的是(D 

a. src目录是应用程序的主要目录,由Java类文件文件组成  
b. assets目录是原始资源目录,该目录中的内容将不会被R类所引用 
c. res目录是应用资源目录,该目录中的所有资源内容都会被R类所索引  
d. AndroidManifest.xml文件是应用程序目录清单文件,该文件由ADT自动生成,不需要程序员手动修改


LR分析法解决“移进—归约”冲突时,左结合意味着打断联系而实行归约,右结合意味着维持联系而实行移进(



在数据库系统中死锁属于( C )

A.系统故障
B.程序故障
C.事务故障
D.介质故障




以下不是造成线程阻塞的方法是(C

A. I/O阻塞
B. sleep()\
C. interrupt()
D. wait()
详解: C选项是中断




以下哪项技术可用于拓扑发现(B

A. 频分复用
B. 泛洪
C. 冲突检测




以下说法错误的是(B

A. SQLite数据库版本改变,可自动更新数据库结构
B. 每次调用getWritableDatabase(),都会执行SQliteOpenHelper的onCreate()
C. SQliteOpenHelper类用来创建、更新数据库
D. SQliteDatabase类用来操作数据库




ListView自定义适配器,可在BaseAdpter中使用static来定义全局静态变量来提升效率(×

详解:static是Java中的一个关键字,当用它来修饰成员变量时,那么该变量就属于该类,而不是该类的实例。所以用static修饰的变量,它的生命周期是很长的,如果用它来引用一些资源耗费过多的实例(比如Context的情况最多),这时就要尽量避免使用了。



组播

D类IP地址,1110开头
224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用;

224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet;

224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效;

239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。



泛洪




Linux查看所有进程状态:ps -aux




Java线程安全创建方式:

1、synchronized
2、java.util.concurrent.atomic




Android注册广播的2种方式

1)静态注册:在AndroidManifest.xml注册,android不能自动销毁广播接收器,也就是说当应用程序关闭后,还是会接收广播。 
2)动态注册:在代码中通过registerReceiver()手工注册.当程序关闭时,该接收器也会随之销毁。当然,也可手工调用unregisterReceiver()进行销毁。




以下不属于RuntimeException的是(A、B)

A、IOException
B、FileNotFoundException
C、NullPointerException
D、ClassCastException

详解:B都属于A,IOException和RuntimeException是Exception的子类




execSQL不能实现以下哪一项(D)

A. create
B. insert
C. delete
D. select




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值