我考SCJP前的准备工作(一)

类别:Java 点击:0 评论:0 推荐:

这篇文章是写给正准备考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构造函数。)

 

本文地址:http://com.8s8s.com/it/it16887.htm