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

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Java變量的賦值

2019-11-18 13:23:30
字體:
供稿:網(wǎng)友

  賦值是用等號(hào)運(yùn)算符(=)進(jìn)行的。它的意思是“取得右邊的值,把它復(fù)制到左邊”。右邊的值可以是任何常數(shù)、變量或者表達(dá)式,只要能產(chǎn)生一個(gè)值就行。但左邊的值必須是一個(gè)明確的、已命名的變量。也就是說,它必須有一個(gè)物理性的空間來保存右邊的值。舉個(gè)例子來說,可將一個(gè)常數(shù)賦給一個(gè)變量(A=4;),但不可將任何東西賦給一個(gè)常數(shù)(比如不能4=A)。
  對主數(shù)據(jù)類型的賦值是非常直接的。由于主類型容納了實(shí)際的值,而且并非指向一個(gè)對象的句柄,所以在為其賦值的時(shí)候,可將來自一個(gè)地方的內(nèi)容復(fù)制到另一個(gè)地方。例如,假設(shè)為主類型使用“A=B”,那么B處的內(nèi)容就復(fù)制到A。若接著又修改了A,那么B根本不會(huì)受這種修改的影響。作為一名程序員,這應(yīng)成為自己的常識(shí)。
  但在為對象“賦值”的時(shí)候,情況卻發(fā)生了變化。對一個(gè)對象進(jìn)行操作時(shí),我們真正操作的是它的句柄。所以倘若“從一個(gè)對象到另一個(gè)對象”賦值,實(shí)際就是將句柄從一個(gè)地方復(fù)制到另一個(gè)地方。這意味著假若為對象使用“C=D”,那么C和D最終都會(huì)指向最初只有D才指向的那個(gè)對象。下面這個(gè)例子將向大家闡示這一點(diǎn)。
  這里有一些題外話。在后面,大家在代碼示例里看到的第一個(gè)語句將是“package 03”使用的“package”語句,它代表本書第3章。本書每一章的第一個(gè)代碼清單都會(huì)包含象這樣的一個(gè)“package”(封裝、打包、包裹)語句,它的作用是為那一章剩余的代碼建立章節(jié)編號(hào)。在第17章,大家會(huì)看到第3章的所有代碼清單(除那些有不同封裝名稱的以外)都會(huì)自動(dòng)置入一個(gè)名為c03的子目錄里;第4章的代碼置入c04;以此類推。所有這些都是通過第17章展示的CodePackage.java程序?qū)崿F(xiàn)的;“封裝”的基本概念會(huì)在第5章進(jìn)行詳盡的解釋。就目前來說,大家只需記住象“package 03”這樣的形式只是用于為某一章的代碼清單建立相應(yīng)的子目錄。
  為運(yùn)行程序,必須保證在classpath里包含了我們安裝本書源碼文件的根目錄(那個(gè)目錄里包含了c02,c03c,c04等等子目錄)。
  對于Java后續(xù)的版本(1.1.4和更高版本),假如您的main()用package語句封裝到一個(gè)文件里,那么必須在程序名前面指定完整的包裹名稱,否則不能運(yùn)行程序。在這種情況下,命令行是:
  java c03.Assignment
  運(yùn)行位于一個(gè)“包裹”里的程序時(shí),隨時(shí)都要注重這方面的問題。
  下面是例子:
  
  
  
  //: Assignment.java
  // Assignment with objects is a bit tricky
  package c03;
  
  class Number {
   int i;
  }
  
  public class Assignment {
   public static void main(String[] args) {
    Number n1 = new Number();
    Number n2 = new Number();
    n1.i = 9;
    n2.i = 47;
    System.out.     ", n2.i: " + n2.i);
    n1 = n2;
    System.out.println("2: n1.i: " + n1.i +
     ", n2.i: " + n2.i);
    n1.i = 27;
    System.out.println("3: n1.i: " + n1.i +
     ", n2.i: " + n2.i);
   }
  } ///:~
  
  Number類非常簡單,它的兩個(gè)實(shí)例(n1和n2)是在main()里創(chuàng)建的。每個(gè)Number中的i值都賦予了一個(gè)不同的值。隨后,將n2賦給n1,而且n1發(fā)生改變。在許多程序設(shè)計(jì)語言中,我們都希望n1和n2任何時(shí)候都相互獨(dú)立。但由于我們已賦予了一個(gè)句柄,所以下面才是真實(shí)的輸出:
  1: n1.i: 9, n2.i: 47
  2: n1.i: 47, n2.i: 47
  3: n1.i: 27, n2.i: 27
  看來改變n1的同時(shí)也改變了n2!這是由于無論n1還是n2都包含了相同的句柄,它指向相同的對象(最初的句柄位于n1內(nèi)部,指向容納了值9的一個(gè)對象。在賦值過程中,那個(gè)句柄實(shí)際已經(jīng)丟失;它的對象會(huì)由“垃圾收集器”自動(dòng)清除)。
  這種非凡的現(xiàn)象通常也叫作“別名”,是Java操作對象的一種基本方式。但假若不愿意在這種情況下出現(xiàn)別名,又該怎么操作呢?可放棄賦值,并寫入下述代碼:
  n1.i = n2.i;
  這樣便可保留兩個(gè)獨(dú)立的對象,而不是將n1和n2綁定到相同的對象。但您很快就會(huì)意識(shí)到,這樣做會(huì)使對象內(nèi)部的字段處理發(fā)生混亂,并與標(biāo)準(zhǔn)的面向?qū)ο笤O(shè)計(jì)準(zhǔn)則相悖。由于這并非一個(gè)簡單的話題,所以留待第12章具體論述,那一章是專門討論別名的。其時(shí),大家也會(huì)注重到對象的賦值會(huì)產(chǎn)生一些令人震動(dòng)的效果。
  
  1. 方法調(diào)用中的別名處理
  將一個(gè)對象傳遞到方法內(nèi)部時(shí),也會(huì)產(chǎn)生別名現(xiàn)象。
  
  
  //: PassObject.java
  // Passing objects to methods can be a bit tricky
  
  class Letter {
   char c;
  }
  
  public class PassObject {
   static void f(Letter y) {
    y.c = 'z';
   }
   public static void main(String[] args) {
    Letter x = new Letter();
    x.c = 'a';
    System.out.println("1: x.c: " + x.c);
    f(x);
    System.out.println("2: x.c: " + x.c);
   }
  } ///:~
  
  在許多程序設(shè)計(jì)語言中,f()方法表面上似乎要在方法的作用域內(nèi)制作自己的自變量Letter y的一個(gè)副本。但同樣地,實(shí)際傳遞的是一個(gè)句柄。所以下面這個(gè)程序行:
  y.c = 'z';
  實(shí)際改變的是f()之外的對象。輸出結(jié)果如下:
  1: x.c: a
  2: x.c: z
  別名和它的對策是非常復(fù)雜的一個(gè)問題。盡管必須等至第12章才可獲得所有答案,但從現(xiàn)在開始就應(yīng)加以重視,以便提早發(fā)現(xiàn)它的缺點(diǎn)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 同仁县| 石泉县| 青冈县| 横山县| 宣城市| 呼伦贝尔市| 卫辉市| 罗城| 江西省| 隆林| 宜君县| 梁山县| 厦门市| 任丘市| 和政县| 方城县| 武乡县| 中西区| 莱州市| 太仆寺旗| 威宁| 舒兰市| 丘北县| 康保县| 邓州市| 临朐县| 蒙阴县| 延津县| 灵山县| 定安县| 荣昌县| 连州市| 宜州市| 惠水县| 广东省| 安新县| 嘉定区| 钦州市| 三门峡市| 柳州市| 三门峡市|