楊子JAVA學習筆記~轉載請聲明原創~

來源:互聯網
上載者:User

JAVA反射機制實現方法:

反射設定屬性:
A a = new A();
Field field = a.getClass().getDeclaredField("x");
field.setAccessible(true);
field.set(a, 1);
反射讀取屬性:
Field f = a.getClass().getDeclaredField("x");
f.setAccessible(true);
System.out.println(f.get(a));

 

引用是個很有意思的東西。
       Box a=new Box();
           Box b=new Box();
這個時候a和b對應各自的記憶體位址,如果
      a=b;
這個時候a,b均指向同一個記憶體位址即b的記憶體位址。也就是說現在你更改a中的成員變數的值b的變數的值也隨之改變;

如果改變b中成員變數的值,a的對應變數也隨之改變。引用只是一個記憶體的地址。

 

 

【對象?引用?傻傻分不清楚!】
A a = new A(); 
產生一個A類型的對象,a是這個對象的的一個引用,即a指向heap中真正的對象,
而a和其他基礎資料型別 (Elementary Data Type)一起存放在stack中。也就是object通過reference操控,
在底層的話,a更象一個指標。
a就是對象,初學者的話也沒什麼大問題,因為對a的操作,就是對a指向的對象的操作。
問題是,當a的指向發生改變時,a就是對象的說法就不能適應程式設計的需要。讓我們來看一個簡單的程式:
class A
{
private int i=0;
public void setI(int x)
{
i=x;
}
public int getI()
{
return i;
}
}

public class MyRef1

public static void main(String[] args)
{
A a=new A();
A b=new A();
a.setI(10);
b.setI(15);
System.out.println("a的i="+a.getI());
System.out.println("b的i="+b.getI());
a=b;
a.setI(20);
System.out.println("a的i="+a.getI());
System.out.println("b的i="+b.getI());
}
}

a的i=10
b的i=15
a的i=20
b的i=20

因此,a,b都是對對象的引用,當我們將b的引用賦予a時,a已經重新指向了b,
對指向發生改變後的a的操作,就是對b的操作。
 
 
我們知道,java通過final來定義常量:
final int i=10;
當我們對一個常量重新賦值時,會發生編譯錯誤:
i=5;//編譯不通過
我們也可以通過final來定義常量對象:
final A a = new A();
這樣的話,我們將不能對a重新賦值。 
如果a本身是個對象,那麼,這個對象就不能發生改變,其實,a只不過是一個引用,它只能指向原來指向的對象,
並不是說它所指的對象的狀態不能改變,因此,我們可以通過不改變a原來的指向的情況下對對象狀態進行改變。
總之,Java通過renfence來操控object.

參數【值傳遞?引用傳遞?傻傻分不清楚!】
public class MyRef2

static int x=10;
static int y=20;
public static void fangfa(int i)
{
i++;
x=i;
}

public static void main(String[] args)
{
System.out.println("x="+x);
System.out.println("y="+y);
MyRef2.fangfa(y);
System.out.println("x="+x);
System.out.println("y="+y);  

}

顯然,將顯示:
x=10
y=20
x=21
y=20

y的值並沒有發生改變,MyRef2.fangfa(y)使用的僅僅是y的值,裡面的i++也不會作用到y本身。
顯然,java的參數是值傳遞,但是,為什麼會有引用傳遞的說法呢?看下面這個程式:
class A
{
private int i=0;
public void setI(int x)
{
i=x;
}
public int getI()
 
return i;
}
}

public class MyRef1
{

public static void setA1(A newA,int t)
{
newA.setI(t);

}

public static void main(String[] args)
{
A a=new A();
System.out.println(a.getI());
MyRef1.setA1(a, 30);
System.out.println(a.getI());
}

}
按照值傳遞的說法,MyRef1.setA1(a,30);將使用a所指的對象的一個複件,
最終對這個對象沒有作用,而事實是,方法對這個對象起了作用,程式將顯示0,30。
那麼,Java參數是值傳遞是不是錯誤了呢?其實並不是的,
我們要記住,a只不過是對象的reference,而reference的複件與原來的reference指向的是同一個對象,
我們對複件的操作,與對a的操作一樣,最終還是對指向對象的操作,因此,Java的參數,只有值傳遞。

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.