1.關于參數(shù)的傳遞
class ValHold{
public int i = 10;
}
public class ObParm{
public void amethod(){
ValHold v = new ValHold();
another(v);
System.out.println(v.i);
}
public void another(ValHold v){
v.i = 20;
ValHold vh = new ValHold();
v =vh;
System.out.println(v.i);
}
public static void main(String[] argv){
ObParm o = new ObParm();
o.amethod();
}
}
此題的答案是10,20,為什么不是10,10呢?
這樣解釋吧,按照sun官方的說法:當一個引用變量作為參數(shù)傳遞給一個方法時, 在這個方法內(nèi)可以改變變量的值,即改變引用指向的對象,(本題中將vh賦給v)但是方法的調(diào)用結束后,改變量恢復原來的值,即變量仍然指向原來的對象。 (即another(v)調(diào)用結束之后,v又回復到第一次ValHold v = new ValHold();時指向的地址空間。) 但是如果在方法內(nèi)改變了引用指向的對象的數(shù)據(jù)(屬性),那么當方法的調(diào)用結束后,盡管引用仍然指向原來的對象,這個對象的某個屬性已經(jīng)被改變了(v的i值在 執(zhí)行v.i=20的時候就已經(jīng)被改變了,所以調(diào)用another結束后,v.i已經(jīng)變成了20) .
2.關于內(nèi)部類
public class InOut{
String s= new String("Between");
public void amethod(final int iArgs) {
int iam;
class Bicycle{
Bicycle() {
System.out.println(s); //這兩句話可以,也就是說可以訪問s
System.out.println(iArgs); //和final int 常量
//System.out.println(iOther);
}
}
new Bicycle();
}
public void another(){
int iOther;
}
public static void main(String[] args) {
InOut inout= new InOut();
inout.amethod(22);
}
}
Inner class能夠存取外部類的所有實例變量----無論這些實例變量有什么樣的存取控制符(比如private),就像類中的方法能夠存取方法所在類的所有變量一樣;如果inner class定義在方法中,則inner class能夠存取方法所在的類中的實例變量,也能存取該方法中的局部變量,但該局部變量必須是final的,也就是只能訪問方法中的常量.(上面所說的都是普通內(nèi)部類,不是靜態(tài)內(nèi)部類的情況).
public class Testinner {
int t=10;
public void a() {
final int u =90;
class InMethod { //方法中內(nèi)部類
InMethod() { //內(nèi)部類的構造方法
System.out.println("u="+u); //封裝方法內(nèi)的變量必須是final才能訪問到!
System.out.println("t="+t); //外部類的變量可以任意訪問!
}
}
new InMethod();//必須在方法a()中創(chuàng)建內(nèi)部類對象之后,Testinner對象才能通過 a()訪問到InMethod類
}
public static void main (String[] args) {
Testinner t= new Testinner();
t.a();
}
}
輸出:u=90 ,t=10
方法中的內(nèi)部類不可以是static的!如果一個內(nèi)部類是靜態(tài)的(當然只能是類中的內(nèi)部類啦),那么這個類就自動的成為頂級(top-level)類即普通的類。靜態(tài)內(nèi)部類中的方法(無論是靜態(tài)的方法還是非靜態(tài)的方法)只能直接訪問外部類中的靜態(tài)成員,要訪問外部類中的非靜態(tài)成員,則必須創(chuàng)建外部類的對象。
posted on 2005-11-17 09:33
安德爾斯 閱讀(207)
評論(0) 編輯 收藏