刚开始一直没注意过这个问题,后来才发现,String类有这个toString方法的,其作用是返回这个string本身。
public
class A { public static void main(String args[]) { if("a".toString() == "a") {System.
out.println("a");}
else {System.
out.println("b");}
}
}
这个程序中,输出结果是a,并不会因为string对象调用toString方法而报错。
2. 数组的定义
public
class A { public static void main(String args[]) { int[][] a = new int[2][]; int[] b = new int[]{1, 2};}
}
定义一个二维数组,如int[][] a, 可以在new int[2][]中只写第一个维数,也可以写成new int[2][2]两个都写,但是不能都为空。
定义数组b的时候,{}中的初始化内容可以跟在new int[]后面,但是要注意,这个时候[]中不能添加数字了。
3. 继承时候构造方法的影响
public
class A extends Super { public A(String str) { i = 2;}
public static void main(String args[]) {A a =
new A("Hello");System.
out.println(a.i);}
}
class
Super { int i; public Super(String str) { i = 1;}
}
大家看这段程序输出什么结果?2?错了。1?也错了。答案是:无法通过编译。因为Super类中并没有提供无参的构造方法,当A继承Super类时,找不到Super的无参构造方法,所以无法通过编译,即使你为A类写了一个无参构造方法也不行。必须要提供一个Super的无参构造方法,这样才可以通过运行。4. 迭代器的问题
import
java.util.*;public
class A { public static void main(String args[]) {List list =
new ArrayList();list.add(
"Cat");list.add(
"Dog");list.add(
"Rat");ListIterator ltr = list.listIterator();
int i = 1; while (ltr.hasNext()) { if (i == 2)System.
out.println(ltr.previous()); elsei++;
}
}
}
答案是NoSuchElementException。也许有人会奇怪,第一次循环中,虽然判断了i == 2不成立,转而执行else中的i++,接着第二轮循环开始的时候,i==2成立了,为什么不打印出前面一个元素即Dog呢?因为,hasNext()方法虽然判断了是否有下一个元素,但是,迭代器并没有向后移动,此时还停留在第一个元素即Cat前面的,所以会出现异常。只有next()或previous()才会移动迭代器。
5. 公共类与类文件
以下这段代码是放在名称为Test.java的文件中的
class Base{
public static void main(String[] args){
System.out.println("Hello");
}
}
public class Test{}
运行结果是什么?NoSuchMethodError。但是如果Test是extends Base的话,那就能够正常输出Hello。
6. 重载方法与null
public
class A { public void method(Object o) {System.
out.println("Object Version");}
public void method(String s) {System.
out.println("String Version");}
public static void main(String args[]) {A question =
new A();question.method(
null);}
}
method方法被重载了。一个参数是Object,一个参数是String。运行的时候我们把null传进去,得到的结果是String Version,说明调用的是参数为String的method方法。
7. 抽象类的定义
抽象类中可以包含抽象方法,也可以不包含抽象方法。但是只要有一个抽象方法,这个类就必须声明为abstract!
8. 变量初始化问题
public
class A { static boolean b1; public static void main(String args[]) { boolean[] b2 = new boolean[1]; boolean b3;System.
out.println(b1);System.
out.println(b2[0]);System.
out.println(b3);}
}
以前说过,一个类的变量有默认值,但是在方法中定义的变量必须要初始化才能用,不然会报错。这个程序中,b3是方法中定义的变量,这样用是错误的,因为没有初始化。但是,b2这个数组却是可以的,b2[0]的值是false。虽然没有初始化,但是像这样在方法中声明的数组却可以拥有默认值。
9. String的concat方法
public
class A { public static void main(String args[]) {String a =
null;a.concat(
"abc");a.concat(
"def");System.
out.println(a);}
}
编译不会报错。答案是abcdef,吗?不是,会出现空指针异常。因为刚开始a总是指向null的。
10.多余的异常
public
class A { public static void main(String args[]) {A a =
new A(); try{a.bad();
}
catch(Ex1 e) {}
catch(Ex2 e){}
}
void bad() throws Ex1{}
}
class
Ex1 extends Exception{}class
Ex2 extends Exception{} 这个程序有两个自定义异常Ex1和Ex2,同时,A类有一个bad()方法抛出Ex1异常。在main方法中,调用bad方法,然后catch Ex1、Ex2。这个程序是会出现编译错误的。因为在catch Ex2那里会说Ex2永远不会抛出,这就是多余的异常。