国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

講述Java初學者必須要了解的兩個常識

2019-11-18 11:49:04
字體:
來源:轉載
供稿:網友

  一、對象(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就是對象"說法的人,還是可以解釋這個問題。
  
  我們知道,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參數是值傳遞是不是錯誤了呢?其實并不是的,我們要記住,a只不過是對象的reference,而reference的復件與原來的reference指向的是同一個對象,我們對復件的操作,與對a的操作一樣,最終還是對指向對象的操作,因此,Java的參數,只有值傳遞。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 綦江县| 晋中市| 水富县| 登封市| 外汇| 嘉义市| 肇庆市| 吴江市| 巍山| 盐山县| 清镇市| 曲靖市| 安塞县| 大城县| 永登县| 威信县| 龙游县| 邳州市| 美姑县| 奉新县| 容城县| 久治县| 稻城县| 玛沁县| 闵行区| 禹城市| 新乐市| 广汉市| 额尔古纳市| 韩城市| 临高县| 镇坪县| 武定县| 万荣县| 阳东县| 永平县| 汉中市| 榆林市| 禄丰县| 玉门市| 龙井市|