笔试题 Java 易错题精选
一、写出下列程序的运行结果( )String 不变性Java 值传递java
public class Test { public static void main(String[] args) { String a = "hello"; change(a); System.out.println(a); } public static void change(String name) { name = "world"; } }
运行结果
缓存
hello
二、写出下列程序的运行结果( )String 不变性Java 值传递多线程
public class Test { public void change(String str, char ch[]) { str = "test ok"; ch[0] = 'g'; } public static void main(String args[]) { String str = new String("good"); char[] ch = {'a', 'b', 'c'}; Test ex = new Test(); ex.change(str, ch); System.out.print(str + " and "); System.out.print(ch); } }
运行结果
app
good and gbc
三、写出下列程序的运行结果( )Integer 类缓存== 和 equalsui
public class Test { public static void main(String[] args) { Integer a = 1; Integer b = 2; Integer c = 3; Integer d = 3; Integer e = 321; Integer f = 321; Long g = 3L; Long h = 2L; System.out.println(c == d); System.out.println(e == f); System.out.println(c == (a + b)); System.out.println(c.equals(a + b)); System.out.println(g == (a + b)); System.out.println(g.equals(a + b)); System.out.println(g.equals(a + h)); } }
运行结果
this
true false true true true false true
四、写出下列程序的运行结果( )String 不变性Java 值传递spa
public class Test { public static void main(String[] args) { Test test = new Test(); int a = 1; test.addInt(a); System.out.println(a); String str = "hello"; test.addString(str); System.out.println(str); StringBuilder sb = new StringBuilder("hello"); test.addBuilder(sb); System.out.println(sb.toString()); Long m = 1L; Long n = 1L; System.out.println(m == n); m = 200L; n = 200L; System.out.println(m == n); String x = new String("hello"); String y = "hello"; System.out.println(x.equals(y)); System.out.println(x == y); } public void addInt(int a) { a = a + 1; } public void addString(String str) { str = str + "world"; } public void addBuilder(StringBuilder sb) { sb.append("world"); } }
运行结果
.net
1 hello helloworld true false true false
五、写出下列程序的运行结果( )intern() 方法== 和 equals线程
public class Test { public static void main(String[] args) { String s1 = "Monday"; String s2 = new String("Monday"); s2 = s2.intern(); if (s1 == s2) { System.out.println("s1 == s2"); } else { System.out.println("s1 != s2"); } if (s1.equals(s2)) { System.out.println("s1 equals s2"); } else { System.out.println("s1 not equals s2"); } } }
运行结果
指针
s1 == s2 s1 equals s2
解析
讲解:java.lang.String 的 intern() 方法"abc".intern() 方法的返回值仍是字符串"abc",表面上看起来好像这个方法没什么用处。但实际上,它作了个小动做:检查字符串池里是否存在"abc"这么一个字符串,若是存在,就返回池里的字符串;若是不存在,该方法会把"abc"添加到字符串池中,而后再返回它的引用。
六、写出下列程序的运行结果( )多线程 run() 和 start() 方法
public class Test { public static void main(String[] args) { Thread t = new Thread() { public void run() { pong(); } }; t.run(); System.out.print("ping"); } private static void pong() { System.out.print("pong"); } }
运行结果
pongping
七、写出下列程序的运行结果( )switch
public class Test { public static void main(String[] args) { System.out.println(getValue(2)); } public static int getValue(int i) { int Test = 0; switch (i) { default: System.out.println("default"); case 1: Test = Test + i; case 2: Test = Test + i * 2; case 3: Test = Test + i * 3; } return Test; } }
运行结果
10
八、写出下列程序的运行结果( )变量做用域
public class MeaningOfThis { public final int value = 4; public void doIt() { int value = 6; Runnable r = new Runnable() { public final int value = 5; public void run() { int value = 10; System.out.println(this.value); } }; r.run(); } public static void main(String... args) { MeaningOfThis m = new MeaningOfThis(); m.doIt(); } }
运行结果
5
解析
结果为 5,由于 this 指的是包含它的 Runnable,而不是外面的类 MeaningOfThis。
九、对文件名为 Test.java 的 Java 代码描述正确的是( )String 不变性Java 值传递构造方法
class Person { String name = "No name"; public Person(String nm) { name = nm; } } class Employee extends Person { String empID = "0000"; public Employee(String id) { empID = id; } } public class Test { public static void main(String args[]) { Employee e = new Employee("123"); System.out.println(e.empID); } }
A. 输出: 0000
B. 输出: 123
C. 编译报错
D. 输出: No name
答案
C
解析
class Person { String name = "No name"; public Person(String nm) { name = nm; } } class Employee extends Person { String empID = "0000"; public Employee(String id) { super("Railway Employee"); empID = id; } } public class Test { public static void main(String[] args) { Employee employee = new Employee("123"); System.out.println(employee.empID); System.out.println(employee.name); } }
运行结果
123 Railway Employee
方案二
class Person { String name = "No name"; public Person(String nm) { name = nm; } public Person() { } } class Employee extends Person { String empID = "0000"; public Employee(String id) { empID = id; } } public class Test { public static void main(String args[]) { Employee e = new Employee("123"); System.out.println(e.empID); } }
运行结果
123
十、写出下列程序的运行结果( )空指针异常
public class NULL { private static void hahn() { System.out.println("hahn"); } public static void main(String[] args) { NULL.hahn(); } }
运行结果
hahn
十一、写出下列程序的运行结果( )溢出Java 类型转换
public class Test { public static void main(String[] args) { int a = Integer.MAX_VALUE; long b = a + 1; System.out.println(a); System.out.println(b); } }
运行结果
2147483647 -2147483648
解决方案
public class Test { public static void main(String[] args) { int a = Integer.MAX_VALUE; long b = (long) a + 1; System.out.println(a); System.out.println(b); } }
运行结果
2147483647 2147483648
十二、写出下列程序的运行结果( )super 关键字final 关键字
import java.util.Date; public class Test extends Date { public static void main(String[] args) { new Test().test(); } private void test() { System.out.println(super.getClass().getName()); System.out.println(getClass().getName()); System.out.println(this.getClass().getName()); System.out.println(super.getClass().getSuperclass().getName()); System.out.println(getClass().getSuperclass().getName()); System.out.println(this.getClass().getSuperclass().getName()); } }
运行结果
Test Test Test java.util.Date java.util.Date java.util.Date
解析
为何 super 没有起做用呢?简单来讲,super 并不能表明一个超类的引用。
由于 super 并无表明超类的一个引用的能力,只是表明调用父类的方法而已。因此,在子类的方法中,不能这样用 System.out.println(super);也不能使用 super.super.mathod();
参考资料