Java基礎:初學者容易混淆的幾個問題(轉)

ba發表於2007-08-16
Java基礎:初學者容易混淆的幾個問題(轉)[@more@]1.String類和StringBuffer類

它們都是處理字串的類,但是它們有一個最大的區別,那就是,String物件是儲存你不能改動的文字字元
串,相反,如果你希望改動,則應使用StringBuffer類作為替換.
eg1:
......
//omit some code
String s1="You are hired!";
System.out.println(s1.replace('h','f'));//用f把字串中的h替換了
System.out.println(s1);
......
//omit some code
執行結果:
You are fired!
You are hired!
結果分析:
從結果,明顯可知,s1的值並沒有被改變,而第一行結果只是螢幕內容的替換.
eg2:
......
//omit some code
StringBuffer s2=new StringBuffer("Hello from Java!");
s2.replace(6,10,"to");
System.out.println(s2);
......
//omit some code
執行結果:
Hello to Java!
結果分析:
顯然,s2的值已改變.

2.位邏輯與條件邏輯

首先宣告, 為了與位邏輯更好區分開來,我把通常所說的邏輯取了個別名叫做條件邏輯.
它們都有各自的運算子,位邏輯運算子有:&(與運算),^(異或運算),|(或運算);條件邏輯運算子有:&&(並
且),||(或者).
位邏輯運算通常是針對兩個數而言,實行位操作;而條件邏輯運算是針對兩個條件表示式而言,實行條件操
作.其實,位邏輯運算子一樣可以實現條件操作,但是此時有一個重要的區別:用位運算子時,不管運算子兩邊的
條件表示式成不成立,它都要通通進行運算判斷,而條件邏輯運算子不一樣了,如果透過左側的運算元就可以進
行它們需要的判斷,那麼它就不會再計算右側的運算元了,這種情況叫短路.廢話少說!且看下例.
eg1:
......
//omit some code
double value=0;
if(value!=0 && 1/value<1000){
System.out.println("The value is not too small.");
}
else{
System.out.println("The value is too small.");
}
......
//omit some code
執行結果:
The value is too small.
結果分析:
照理說應會出現除數為0的錯誤,但是我剛才說了,由於條件邏輯運算子是短路運算子,顯然,value!=0不
成立,立即就可作出判斷應執行else後的語句,所以它就不再會運算判斷1/value<1000了.如果不懂請再看一
例:
eg2:
......
//omit some code
double int1=0,int2=1,int3=1;
if(int1!=0 & (int2=2)==1){}
System.out.println("int2="+int2);
if(int1!=0 && (int3=2)==1){}
System.out.println("int3="+int3);
......
//omit some code
執行結果:
int2=2.0
int3=1.0
結果分析:
我想不用我分析了,你應該懂了吧.

3.例項變數與類變數

可以透過兩種方法在類中儲存資料───作為例項變數和類變數.例項變數是特定於物件的,如果你有兩個對
象(即一個類的兩個例項),每一個物件中的例項變數獨立於另一個物件中的例項變數的;另一方面,兩個物件的
類變數均指向相同的資料,並因此面儲存相同的值,換句話說,類變數被類中的所有物件共享.差點忘了,它們在
形式上的區別,類變數在宣告時比例項變數多一個static.
eg:
class data
{
public int intdata=0;//顯然,intdata在這兒是例項變數
}
public class exam
{
public static void main(String[] args)
{
data a,b;
a=new data();
b=new data();
a.intdata=1;
System.out.println("b.indata="+b.intdata);
}
}
執行結果:
b.intdata=0
結果分析:
可以看出,a.intdata的值雖然變了,但並沒有影響b.intdata.但是如果在data類中宣告intdata時,在其前
面加上static就變成類變數了(即:public static int intdata=0;),則此時執行結果會變為:
b.intdata=1
這次a.intdata值的改變可把b.intdata影響了,事實上,物件a和b的類變數均指向相同的資料,所有值一
樣,這就是類變數的作用.

4.例項方法,類方法,構造器方法

我們通常所說的方法系指例項方法,就像c語言中的函式一樣,其具體方法我就不用說了,在這裡我主要是
用它來區分類方法和構造器方法.類方法與例項方法最大的區別是:在形式上類方法多一個static,在用法上,
不必建立物件就可直接呼叫類方法(而例項方法卻一定要先建立物件,再透過物件呼叫).
eg:
class add
{
static int addem(int op1,int op2)
{
return op1+op2;
}
}
public class xxf
{
public static void main(String[] args)
{
System.out.println("addem(2,2)="+add.addem(2,2));
} //直接用類名作為物件呼叫類方法
}

注: 也可按通常的方法,即先建立物件,再呼叫方法,不過,這時static就無任何意義了.
再說說構造器方法,它是用來初始化物件中的資料的一種方法,建立很容易,只需在類中加上一個與這個類
同名的方法,不需要在前面加任何訪問說明符或者返回型別,另外,構造器也一樣可以向方法一樣傳遞引數.
eg:
class data
{
private String data1;//事先宣告

data(String s)
{
data1=s; /*透過接收資料來初始化變數.(注:不能在構造器內
宣告變數,事先在外就要宣告.)*/
}

public String getdata()
{
return data1;
}
}

public class xxf
{
public static void main(String[] args)
{
System.out.println((new data("I love you")).getdata());/*透過傳遞引數呼叫構造器新建一
個物件,再透過物件呼叫方法得到資料*/
}
}

5.介面與類

類是對一類特定物件的規格說明,我們可以類定義建立物件,透過建立物件來組合所有屬於該類的元件,而
介面不能這樣做.而介面實質上就是一個常量和抽象方法的集合,要使用一個介面,就需要在類中實現這個接
口,然後作為類定義的一部分,編寫介面中宣告的每一個方法,介面中的方法永遠是public,abstract,介面中的
常量永遠是public static和final,因此不需要為它們說明屬性.
因為在Java中不支援多重繼承,但是,可以用介面來實現類似的功能,這是介面的重要作用之一.
eg:
interface anyone //定義一個介面
{
final double PI=3.1416;
void setNumber(int number);
int getNumber();
}
interface anyother //定義另一個介面
{
void setString(String str);
String getString();
}

class xxf implement anyone,anyother //定義一個類,並使用兩個介面
{
int number;
String str;
public xxf(){}
void setNumber(int number)
{
this.number=number;
}
void setString(String str)
{
this.str=str;
}
void int getNumber(){}//可以為一個空實現.
void String getString(){}
}
//在類中必須實現介面中宣告的所有方法.(當然也可不必,但是要用到介面卡類或用抽象類)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-961686/,如需轉載,請註明出處,否則將追究法律責任。

相關文章