<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-93  評(píng)論-78  文章-11  trackbacks-0

     

    問題一:我聲明了什么!

     

      String s = "Hello world!";

      許多人都做過這樣的事情,但是,我們到底聲明了什么?回答通常是:一個(gè)String,內(nèi)容是"Hello world!"。這樣模糊的回答通常是概念不清的根源。如果要準(zhǔn)確的回答,一半的人大概會(huì)回答錯(cuò)誤。

      這個(gè)語句聲明的是一個(gè)指向?qū)ο蟮囊?,名?#8220;s”,可以指向類型為String的任何對(duì)象,目前指向"Hello world!"這個(gè)String類型的對(duì)象。這就是真正發(fā)生的事情。我們并沒有聲明一個(gè)String對(duì)象,我們只是聲明了一個(gè)只能指向String對(duì)象的引用變量。所以,如果在剛才那句語句后面,如果再運(yùn)行一句:

      String string = s;

      我們是聲明了另外一個(gè)只能指向String對(duì)象的引用,名為string,并沒有第二個(gè)對(duì)象產(chǎn)生,string還是指向原來那個(gè)對(duì)象,也就是,和s指向同一個(gè)對(duì)象。

     

    問題二:"=="equals方法究竟有什么區(qū)別?

     

      ==操作符專門用來比較變量的值是否相等。
      int a=10;

      int b=10;

      則a==b將是true。

      但:

      String a=new String("foo");

      String b=new String("foo");

      則a==b將返回false。

      對(duì)象變量其實(shí)是一個(gè)引用,它們的值是指向?qū)ο笏诘膬?nèi)存地址,而不是對(duì)象本身。ab都使用了new操作符,意味著將在內(nèi)存中產(chǎn)生兩個(gè)內(nèi)容為"foo"的字符串,既然是“兩個(gè)”,它們自然位于不同的內(nèi)存地址。ab的值其實(shí)是兩個(gè)不同的內(nèi)存地址的值,所以使用"=="操作符,結(jié)果會(huì)是false。雖然,ab所指的對(duì)象,它們的內(nèi)容都是"foo",應(yīng)該是“相等”,但是==操作符并不涉及到對(duì)象內(nèi)容的比較。

        對(duì)象內(nèi)容的比較應(yīng)使用Object對(duì)象的equals方法。
       
    boolean equals(Object o){ 
             
      return this==o;
           }

      Object對(duì)象默認(rèn)使用了==操作符。所以如果你自創(chuàng)的類沒有覆蓋equals方法,那你的類使用equals和使用==會(huì)得到同樣的結(jié)果。同樣也可以看出,Objectequals方法沒有達(dá)到equals方法應(yīng)該達(dá)到的目標(biāo):比較兩個(gè)對(duì)象內(nèi)容是否相等。因?yàn)榇鸢笐?yīng)該由類的創(chuàng)建者決定,所以Object把這個(gè)任務(wù)留給了類的創(chuàng)建者。

     

      例如:

      Class MyClass{

       private String content;

       ...

       boolean equals(Object another){

    return true;

    }

    }

      MyClass類中的equals方法覆蓋了父類object類的equals方法。這個(gè)實(shí)現(xiàn)會(huì)導(dǎo)致無論MyClass類的實(shí)例內(nèi)容如何,它們之間的比較永遠(yuǎn)返回true

      所以當(dāng)使用equals方法判斷對(duì)象的內(nèi)容是否相等,請(qǐng)不要想當(dāng)然。因?yàn)榭赡苣阏J(rèn)為相等,而這個(gè)類的創(chuàng)建者不這樣認(rèn)為,而類的equals方法的實(shí)現(xiàn)是由他掌握的。

     

    問題三:StringStringBuffer的區(qū)別

    String類被設(shè)計(jì)成不可變(immutable)類,所以它的所有對(duì)象都是不可變對(duì)象。請(qǐng)看下列代碼:

      String s = "Hello";

      s = s + " world!";

     

      s所指向的對(duì)象是否改變了呢?在這段代碼中,s原先指向一個(gè)String對(duì)象,內(nèi)容是"Hello",然后我們對(duì)s進(jìn)行了+操作,那么s所指向的那個(gè)對(duì)象是否發(fā)生了改變呢?答案是沒有。這時(shí),s不指向原來那個(gè)對(duì)象了,而指向了另一個(gè)String對(duì)象,內(nèi)容為"Hello world!",原來那個(gè)對(duì)象還存在于內(nèi)存之中,只是s這個(gè)引用變量不再指向它了。

     

      所以,如果經(jīng)常對(duì)字符串進(jìn)行各種各樣的修改,使用String類來代表字符串的話會(huì)引起很大的內(nèi)存開銷。因?yàn)?/span>String對(duì)象建立之后不能再改變,所以對(duì)于每一個(gè)不同的字符串,都需要一個(gè)String對(duì)象來表示。這時(shí),應(yīng)該考慮使用StringBuffer類,它允許修改,而不是每個(gè)不同的字符串都要生成一個(gè)新的對(duì)象。并且,這兩種類的對(duì)象轉(zhuǎn)換十分容易。

     

      同時(shí),我們還可以知道,如果要使用內(nèi)容相同的字符串,不必每次都new一個(gè)String。例如我們要在構(gòu)造器中對(duì)一個(gè)名叫sString引用變量進(jìn)行初始化,把它設(shè)置為初始值,應(yīng)當(dāng)這樣做:

     

      public class Demo {

       private String s;

       ...

       public Demo {

       s = "Initial value";

       }

      ...

      }

     

      而非

      s = new String("Initial value");

     

      后者每次都會(huì)調(diào)用構(gòu)造器,生成新對(duì)象,性能低下且內(nèi)存開銷大,并且沒有意義,因?yàn)?/span>String對(duì)象不可改變,所以對(duì)于內(nèi)容相同的字符串,只要一個(gè)String對(duì)象來表示就可以了。也就說,多次調(diào)用上面的構(gòu)造器創(chuàng)建多個(gè)對(duì)象,他們的String類型屬性s都指向同一個(gè)對(duì)象。

      上面的結(jié)論還基于這樣一個(gè)事實(shí):對(duì)于字符串常量,如果內(nèi)容相同,Java認(rèn)為它們代表同一個(gè)String對(duì)象。而用關(guān)鍵字new調(diào)用構(gòu)造器,總是會(huì)創(chuàng)建一個(gè)新的對(duì)象,無論內(nèi)容是否相同。

      至于為什么要把String類設(shè)計(jì)成不可變類,是它的用途決定的。其實(shí)不只String,很多Java標(biāo)準(zhǔn)類庫中的類都是不可變的。在開發(fā)一個(gè)系統(tǒng)的時(shí)候,我們有時(shí)候也需要設(shè)計(jì)不可變類,來傳遞一組相關(guān)的值,這也是面向?qū)ο笏枷氲捏w現(xiàn)。不可變類有一些優(yōu)點(diǎn),比如因?yàn)樗膶?duì)象是只讀的,所以多線程并發(fā)訪問也不會(huì)有任何問題。當(dāng)然也有一些缺點(diǎn),比如每個(gè)不同的狀態(tài)都要一個(gè)對(duì)象來代表,可能會(huì)造成性能上的問題。所以Java標(biāo)準(zhǔn)類庫還提供了一個(gè)可變版本,即StringBuffer

     

    問題四:邏輯與/ 短路與/或的區(qū)別

     

    邏輯操作符:&(與運(yùn)算),^(異或運(yùn)算),|(或運(yùn)算)。

    短路邏輯操作符:&&(并且),||(或者).

    短路與/或運(yùn)算符和邏輯與/或一樣可以實(shí)現(xiàn)邏輯運(yùn)算,但是此時(shí)有一個(gè)重要的區(qū)別:用邏輯與/或運(yùn)算時(shí),不管操作符兩邊的條件表達(dá)式成不成立,它都要進(jìn)行運(yùn)算判斷,而短路與/或運(yùn)算不一樣了,如果通過左側(cè)的操作數(shù)就可以進(jìn)行它們需要的判斷,那么它就不會(huì)再計(jì)算右側(cè)的操作數(shù)了,請(qǐng)看下面的例子:

    ……

    double value=0;

    if(value!=0 && 1/value<1000){

    System.out.println("The value is not too small.");

    }

    else{

    System.out.println("The value is too small.");

    }

    ……

    運(yùn)行結(jié)果:

    The value is too small.

    結(jié)果分析:

    照理說應(yīng)會(huì)出現(xiàn)除數(shù)為0的錯(cuò)誤,但由于條件邏輯操作符是短路操作符,顯然,value!=0條件不成立,立即就可作出判斷應(yīng)執(zhí)行else后的語句,所以它就不再會(huì)運(yùn)算判斷1/value<1000.如果不懂請(qǐng)?jiān)倏匆焕?/span>:

    ......

    double int1=0,int2=1,int3=1;

    if(int1!=0 & (int2=2)==1){

    }

    System.out.println("int2="+int2);

    if(int1!=0 && (int3=2)==1){

    }

    System.out.println("int3="+int3);

    ......

     

    運(yùn)行結(jié)果:

    int2=2.0

    int3=1.0

     

    問題五.實(shí)例變量與類變量(靜態(tài)變量)

     

    可以通過兩種方法在類中存儲(chǔ)數(shù)據(jù)──作為實(shí)例變量和類變量.實(shí)例變量是特定于對(duì)象的,如果你有兩個(gè)對(duì)象(即一個(gè)類的兩個(gè)實(shí)例),每一個(gè)對(duì)象中的實(shí)例變量獨(dú)立于另一個(gè)對(duì)象中的實(shí)例變量的;另一方面,兩個(gè)對(duì)象的類變量均指向相同的數(shù)據(jù),并因此面保存相同的值,換句話說,類變量被類中的所有對(duì)象共享,類變量在聲明時(shí)比實(shí)例變量多一個(gè)static.

    class Data{

    public int intdata=0;//intdata在這兒是實(shí)例變量

    }

    public class Test{

    public static void main(String[] args){

    Data a,b;

    a=new Data ();

    b=new Data ();

    a.intdata=1;

    System.out.println("b.indata="+b.intdata);

    }

    }

    運(yùn)行結(jié)果:

    b.intdata=0

    結(jié)果分析:

    可以看出,a.intdata的值雖然變了,但并沒有影響b.intdata.但是如果在data類中聲明intdata時(shí),在其前面加上static就變成類變量了(:public static int intdata=0;),則此時(shí)運(yùn)行結(jié)果會(huì)變?yōu)?/span>:b.intdata=1

    這次a.intdata值的改變可把b.intdata影響了,事實(shí)上,對(duì)象ab的類變量均指向相同的數(shù)據(jù),所有值一樣,這就是類變量的作用.

     

    問題六:實(shí)例方法,類方法(靜態(tài)方法),構(gòu)造器方法

     

    我們通常所說的方法系指實(shí)例方法。類方法(即靜態(tài)方法)與實(shí)例方法最大的區(qū)別是:在形式上類方法多一個(gè)static,在用法上不必創(chuàng)建對(duì)象就可直接調(diào)用類方法(而實(shí)例方法卻一定要先創(chuàng)建對(duì)象,再通過對(duì)象調(diào)用)

    class Add{

    static int addNum(int op1,int op2){

    return op1+op2;

    }

    }

    public class Test{

    public static void main(String[] args){

    //直接用類名作為對(duì)象調(diào)用類方法

    System.out.println("addem(2,2)="+Add.addNum(2,2));

    }

    }

    : 也可按通常的方法,即先創(chuàng)建對(duì)象,再調(diào)用方法,不過,這時(shí)static就無任何意義了。

    構(gòu)造器方法,它是用來初始化對(duì)象中的數(shù)據(jù)的一種方法,創(chuàng)建很容易,只需在類中加上一個(gè)與這個(gè)類同名的方法,不需要在前面加任何訪問說明符或者返回類型,另外,構(gòu)造器也一樣可以象方法一樣傳遞參數(shù).

    class Data{

    private String data1;//事先聲明

    Data(String s){

    data1=s; /*通過接收數(shù)據(jù)來初始化變量.(:不能在構(gòu)造器內(nèi)聲明變

    ,事先在外就要聲明.)*/

    }

    public String getData(){

    return data1;

    }

    }

    public class Test{

    public static void main(String[] args){

    /*通過傳遞參數(shù)調(diào)用構(gòu)造器新建一個(gè)對(duì)象,再通過對(duì)象調(diào)用方法得到數(shù)據(jù)*/

    System.out.println((new Data("I love you")).getData());

    }

    }

     

    問題七:接口與類

     

    類是對(duì)一類特定對(duì)象的規(guī)格說明,我們可以定義類,然后創(chuàng)建類的對(duì)象,通過創(chuàng)建類的對(duì)象來組合所有屬于該類的組件,而接口不能這樣做.而接口實(shí)質(zhì)上就是一個(gè)常量和抽象方法的集合,要使用一個(gè)接口,就需要在類中實(shí)現(xiàn)這個(gè)接口,然后作為類定義的一部分,編寫接口中聲明的每一個(gè)方法,接口中的方法永遠(yuǎn)是public,abstract,接口中的常量永遠(yuǎn)是public staticfinal,因此不需要為它們說明屬性.因?yàn)樵?/span>Java中不支持多重繼承,但是,可以用接口來實(shí)現(xiàn)類似的功能,這是接口的重要作用之一。

    interface anyone{ //定義一個(gè)接口

    final double PI=3.1416;

    void setNumber(int number);

    int getNumber();

    }

    interface anyother{ //定義另一個(gè)接口

    void setString(String str);

    String getString();

    }

     

    class Test implement anyone,anyother{ //定義一個(gè)類,并使用兩個(gè)接口

    int number;

    String str;

    public Test(){

    }

    void setNumber(int number){

    this.number=number;

    }

    void setString(String str){

    this.str=str;

    }

    void int getNumber(){

    }//可以為一個(gè)空實(shí)現(xiàn).

    void String getString(){

    }

    }

     

     

    posted on 2008-07-07 11:29 wahaha 閱讀(144) 評(píng)論(0)  編輯  收藏 所屬分類: Java 語言入門筆記

    只有注冊用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 成人免费无码H在线观看不卡| 亚洲毛片av日韩av无码| 久久最新免费视频| 亚洲丁香婷婷综合久久| 亚洲国产成人精品久久| 久久久久久久综合日本亚洲| 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 夜夜春亚洲嫩草影院| 日本免费高清一本视频| 日韩国产免费一区二区三区| 很黄很污的网站免费| 美女巨胸喷奶水视频www免费| 成a人片亚洲日本久久| 亚洲午夜成人精品无码色欲| 亚洲精品国产免费| 免费观看一区二区三区| 国产高清对白在线观看免费91| 国产成人亚洲午夜电影| 亚洲人成色777777精品| 亚洲国产成人片在线观看| 亚洲日本va午夜中文字幕久久| 全黄a免费一级毛片人人爱| 好吊妞在线新免费视频| 性感美女视频在线观看免费精品| 中文字幕无码播放免费| 国产a视频精品免费观看| 一级做a爰片久久免费| 猫咪免费人成在线网站| 深夜福利在线免费观看| 美女视频黄频a免费观看| 免费人成视频在线观看免费| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 777亚洲精品乱码久久久久久 | 亚洲av无码兔费综合| 婷婷精品国产亚洲AV麻豆不片| 亚洲人成亚洲人成在线观看| 国产亚洲精品福利在线无卡一| 亚洲宅男天堂在线观看无病毒| 国产日产亚洲系列| 亚洲AV永久纯肉无码精品动漫| 久久久亚洲精品国产|