熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

Java變量的賦值

2013-11-15 11:43:14  來源: JSP教程 

  賦值是用等號運算符(=)進行的它的意思是取得右邊的值把它復制到左邊右邊的值可以是任何常數變量或者表達式只要能產生一個值就行但左邊的值必須是一個明確的已命名的變量也就是說它必須有一個物理性的空間來保存右邊的值舉個例子來說可將一個常數賦給一個變量(A=;)但不可將任何東西賦給一個常數(比如不能=A)
  對主數據類型的賦值是非常直接的由於主類型容納了實際的值而且並非指向一個對象的句柄所以在為其賦值的時候可將來自一個地方的內容復制到另一個地方例如假設為主類型使用A=B那麼B處的內容就復制到A若接著又修改了A那麼B根本不會受這種修改的影響作為一名程序員這應成為自己的常識
  但在為對象賦值的時候情況卻發生了變化對一個對象進行操作時我們真正操作的是它的句柄所以倘若從一個對象到另一個對象賦值實際就是將句柄從一個地方復制到另一個地方這意味著假若為對象使用C=D那麼C和D最終都會指向最初只有D才指向的那個對象下面這個例子將向大家闡示這一點
  這裡有一些題外話在後面大家在代碼示例裡看到的第一個語句將是package 使用的package語句它代表本書第本書每一章的第一個代碼清單都會包含象這樣的一個package(封裝打包包裹)語句它的作用是為那一章剩余的代碼建立章節編號在第大家會看到第章的所有代碼清單(除那些有不同封裝名稱的以外)都會自動置入一個名為c的子目錄裡章的代碼置入c以此類推所有這些都是通過第章展示的CodePackagejava程序實現的封裝的基本概念會在第章進行詳盡的解釋就目前來說大家只需記住象package 這樣的形式只是用於為某一章的代碼清單建立相應的子目錄
  為運行程序必須保證在classpath裡包含了我們安裝本書源碼文件的根目錄(那個目錄裡包含了cccc等等子目錄)
  對於Java後續的版本(和更高版本)如果您的main()用package語句封裝到一個文件裡那麼必須在程序名前面指定完整的包裹名稱否則不能運行程序在這種情況下命令行是
  java cAssignment
  運行位於一個包裹裡的程序時隨時都要注意這方面的問題
  下面是例子
  
  
  
  //: Assignmentjava
  // Assignment with objects is a bit tricky
  package c;
  
  class Number {
   int i;
  }
  
  public class Assignment {
   public static void main(String[] args) {
    Number n = new Number();
    Number n = new Number();
    ni = ;
    ni = ;
    Systemoutprintln(: ni: + ni +
      ni: + ni);
    n = n;
    Systemoutprintln(: ni: + ni +
      ni: + ni);
    ni = ;
    Systemoutprintln(: ni: + ni +
      ni: + ni);
   }
  } ///:~
  
  Number類非常簡單它的兩個實例(n和n)是在main()裡創建的每個Number中的i值都賦予了一個不同的值隨後將n賦給n而且n發生改變在許多程序設計語言中我們都希望n和n任何時候都相互獨立但由於我們已賦予了一個句柄所以下面才是真實的輸出
  : ni: ni:
  : ni: ni:
  : ni: ni:
  看來改變n的同時也改變了n!這是由於無論n還是n都包含了相同的句柄它指向相同的對象(最初的句柄位於n內部指向容納了值的一個對象在賦值過程中那個句柄實際已經丟失它的對象會由垃圾收集器自動清除)
  這種特殊的現象通常也叫作別名是Java操作對象的一種基本方式但假若不願意在這種情況下出現別名又該怎麼操作呢?可放棄賦值並寫入下述代碼
  ni = ni;
  這樣便可保留兩個獨立的對象而不是將n和n綁定到相同的對象但您很快就會意識到這樣做會使對象內部的字段處理發生混亂並與標准的面向對象設計准則相悖由於這並非一個簡單的話題所以留待第章詳細論述那一章是專門討論別名的其時大家也會注意到對象的賦值會產生一些令人震驚的效果
  
   方法調用中的別名處理
  將一個對象傳遞到方法內部時也會產生別名現象
  
  
  //: PassObjectjava
  // Passing objects to methods can be a bit tricky
  
  class Letter {
   char c;
  }
  
  public class PassObject {
   static void f(Letter y) {
    yc = z;
   }
   public static void main(String[] args) {
    Letter x = new Letter();
    xc = a;
    Systemoutprintln(: xc: + xc);
    f(x);
    Systemoutprintln(: xc: + xc);
   }
  } ///:~
  
  在許多程序設計語言中f()方法表面上似乎要在方法的作用域內制作自己的自變量Letter y的一個副本但同樣地實際傳遞的是一個句柄所以下面這個程序行
  yc = z;
  實際改變的是f()之外的對象輸出結果如下
  : xc: a
  : xc: z
  別名和它的對策是非常復雜的一個問題盡管必須等至第章才可獲得所有答案但從現在開始就應加以重視以便提早發現它的缺點

From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19494.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.