程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 菜鳥必須了解的兩個常識

菜鳥必須了解的兩個常識

編輯:JAVA編程入門知識

  一,對象(object)與引用(reference)

  有許多書籍,對於對象與引用之間的關系一直語焉不詳,甚至有的干脆是錯誤的說法,我們必須對這個問題

  有個清晰的了解.

  我們知道:

  A a = new A();

  產生一個A類型的對象,a是這個對象的的一個引用,即a指向heap中真正的對象,而a和其他基本數據類型

  一起存放在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=15

  第一,第二行應該沒什麼異義,第三行是對a設置後i的值,問題是,第四行是不會輸出i=15的,正確結果是:

  i=20

  因此,a,b都是對對象的引用,當我們將b的引用賦予a時,a已經重新指向了b,對指向發生改變後的a的操作,

  就是對b的操作.

  當然,那些堅持"a,b就是對象"說法的人,還是可以解釋這個問題:對啊,a對象"變成"了b對象,沒有什麼,很

  正常啊.

  那麼,我們再來看:

  我們知道,java通過final來定義常量:

  final int i=10;

  當我們對一個常量重新賦值時,會發生編譯錯誤:

  i=5;//編譯不通過

  我們也可以通過final來定義常量對象:

  final A a = new 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) {
final A a = new A();
System.out.println(a.getI());
a.setI(8);
System.out.println(a.getI());
}
}

  如果a本身是個對象,那麼,根本就不可能

  a.setI(8);

  而實際a是一個引用,程序可以編譯並運行:

  顯示:8

  總之,java通過renfence來操控object,是深入學習java知識的基礎,例如下面一點:

  二,java參數是值(value)傳遞還是引用(reference)傳遞

  我們先看程序:

  

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參數是值傳遞是不是錯誤了呢?

  老爹告訴你:no!

  我們要記住,a只不過是對象的reference,而reference的復件與原來的reference指向的是同一個對象

  我們對復件的操作,與對a的操作一樣,最終還是對指向對象的操作,因此,java的參數,只有值傳遞.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved