这篇文章是写给正准备考sun的SCJP的人。如果你不是,那么请你不要看! 没有任何原因! 哦!可能有一个原因:我不想你看了说! 唉,这些我全都懂,浪费我时间! 是的,这些可能对你并不重要,但我想那些准备考SCJP的人会感同身受的。这篇文章是以问答的形式呈现的,并复完整的代码!
1.关于"=="和"equals()"
不同primitive型别的数值可能会相等,但是不同型别的对象则彼此不会认为相等!
代码可能看起来象这样:
int j=42;
float k=42.0f;
System.out.println("i==k is "+(j==k));
Integer ia = new Integer (42);
Integer ib = new Integer (42);
Float f = new Float(42.0);
System.out.println("ia==ib is "+(ia==ib));
System.out.println("ia.equals(f) is "+(i.equals(f)));
完整代码:http://sxhv998.y365.com/java/Source/EqualsTest.java
注释:j==k j会晋升为float,其值从42变为42.0
2.关于逻辑运算符"&","&&","|","||"
"&" is logical AND
"&&" is conditional AND
"|" is logical OR
"||" is conditional OR
这看起来似乎很简单!但用在一起时可能就有些混乱了!
代码可能看起来象这样:
private static int j;
private static boolean methodB(int k) {
j += k;
return true;
}
public static void methodA(int i) {
boolean b;
b = i < 10 | methodB (4);
b = i < 10 || methodB (4);
b = i < 10 & methodB(4);
b = i < 10 && methodB(4);
}
public static void main (String args[] ) {
methodA (0);
System.out.println(j);
}
输出为12
完整代码:http://sxhv998.y365.com/java/Source/LogicalTest.java
注释:"||" 为条件或,所以只要前者表达式为Ture就不会去判断后者!
3.关于按位运算"&","|","^","~"
"&" is And
"|" is OR
"^" is XOR
"~" is Complement
运算符有令人惊讶的能力!可以将两个值相互交换,而不用把其中的任何一个值移动到其他地方!
代码可能看起来象这样:
int a=3;
int b=6;
a^=b;
b^=c;
a^=b;
完整代码:http://sxhv998.y365.com/java/Source/XORTest.java
这有时可能很有用!
4.参数到底是by value方式还是by reference方式传递的
有些人认为java中的参数是以by referene方式传递的,这是错的。实际上java中的参数是以by value方式传递的!不过在java中所有的对象都是以Object reference被访问的!
代码可能看起来象这样:
StringBuffer a = new StringBuffer ("A");
StringBuffer b = new StringBuffer ("B");
operate (a,b);
System.out.println(a + "," +b);
static void operate (StringBuffer x, StringBuffer y) {
x.append(y); //start
y = x; //end
}
输出为AB,B
完整代码:http://sxhv998.y365.com/java/Source/ByValueTest.java
注释:照我前面说的java中的参数是以by value方式传递的,所以x只是a的一个复件而已,同理y也只是b的复件。在start开始执行前a和x都是同一个StringBuffer(也就是"A")的Object reference。而b和y也都是同一个StringBuffer(也就是"B")的Object reference。在start执行之后,x中的内容"A"已变为"AB",那么相应的a中的内容"A"也已变为了"AB",因为它们都是同一个StringBuffer的Object reference。在end执行之后,y已不再是和b一样是同一个StringBuffer(也就是"B")的Object reference了!而是和a、x一样都是同一个StringBuffer的(也就是"AB")Object reference了!这样b中的内容并没有改变!所以输出为AB,B。
5.关于基本型别和对象的初始化问题!
代码可能看起来象这样:
Boolean[] foo2 = new Boolean[3];
Boolean bln = foo2[index];
int[] foo1 = new int[3];
int it = foo1[index];
System.out.println(bln+","+it);
其输出为:Null,0
完整代码:http://sxhv998.y365.com/java/Source/BooleanTest.java
注释:
型别
缺省值
外覆类
缺省值
boolean
false
Boolean
null
char
'\u0000'
Character
null
byte
0
Byte
null
short
0
Short
null
int
0
Integer
null
long
0
Long
null
float
0.0
Float
null
double
0.0
Double
null
6.关于继承中的构造函数!
代码可能看起来象这样:
class Super {
public int i = 0;
public Super (String text){
i = 1;
}
}
public class Test extends Super {
public Test (String text) {
i= 2;
}
public static void main (String args[]) {
Test test = new Test("asdf");
System.out.println(test.i);
}
}
完整代码:http://sxhv998.y365.com/java/Source/DefaultTest.java
注释:初看起来好像是输出2,但编译一下试试看!会产生一个错误!base class没有被初始化!如果derived class构造函数本体中未明确调用base class构造函数,那么base class的default构造函数便会被自动唤起。如果缺乏default构造函数,编译器便发出错误消息。(class不带构造函数,编译器会自动合成出一个default构造函数,反之则需要手动添加default构造函数。)