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

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

數(shù)組和第一類對(duì)象

2019-11-18 12:08:36
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  無(wú)論使用的數(shù)組屬于什么類型,數(shù)組標(biāo)識(shí)符實(shí)際都是指向真實(shí)對(duì)象的一個(gè)句柄。那些對(duì)象本身是在內(nèi)存“堆”里創(chuàng)建的。堆對(duì)象既可“隱式”創(chuàng)建(即默認(rèn)產(chǎn)生),亦可“顯式”創(chuàng)建(即明確指定,用一個(gè)new表達(dá)式)。堆對(duì)象的一部分(實(shí)際是我們能訪問(wèn)的唯一字段或方法)是只讀的length(長(zhǎng)度)成員,它告訴我們那個(gè)數(shù)組對(duì)象里最多能容納多少元素。對(duì)于數(shù)組對(duì)象,“[]”語(yǔ)法是我們能采用的唯一另類訪問(wèn)方法。
  
  下面這個(gè)例子展示了對(duì)數(shù)組進(jìn)行初始化的不同方式,以及如何將數(shù)組句柄分配給不同的數(shù)組對(duì)象。它也揭示出對(duì)象數(shù)組和基本數(shù)據(jù)類型數(shù)組在使用方法上幾乎是完全一致的。唯一的差別在于對(duì)象數(shù)組容納的是句柄,而基本數(shù)據(jù)類型數(shù)組容納的是具體的數(shù)值(若在執(zhí)行此程序時(shí)碰到困難,請(qǐng)參考第3章的“賦值”小節(jié)):
  
  
  //: ArraySize.java
  // Initialization & re-assignment of arrays
  package c08;
  
  class Weeble {} // A small mythical creature
  
  public class ArraySize {
   public static void main(String[] args) {
    // Arrays of objects:
    Weeble[] a; // Null handle
    Weeble[] b = new Weeble[5]; // Null handles
    Weeble[] c = new Weeble[4];
    for(int i = 0; i < c.length; i++)
     c[i] = new Weeble();
    Weeble[] d = {
     new Weeble(), new Weeble(), new Weeble()
    };
    // Compile error: variable a not initialized:
    //!System.out.    System.out.println("b.length = " + b.length);
    // The handles inside the array are
    // automatically initialized to null:
    for(int i = 0; i < b.length; i++)
     System.out.println("b[" + i + "]=" + b[i]);
    System.out.println("c.length = " + c.length);
    System.out.println("d.length = " + d.length);
    a = d;
    System.out.println("a.length = " + a.length);
    // Java 1.1 initialization syntax:
    a = new Weeble[] {
     new Weeble(), new Weeble()
    };
    System.out.println("a.length = " + a.length);
  
    // Arrays of primitives:
    int[] e; // Null handle
    int[] f = new int[5];
    int[] g = new int[4];
    for(int i = 0; i < g.length; i++)
     g[i] = i*i;
    int[] h = { 11, 47, 93 };
    // Compile error: variable e not initialized:
    //!System.out.println("e.length=" + e.length);
    System.out.println("f.length = " + f.length);
    // The primitives inside the array are
    // automatically initialized to zero:
    for(int i = 0; i < f.length; i++)
     System.out.println("f[" + i + "]=" + f[i]);
    System.out.println("g.length = " + g.length);
    System.out.println("h.length = " + h.length);
    e = h;
    System.out.println("e.length = " + e.length);
    // Java 1.1 initialization syntax:
    e = new int[] { 1, 2 };
    System.out.println("e.length = " + e.length);
   }
  } ///:~
  Here’s the output from the program:
  
  
  b.length = 5
  b[0]=null
  b[1]=null
  b[2]=null
  b[3]=null
  b[4]=null
  c.length = 4
  d.length = 3
  a.length = 3
  a.length = 2
  f.length = 5
  f[0]=0
  f[1]=0
  f[2]=0
  f[3]=0
  f[4]=0
  g.length = 4
  h.length = 3
  e.length = 3
  e.length = 2
  
  其中,數(shù)組a只是初始化成一個(gè)null句柄。此時(shí),編譯器會(huì)禁止我們對(duì)這個(gè)句柄作任何實(shí)際操作,除非已正確地初始化了它。數(shù)組b被初始化成指向由Weeble句柄構(gòu)成的一個(gè)數(shù)組,但那個(gè)數(shù)組里實(shí)際并未放置任何Weeble對(duì)象。然而,我們?nèi)匀豢梢圆樵兡莻€(gè)數(shù)組的大小,因?yàn)閎指向的是一個(gè)合法對(duì)象。這也為我們帶來(lái)了一個(gè)難題:不可知道那個(gè)數(shù)組里實(shí)際包含了多少個(gè)元素,因?yàn)閘ength只告訴我們可將多少元素置入那個(gè)數(shù)組。換言之,我們只知道數(shù)組對(duì)象的大小或容量,不知其實(shí)際容納了多少個(gè)元素。盡管如此,由于數(shù)組對(duì)象在創(chuàng)建之初會(huì)自動(dòng)初始化成null,所以可檢查它是否為null,判定一個(gè)特定的數(shù)組“空位”是否容納一個(gè)對(duì)象。類似地,由基本數(shù)據(jù)類型構(gòu)成的數(shù)組會(huì)自動(dòng)初始化成零(針對(duì)數(shù)值類型)、null(字符類型)或者false(布爾類型)。
  
  數(shù)組c顯示出我們首先創(chuàng)建一個(gè)數(shù)組對(duì)象,再將Weeble對(duì)象賦給那個(gè)數(shù)組的所有“空位”。數(shù)組d揭示出“集合初始化”語(yǔ)法,從而創(chuàng)建數(shù)組對(duì)象(用new命令明確進(jìn)行,類似于數(shù)組c),然后用Weeble對(duì)象進(jìn)行初始化,全部工作在一條語(yǔ)句里完成。
  
  下面這個(gè)表達(dá)式:
  
  a = d;
  
  向我們展示了如何取得同一個(gè)數(shù)組對(duì)象連接的句柄,然后將其賦給另一個(gè)數(shù)組對(duì)象,就象我們針對(duì)對(duì)象句柄的其他任何類型做的那樣。現(xiàn)在,a和d都指向內(nèi)存堆內(nèi)同樣的數(shù)組對(duì)象。
  
  Java 1.1加入了一種新的數(shù)組初始化語(yǔ)法,可將其想象成“動(dòng)態(tài)集合初始化”。由d采用的Java 1.0集合初始化方法則必須在定義d的同時(shí)進(jìn)行。但若采用Java 1.1的語(yǔ)法,卻可以在任何地方創(chuàng)建和初始化一個(gè)數(shù)組對(duì)象。例如,假設(shè)hide()方法用于取得一個(gè)Weeble對(duì)象數(shù)組,那么調(diào)用它時(shí)傳統(tǒng)的方法是:
  
  hide(d);
  
  但在Java 1.1中,亦可動(dòng)態(tài)創(chuàng)建想作為參數(shù)傳遞的數(shù)組,如下所示:
  
  hide(new Weeble[] {new Weeble(), new Weeble() });
  
  這一新式語(yǔ)法使我們?cè)谀承﹫?chǎng)合下寫(xiě)代碼更方便了。
  
  上述例子的第二部分揭示出這樣一個(gè)問(wèn)題:對(duì)于由基本數(shù)據(jù)類型構(gòu)成的數(shù)組,它們的運(yùn)作方式與對(duì)象數(shù)組極為相似,只是前者直接包容了基本類型的數(shù)據(jù)值。
  
  1. 基本數(shù)據(jù)類型集合
  
  集合類只能容納對(duì)象句柄。但對(duì)一個(gè)數(shù)組,卻既可令其直接容納基本類型的數(shù)據(jù),亦可容納指向?qū)ο蟮木浔@孟驣nteger、Double之類的“封裝器”類,可將基本數(shù)據(jù)類型的值置入一個(gè)集合里。但正如本章后面會(huì)在
WordCount.java例子中講到的那樣,用于基本數(shù)據(jù)類型的封裝器類只是在某些場(chǎng)合下才能發(fā)揮作用。無(wú)論將基本類型的數(shù)據(jù)置入數(shù)組,還是將其封裝進(jìn)入位于集合的一個(gè)類內(nèi),都涉及到執(zhí)行效率的問(wèn)題。顯然,若能創(chuàng)建和訪問(wèn)一個(gè)基本數(shù)據(jù)類型數(shù)組,那么比起訪問(wèn)一個(gè)封裝數(shù)據(jù)的集合,前者的效率會(huì)高出許多。
  
  當(dāng)然,假如預(yù)備一種基本數(shù)據(jù)類型,同時(shí)又想要集合的靈活性(在需要的時(shí)候可自動(dòng)擴(kuò)展,騰出更多的空間),就不宜使用數(shù)組,必須使用由封裝的數(shù)據(jù)構(gòu)成的一個(gè)集合。大家或許認(rèn)為針對(duì)每種基本數(shù)據(jù)類型,都應(yīng)有一種非凡類型的Vector。但Java并未提供這一特性。某些形式的建模機(jī)制或許會(huì)在某一天幫助Java更好地解決這個(gè)問(wèn)題(注釋①)。
  
  ①:這兒是C++比Java做得好的一個(gè)地方,因?yàn)镃++通過(guò)template要害字提供了對(duì)“參數(shù)化類型”的支持。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 舞阳县| 北票市| 山阳县| 绵阳市| 西峡县| 汕尾市| 明光市| 文山县| 建宁县| 台安县| 襄樊市| 蚌埠市| 黄梅县| 子长县| 砚山县| 光山县| 佳木斯市| 乐平市| 临江市| 社会| 长宁县| 长汀县| 嘉义市| 韶关市| 西和县| 兰西县| 吉林省| 嘉祥县| 固始县| 罗田县| 乐山市| 涪陵区| 禹州市| 清远市| 闻喜县| 延边| 方正县| 巫山县| 呼图壁县| 冷水江市| 顺昌县|