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