【面试题】2018秋招软通动力java笔试题总结

1、请判断下面程序的运行结果

public static void main(String[] args) {
for(int i = 0;i<3;i++) {
System.out.println(i);
}
System.out.println(i);
}
答案:编译时错误
解析:i是for循环中的局部变量,在循环外检测不到此变量

2、请判断下面程序运行时会出现什么类型的异常

public static void main(String[] args) {
String s = null;
s.concat(“abc”); //运行异常:java.lang.NullPointerException
}
答案:NullPointerException
解析:String的初始化问题和string的concat连接字符串的方法
涉及的知识点很多:
(1)、首先理解String abc=null;String abc="";String abc;三种写法有什么区别?
String abc=null:创建一个空字符串对象,即创建了对象,但里面什么也没有,所以不能调用String中的任何方法
String abc="":创建一个字符串为空的字符串对象。 即创建了对象,对象中有字符串,单字符串为空,与上边的区别是他一应为对象赋值;
String abc:声明一个字符串对象,但并没有分配内存,而1,2已经分配了内存。 如果没有给abc赋过值,判断条件abc=="“会导致异常
对于最后一种表示,你不能if(abc==null),或者 int length = abc.length();编译的时候会提示可能没有初始化. String str=“aaa”; //于栈上分配内存
String str=new String(“aaa”); //于堆上分配内存
null是用来判断引用类型是否分配了存储空间 ,”"是针对字符串的;
在成员变量的定义中,String s;等同于String s=null;而在本地变量(方法变量)的定义中,String s;不等同于String s=null;,这时要使用s必须显式地赋值。
在成员变量的定义中,String s;等同于String s=null;
而在本地变量(方法变量)的定义中,String s;不等同于String s=null;,这时要使用s必须显式地赋值。
(2)、concat连接字符串的方法
public String concat(String str)将指定字符串连接到此字符串的结尾。
如果参数字符串的长度为 0,则返回此 String 对象。否则,创建一个新的 String 对象,用来表示由此 String 对象表示的字符序列和参数字符串表示的字符序列连接而成的字符序列。
这道题如果是:
String s = “”;
s.concat(“abc”);
System.out.println(s.concat(“abc”));
System.out.println(s.concat(“abc”));
就可以正常运行输出

3、判断下面程序的运行结果

public static void main(String[] args) {
int i;
System.out.println(“i=”+i);
}
答案:编译时错误
解析:
只要是在方法在中定义变量都要显示赋初值,main()方法也不例外,而在方法之外编译器回自动赋初值。

4、关于方法命名,下面那句话是正确的:

(A)、除了构建器外,定义和类名相同的方法名会产生编译错误。 
(B)、如果没有定义构建器,那么可以定义和类名相同的方法名。 
(C)、定义和类名相同的方法名不会产生错误,只是有时候容易混淆。 
(D)、定义和类名相同的方法名不会有任何问题。
答案:C
解析:D选项错在如果定义一个与类名相同的方法会提示警告:This method has a constructor name

5、判断下面程序的运行结果

public static void main(String[] args) {
int a=0;
int c =0;
do {
–c;
}while(c>0);
System.out.println©;
System.out.println(a);
}
}
答案:-1,0;
解析:这道题本身简单,但要注意循环体中内容变化时的输出结果
c–: -1,0;
c=c–: 0,0 先把c赋值给c,在减一
c=–c:-1,0
a=c–:-1,0
a=–c:-1,-1

6.下列哪种说法是正确的()

A.实例方法可直接调用超类的实例方法
B.实例方法可直接调用超类的类方法
C.实例方法可直接调用其他类的实例方法
D.实例方法可直接调用本类的类方法
答案:D
分析:类方法指的是用static关键字修饰的方法,而实例方法就是相对于类方法的其它方法
当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址,当该类创建对象后,
类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行。需要注意的是,
当我们创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址,
也就是说,方法的入口地址被所有的对象共享,当所有的对象都不存在时,方法的入口地址才被取消。
对于类中的类方法,在该类被加载到内存时,就分配了相应的入口地址。从而类方法不仅可以被类创建
的任何对象调用执行,也可以直接通过类名调用。类方法的入口地址直到程序退出才被取消。
对于A,不可以调用父类的private实例方法。因为private修饰的方法只有本类对象才可以调用
对于B,类方法只有本类才可以调用
对于C,跟A相同,比A更离谱

你可能感兴趣的:(java基础)