/*以下都是我参加秋招一些公司的笔试真题,有线上的有线下的,自己用草稿纸记录下来的。如有错误,欢迎纠正。*/
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编译后会产生 字节码
在继承中,关于构造方法的说明,下列说法错误的是(D)
A、子类无条件的继承父类的无参构造方法,
B、子类可以引用父类中的有参构造方法,使用super关键字,
C、如果子类没有构造方法,则父类无参构造方法作为自已的构造方法,
D、如果子类有无参构造方法,而父类的无参构造方法则被覆盖。
详解:构造方法必须与类同名,则父类与子类的构造方法不可能同名,肯定不能覆盖。初始化时会先调用父类的构造方法,再调用子类的构造方法(by百度@和尚是个好人)IntentService与Service的区别正确的是(C)
screenOrientation= “portrait”,切换屏幕方向不会重新调用各个生命周期,只会调用onconfigurationchanged()
(X)
comparable与comparator的比较,参考http://www.cnblogs.com/aheizi/p/5207870.html
在一台256MB RAM的计算机上安装Linux系统,交换分区(swap)的大小合理的设置应该为(B)。
A.128MB
B.512MB
C.1024MB
D.4096MB
详解:交换分区用来支持虚拟内存,大小通常设为物理内存的2倍什么是脏读、幻读和不可重复读?
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 次读出来的记录数不一样
如何解决幻读?
分代回收
基于对对象生命周期分析后得出的垃圾回收算法。把对象分为年青代、年老代、持久代,对不同生命周期的对象使用不同的算法(上述方式中的一个)进行回收。现在的垃圾回收器(从J2SE1.2开始)都是使用此算法的。
转载自https://my.oschina.net/shootercn/blog/15393
用有向无环图描述表达式(A+B)*((A+B)/A),至少需要顶点的数目为( 5 )
java byte的理解
final byte b4=4,b5=6;
b6=b4+b5;
b3=(byte)(b1+b2);
System.out.println(b3+b6);
Java类可以作为(B)
B、类型定义机制和数据封装机制
C、类型定义机制
D、上述都不对
以下关于Android应用程序的目录结构描述中,不正确的是(D)
a. src目录是应用程序的主要目录,由Java类文件文件组成
b. assets目录是原始资源目录,该目录中的内容将不会被R类所引用
c. res目录是应用资源目录,该目录中的所有资源内容都会被R类所索引
d. AndroidManifest.xml文件是应用程序目录清单文件,该文件由ADT自动生成,不需要程序员手动修改
LR分析法解决“移进—归约”冲突时,左结合意味着打断联系而实行归约,右结合意味着维持联系而实行移进(√)
在数据库系统中死锁属于( C
)
B.程序故障
C.事务故障
D.介质故障
以下不是造成线程阻塞的方法是(C)
以下哪项技术可用于拓扑发现(B)
以下说法错误的是(B)
ListView自定义适配器,可在BaseAdpter中使用static来定义全局静态变量来提升效率(×)
组播
Linux查看所有进程状态:ps -aux
Java线程安全创建方式:
Android注册广播的2种方式
2)动态注册:在代码中通过registerReceiver()手工注册.当程序关闭时,该接收器也会随之销毁。当然,也可手工调用unregisterReceiver()进行销毁。