
public class Jtest
{
int m=1;
int i=3;

void Jtest()
{
m=2;
i=4;
}


public static void main(String[] args)
{
Jtest app=new Jtest();
System.out.println(app.m+","+app.i);
}
}

寫出輸出.
結果是1,3;
因為在這里void Jtest();并沒有并調(diào)用,它只是一個
方法,而非構造方法,這樣的編寫是有警告的,不過
可以運行.

public class Jtest
{
int m=1;
int i=3;

Jtest()
{
m=2;
i=4;
}

public static void main(String[] args)
{
Jtest app=new Jtest();
System.out.println(app.m+","+app.i);
}
}

寫出輸出:
結果是2,4;
調(diào)用了構造方法,不加修飾符,默認訪問權限是
package access,在Java里沒有關鍵字表示,就是
包內(nèi)的能訪問,包外就不行了(即使導入也不行).
public class Test


{
static void oper(int b)

{
b = b + 100;
}
public static void main(String[] args)

{
int a = 99;
oper(a);
System.out.println(a);
}

}
輸出為99.
我們來分析一下內(nèi)存:
int a = 99;
首先在棧里面開辟一塊空間保存a
比如:a:xxxx
然后調(diào)用oper(a);
這時把a 的值99賦給int b;
b在內(nèi)存里也開辟了自己的空間,此時
值也是99.
然后執(zhí)行oper(a);方法體,b = b + 100;
此時b的值為199,a的值為99.

public class Test
{

public static void main(String[] args)
{
String a=new String("A");
String b=new String("B");
oper(a,b);
System.out.print(a+","+b);
}

static void oper(String c,String d)
{
c.concat("B");
d=c;
}
}

此程序輸出:A和B.
原因就是String是final類型的.并不會被改變.
public class Test


{
public static void main(String[] args)

{
String a = new String("A");
String b = new String("B");
a.concat("aa");
System.out.println(a + "," + b);
}

}

這個還是會輸出A,B
原因同上.
package intervie;

public class Test


{
public static void main(String[] args)

{
String a = new String("A");
String b = new String("B");
a = a.concat("aa");
System.out.println(a + "," + b);
}

}

做了下改動,再來看看.結果就不同了.
輸出的是Aaa,B
因為String 是final類型的.所以執(zhí)行到
a = c.concat("aa");
會在heap里新創(chuàng)建一個對象,而a指向它.
這是一新的地址,同String a 這個已經(jīng)不同了.
所以輸出的是后一個.即改變后的值.
public class Test


{
static void oper(StringBuffer c,StringBuffer d)

{
d = c.append("B");
}
public static void main(String[] args)

{
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
oper(a, b);
System.out.println(a + "," + b);
}

}

此程序會輸出:AB,B
StringBuffer是可變的線程安全的.
原試題下載地址:點此下載