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

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

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

    Sunspl

    Hello,everyone,i am sun. 天道酬勤,笨鳥先飛.
    隨筆 - 47, 文章 - 0, 評(píng)論 - 24, 引用 - 0
    數(shù)據(jù)加載中……

    [oop] 面向?qū)ο笥蓽\入深(轉(zhuǎn))

    oop:使用Java開始面向?qū)ο蟮木幊?
    你正在從傳統(tǒng)的過程化的編程轉(zhuǎn)向面向?qū)ο蟮拈_發(fā)模式嗎?還是想要進(jìn)入膨脹的Java世界呢?你不會(huì)感到孤單的.成千上萬的開發(fā)者和你處在相同的情形之下.在這系列文章中,我們將使用Java語(yǔ)言帶領(lǐng)你一步一步的學(xué)習(xí)面向?qū)ο蟮拈_發(fā)過程.

    OOP: 理解類和對(duì)象
    上一次在"使用Java開始面向?qū)ο蟮木幊?這篇文章中,我們學(xué)習(xí)了一個(gè)編程語(yǔ)言要真正成為面向?qū)ο蟮?它應(yīng)該支持信息隱藏/封裝,多態(tài),繼承和動(dòng)態(tài)綁定.另外,我們知道了Java完全支持這些功能,而且知道了因?yàn)镴ava是一種解釋性的語(yǔ)言并運(yùn)行在虛擬機(jī)的內(nèi)部,所以由Java寫成的任何程序都可以在任何支持 Java虛擬機(jī)(JVM)的操作系統(tǒng)上運(yùn)行.我們還明白了對(duì)象是代表現(xiàn)實(shí)生活中事物的軟件-編程模型以及對(duì)象是由它們的狀態(tài)和行為定義的.最后,我們知道了Java中除了原始數(shù)據(jù)對(duì)象以外一切都是對(duì)象.

    OOP: 繼承以及多態(tài)
    在"OOP簡(jiǎn)介:理解類和對(duì)象"這篇文章中,我們討論了繼承和多態(tài)性的好處.我們還粗略的學(xué)習(xí)了如何擴(kuò)展基類定義子類,繼承基類中合適的行為和屬性而重載那些并不適合的行為和屬性.這種方式能夠削減代碼宏余以及錯(cuò)誤的堆積.

    OOP: 限制對(duì)象屬性的訪問
    這篇文章中,我們繼續(xù)討論了繼承和多態(tài)性的好處.我們還學(xué)習(xí)了其它的東西: 雖然Java只支持從一個(gè)父類繼承,但它使用接口的方式支持多重繼承. 接口實(shí)現(xiàn)了多態(tài),使得我們能夠給與對(duì)象不同特性以滿足不同的需要. 你可以使用多態(tài)機(jī)制讓完成相似功能的不同的方法擁有相同的名字但是擁有不同的參數(shù)列表.動(dòng)態(tài)/運(yùn)行時(shí)的綁定機(jī)制允許一個(gè)對(duì)象在運(yùn)行時(shí)被強(qiáng)制轉(zhuǎn)化成你所需要的對(duì)象類型,前提是這個(gè)對(duì)象實(shí)現(xiàn)了必需的接口或者括展了特定的父類.

    oop: 神奇的初始化
    java在初始化的時(shí)候也有很多講究,因?yàn)閖ava中出現(xiàn)了類,所以在初始化的時(shí)候就有可能使用到創(chuàng)建新對(duì)象,所以,對(duì)于初始化的順序要求的比較嚴(yán)格,請(qǐng)看下面一個(gè)程序,是thinking in java中的一個(gè)程序,被我稍加改編,這樣可以更好的說明幾個(gè)初始化的要點(diǎn)

    posted on 2006-09-06 11:38 JavaSuns 閱讀(430) 評(píng)論(5)  編輯  收藏

    評(píng)論

    # re: [oop] 面向?qū)ο笥蓽\入深  回復(fù)  更多評(píng)論   

    一種語(yǔ)言是面向?qū)ο蟮木烤挂馕吨裁茨?如果一種編程語(yǔ)言是真正的面向?qū)ο蟮恼Z(yǔ)言,它必須支持以下的特點(diǎn):

    封裝--隱藏實(shí)現(xiàn)細(xì)節(jié)
    多態(tài)--將同一個(gè)消息發(fā)送給不同的對(duì)象并使各個(gè)對(duì)象以預(yù)定的方式對(duì)消息做出響應(yīng)的能力
    繼承--拓展現(xiàn)存的類來生成專有類繼承原來類的狀態(tài)和行為的能力
    動(dòng)態(tài)綁定--在編程時(shí)不必知道對(duì)象的具體類型就能向它們發(fā)送消息的能力

    讓我們考察一下Java是如何支持這些功能的以及它又如何提供了附加的功能來使得從過程化的程序設(shè)計(jì)到面向?qū)ο蟮拈_發(fā)的轉(zhuǎn)變過程相對(duì)容易.


    Java中面向?qū)ο蟮奶攸c(diǎn)
    Java是由Sun Microsystems公司在九十年代中期發(fā)布的面向?qū)ο?OOP)的編程語(yǔ)言.你可以從Sun公司的網(wǎng)站上下載最新的Java開發(fā)包(JDK).Java是一種解釋性的語(yǔ)言,這意味著其源程序首先被編譯成中間代碼的形式,然后在每次運(yùn)行之前都要經(jīng)過虛擬機(jī)的解釋,它是徹頭徹尾的面向?qū)ο蟮木幊陶Z(yǔ)言.

    Java對(duì)程式員隱藏了許多傳統(tǒng)的面向?qū)ο缶幊陶Z(yǔ)言--比方說C++和Object Pascal--的復(fù)雜性和讓人容易混淆的地方.例如,Java中沒有了指針,Java會(huì)為程序員自動(dòng)的清除引用類型,而且所有變量將被自動(dòng)初始化成適當(dāng)?shù)娜笔≈?除了原始數(shù)據(jù)類型以外,Java中的所有東西都是對(duì)象,必要的時(shí)候,甚至可以為原始數(shù)據(jù)類型也提供封裝機(jī)制.


    對(duì)象簡(jiǎn)介
    對(duì)象是代表現(xiàn)實(shí)生活中的實(shí)物的軟件編程實(shí)體,比如說銀行帳號(hào),計(jì)算機(jī)用戶,用戶介面上的按鈕,窗口菜單等等.對(duì)象是由它們的狀態(tài)和行為定義的.例如,一個(gè)銀行帳號(hào)擁有一種狀態(tài),諸如當(dāng)前的收支狀況,賬戶的所有人,允許的最小交易額,等等,而它的行為則包括提取,存入,收支平衡等.

    一個(gè)對(duì)象的狀態(tài)是由只有對(duì)象自己知道的變量定義的.Java把這些變量稱為數(shù)據(jù)域或者成員變量.數(shù)據(jù)域?qū)?duì)象來說是私有的除非顯式的使用關(guān)鍵字來定義它們的作用域,使它們對(duì)其它類可見.我們將在以后討論變量作用域的問題.

    一個(gè)對(duì)象的行為是由它上面的操作定義的.在Java中,這些操作被叫做方法.方法可以改變一個(gè)對(duì)象的狀態(tài),創(chuàng)建新對(duì)象,實(shí)現(xiàn)實(shí)用的功能等.



    類是一個(gè)實(shí)體,它定義了一個(gè)對(duì)象的運(yùn)行方式以及在對(duì)象被創(chuàng)建或者說實(shí)例化的時(shí)候所包含的數(shù)據(jù).類的作用就象一個(gè)模板,一個(gè)或者多個(gè)對(duì)象可以依照它來創(chuàng)建.下面是使用Java面向?qū)ο蟮母拍钌昝鱄elloWorld應(yīng)用程序的例子:

    public class HelloWorld
    {
    private String helloMsg = "Hello World!";
    public static void main(String[] args)
    {
    HelloWorld hw = new HelloWorld();
    }

    public HelloWorld()
    {
    // 顯示我們的"Hello World"消息
    System.out.println(helloMsg);
    }
    }

    上面的例子定義了一個(gè)模板,真實(shí)的HelloWorld對(duì)象可以從這個(gè)模板創(chuàng)建.你還會(huì)注意到從public static void main(String[] args)這一行開始的一段奇怪的代碼.這一段代碼定義的是一個(gè)特殊的方法main,它其實(shí)就是我們這個(gè)HelloWorld程序的入口點(diǎn),上面的程序是一個(gè)典型的演示所有的Java應(yīng)用程序如何定義它們的入口點(diǎn).注意到即使是這個(gè)main入口點(diǎn)也被封裝在類里面.對(duì)于這個(gè)例子,我們就是將它封裝在HelloWorld類里.上面的程序展示了如何定義一個(gè)類,HelloWorld,以及其中的一個(gè)數(shù)據(jù)域,helloMsg和兩個(gè)方法main和HelloWorld.HelloWorld方法是一種特殊的方法,這種方法被稱做構(gòu)造函數(shù).我們將在后面的文章里討論常規(guī)方法,構(gòu)造函數(shù)和靜態(tài)成員函數(shù)的細(xì)節(jié)和區(qū)別.

    在Java中,所有與一個(gè)特殊的類有關(guān)的源代碼都寫在一個(gè)與類同名的擁有后綴名.java的文件里.Java編譯器讀取源文件并將它們翻譯成平臺(tái)無關(guān)的,二進(jìn)制格式的代碼,成為字節(jié)代碼,然后將這些代碼分類保存在與類同名的但是后綴為.class的文件里.你最終會(huì)為每一個(gè)類得到一個(gè)class文件.


    編譯并運(yùn)行我們的例子程序
    一旦你已經(jīng)從Sun的Web站點(diǎn)上下載了JDK并在你的機(jī)器上安裝了它,你就可以開始編譯并運(yùn)行Java程序了.要編譯并運(yùn)行我們的例子程序,將HelloWorld類的代碼粘貼到你最喜歡的文檔編輯器里,將文件保存為HelloWorld.java,然后,在命令提示符下,將當(dāng)前路徑改變到包含了這個(gè)文件的路徑里.現(xiàn)在你就可以在命令行提示符下鍵入下面的命令來編譯程序了:

    Windows:
    <你的JDK所在目錄>\bin\javac HelloWorld.java

    UNIX or Linux:
    <你的JDK所在目錄>/bin/javac HelloWorld.java

    這個(gè)命令將在同一個(gè)目錄里產(chǎn)生一個(gè)新的文件,叫做HelloWorld.class.要運(yùn)行這個(gè)程序,請(qǐng)?jiān)诿钐崾痉骆I入下面的命令:

    Windows:
    <你的JDK所在目錄>\bin\java HelloWorld

    UNIX or Linux:
    <你的JDK所在目錄>/bin/java HelloWorld

    你應(yīng)該可以看到屏幕上顯示Hello World!

    總結(jié)
    我們已經(jīng)接觸到了使用Java程序設(shè)計(jì)語(yǔ)言進(jìn)行面向?qū)ο蟮木幊痰囊恍┢っR(shí).下次,我們將剖析我們的例子程序,給它添加更多的功能,并討論更多的有關(guān)對(duì)象,類和其它面向?qū)ο缶幊痰幕靖拍钜约坝肑ava如何實(shí)現(xiàn)它們.
    2006-09-06 11:38 | JavaSuns

    # re: [oop] 面向?qū)ο笥蓽\入深  回復(fù)  更多評(píng)論   

    對(duì)象詳論
    使用對(duì)象的一個(gè)關(guān)鍵是當(dāng)你在瀏覽系統(tǒng)分析文檔或者設(shè)計(jì)文檔的時(shí)候如何來確定它們.因?yàn)閷?duì)象一般代表人,地方或者事物,所以一個(gè)確定對(duì)象的基本的方法就是找出句子中所使用的名詞.這里有一個(gè)簡(jiǎn)單的例子.在句子"一個(gè)顧客可以擁有多于一個(gè)的銀行帳號(hào)",我們就確定了兩個(gè)對(duì)象,客戶和帳號(hào).在句子"小貓喵喵叫"中,我們能夠確定一個(gè)對(duì)象,貓.

    類詳論
    前面,我們學(xué)習(xí)了一個(gè)類是定義了對(duì)象如何動(dòng)作以及當(dāng)對(duì)象創(chuàng)建或者說實(shí)例化的時(shí)候應(yīng)該包含些什么的實(shí)體.在對(duì)動(dòng)物的討論中,我們可以說,"狗兒汪汪叫,貓喵喵叫,鴨子嘎嘎叫."確定句子中的對(duì)象我們就得到了狗,貓和鴨子.至于汪汪叫,喵喵叫,嘎嘎叫,那都是我們對(duì)象發(fā)出的行為動(dòng)作.

    要實(shí)現(xiàn)這些對(duì)象,我們需要?jiǎng)?chuàng)建三個(gè)對(duì)象分別叫Dog,Cat和Duck.要實(shí)現(xiàn)它們的行為,我們可以為每一個(gè)這些對(duì)象創(chuàng)建代表每個(gè)對(duì)象發(fā)出的聲音的方法,而且我們把這個(gè)方法叫做speak或者,如果我們發(fā)揮想象力的話還可以把這個(gè)方法叫做sayHello.

    在程序的上下文中為了演示這些概念,讓我們修改上篇文章中的HelloWorld程序,添加這三個(gè)新對(duì)象并給它們中的每一個(gè)添加sayHello方法,如下所示:

    public class HelloWorld
    {
    public static void main(String[] args)
    {
    Dog animal1 = new Dog();
    Cat animal2 = new Cat();
    Duck animal3 = new Duck();
    animal1.sayHello();
    animal2.sayHello();
    animal3.sayHello();
    }
    }

    class Dog
    {
    public void sayHello()
    {
    System.out.println("Bark");
    }
    }

    class Cat
    {
    public void sayHello()
    {
    System.out.println("Meow");
    }
    }

    class Duck
    {
    public void sayHello()
    {
    System.out.println("Quack");
    }
    }

    在編譯并運(yùn)行了這個(gè)程序以后,輸出應(yīng)該如下:
    Bark
    Meow
    Quack

    看看我們的程序,我們馬上就注意到了一些事情:每個(gè)對(duì)象代表了一種動(dòng)物,而每個(gè)對(duì)象實(shí)現(xiàn)了一個(gè)相同的方法,sayHello.假設(shè)我們想要給對(duì)象更多的功能以及用來代表對(duì)象所指的動(dòng)物的方法和屬性.比方說,我們可以添加一個(gè)方法來確定一個(gè)動(dòng)物是不是哺乳類的,或者我們添加一個(gè)方法來確定一個(gè)動(dòng)物是不是肉食性的.我們可以通過給每一個(gè)對(duì)象添加這兩種方法來實(shí)現(xiàn)或者我們也能夠使用OOP的兩個(gè)最強(qiáng)大的功能:繼承和多態(tài).

    因?yàn)樗械膶?duì)象都代表一個(gè)對(duì)象,所以我們將創(chuàng)建一個(gè)被稱為"基類"或是"超類"的類,它的名字是Animal.我們?nèi)缓罂梢宰屛覀兊膶?duì)象從Animal類繼承相同的特點(diǎn)并強(qiáng)制每個(gè)對(duì)象只實(shí)現(xiàn)與Animal類不同的功能.

    Java用extends關(guān)鍵字指明一個(gè)類從另一個(gè)繼承.讓我們利用繼承和多態(tài)的概念獲得代碼重用的好處來重建我們的程序并使得每個(gè)對(duì)象只實(shí)現(xiàn)與基類Animal不同的功能:

    public class HelloWorld
    {
    public static void main(String[] args)
    {
    Dog animal1 = new Dog();
    Cat animal2 = new Cat();
    Duck animal3 = new Duck();
    System.out.println("A dog says " +animal1.getHello()
    +", is carnivorous: " +animal1.isCarnivorous()
    +", is a mammal: " +animal1.isAMammal());

    System.out.println("A cat says " +animal2.getHello()
    +", is carnivorous: " +animal2.isCarnivorous()
    +", is a mammal: " +animal2.isAMammal());

    System.out.println("A duck says " +animal3.getHello()
    +", is carnivorous: " +animal3.isCarnivorous()
    +", is a mammal: " +animal3.isAMammal());
    }
    }

    abstract class Animal
    {
    public boolean isAMammal()
    {
    return(true);
    }

    public boolean isCarnivorous()
    {
    return(true);
    }

    abstract public String getHello();
    }

    class Dog extends Animal
    {
    public String getHello()
    {
    return("Bark");
    }
    }

    class Cat extends Animal
    {
    public String getHello()
    {
    return("Meow");
    }
    }

    class Duck extends Animal
    {
    public boolean isAMammal()
    {
    return(false);
    }

    public boolean isCarnivorous()
    {
    return(false);
    }

    public String getHello()
    {
    return("Quack");
    }
    }

    在編譯并運(yùn)行我們的程序以后,輸出應(yīng)該如下:
    A dog says Bark, is carnivorous: true, is a mammal: true
    A cat says Meow, is carnivorous: true, is a mammal: true
    A duck says Quack, is carnivorous: false, is a mammal: false

    看看我們的例子,你將發(fā)現(xiàn)我們定義了一個(gè)叫做Animal的新類,它定義了三個(gè)方法:isAMammal, isCarnivorous, 和 getHello.你一概還注意到了,我們?cè)诿總€(gè)現(xiàn)存的類申明的前面都添加了extends Animal這個(gè)語(yǔ)句.這個(gè)語(yǔ)句告訴編譯器這些對(duì)象是Animal類的子類.

    因?yàn)榉椒╥sAMammal 和 isCarnivorous 都返回 true,所以Dog和Cat類用不著重新實(shí)現(xiàn)--即"重載"這兩個(gè)方法.但是鴨子既不是哺乳動(dòng)物又不是肉食性的,所以Duck類需要重載這兩種方法來返回正確的值.我們所有的對(duì)象都以自己獨(dú)特的方式說"hello",所以它們都需要重載getHello方法.因?yàn)槊糠N動(dòng)物說"hello"的方式都不同,所以我們?cè)诨愔袑etHello方法申明為抽象的,而且我們沒有給這個(gè)方法一個(gè)函數(shù)體.這就迫使Animal的每一個(gè)子類重載getHello方法并根據(jù)每一個(gè)特定動(dòng)物的需要來定義它.

    因?yàn)槲覀儗etHello方法申明為虛擬的,我們就不能直接實(shí)例化Animal對(duì)象.因此,我們需要將Animal類也申明為抽象的.我們通過在Animal類定義的開始行添加abstract關(guān)鍵字來實(shí)現(xiàn)這一點(diǎn).子類重載它們基類的方法的能力就是多態(tài).多態(tài)使得子類能夠使用基類的方法或是在這些方法不足的時(shí)候重載它們.這就實(shí)現(xiàn)了代碼重用,加快了代碼的實(shí)現(xiàn)過程,而且它還隔離和程序中的bug,使得程序的維護(hù)更容易.

    總結(jié)
    在本文中,我們學(xué)習(xí)了如何確定潛在的對(duì)象.我們還學(xué)習(xí)了如何使用繼承和多態(tài)來加快我們的代碼實(shí)現(xiàn)過程并隔離錯(cuò)誤,這使得代碼的維護(hù)過程更加容易.下一次,我們將展開討論多態(tài)和繼承的概念并開始我們對(duì)動(dòng)態(tài)綁定的討論.
    2006-09-06 11:39 | JavaSuns

    # re: [oop] 面向?qū)ο笥蓽\入深  回復(fù)  更多評(píng)論   

    深入繼承性
    一些面向?qū)ο蟮恼Z(yǔ)言提供叫做"多重繼承"的特點(diǎn),當(dāng)一個(gè)對(duì)象需要從多于一個(gè)的基類繼承行為和屬性的時(shí)候這是有價(jià)值的.多重繼承在有些情況下是復(fù)雜的.例如,假設(shè)我們需要定義一個(gè)基類,Animal,然后是Animal的兩個(gè)子類,LandAnimal 和 WaterAnimal.現(xiàn)在我們想要定義一個(gè)類來代表青蛙.青蛙是兩棲動(dòng)物,所以我們自然會(huì)想到定義Frog類從LandAnimal和WaterAnimal類繼承.這使得Frog類能夠同時(shí)從LandAnimal 和WaterAnimal類繼承所需的行為和屬性.

    初看起來這是相當(dāng)簡(jiǎn)單的;但是,讓我們?yōu)锳nimal添加一個(gè)叫做LivingEnvironment的屬性,并用方法getLivingEnvironment來返回它.我們假設(shè)LandAnimal 和 WaterAnimal類都重載了這個(gè)方法來實(shí)現(xiàn)特殊的功能.LandAnimal將返回Land作為它的LivingEnvironment屬性的值,而WaterAnimal將返回Water作為它的LivingEnvironment屬性的值.現(xiàn)在,當(dāng)我們將Frog類作為L(zhǎng)andAnimal 和 WaterAnimal 子類實(shí)現(xiàn)的時(shí)候,想要得到Frog的LivingEnvironment屬性值,這時(shí)將遇到一個(gè)麻煩:Frog類的getLivingEnvironment方法是返回Land值呢還是Water值?答案取決于編譯器如何處理多重繼承.

    我在前面的文章里就已經(jīng)說過,Java不支持多重繼承.但它確實(shí)允許一個(gè)對(duì)象通過使用叫做"接口"的功能擁有多個(gè)特性.下面的例子顯示了定義LandAnimal的接口的可能的定義代碼:
    public interface LandAnimal
    {
    public int getNumberOfLegs();
    public boolean hasATail();
    }

    一個(gè)使用接口的類在類定義語(yǔ)句的開始添加implements+接口名.例如,在Java中,我們會(huì)以下面的方式定義Frog類:


    public class Frog extends Animal implements LandAnimal, WaterAnimal

    接口并沒有什么實(shí)際的功能;相反,它的作用是聯(lián)系使用者和實(shí)現(xiàn)了這個(gè)接口的對(duì)象.接口保證了對(duì)象實(shí)現(xiàn)接口定義的方法.而且,一個(gè)實(shí)現(xiàn)接口的對(duì)象能夠在運(yùn)行時(shí)被強(qiáng)制轉(zhuǎn)換成接口類型.例如,使用上面的Frog定義,并且假設(shè)LandAnimal類定義了一個(gè)叫做getNumberOfLegs的方法而WaterAnimal定義了一個(gè)叫做hasGills的方法,那么一個(gè)Frog類的實(shí)例可以在運(yùn)行時(shí)被強(qiáng)制轉(zhuǎn)換成LandAnimal或WaterAnimal對(duì)象:


    Frog aFrog = new Frog();
    int legCount = ((LandAnimal)aFrog).getNumberOfLegs();
    Boolean gillFlag = ((WaterAnimal)aFrog).hasGills();


    注意Forg為什么能夠被強(qiáng)制轉(zhuǎn)換成一個(gè)LandAnimal對(duì)象即使實(shí)際的LandAnimal對(duì)象并沒有被創(chuàng)建.這使得我們能夠在運(yùn)行時(shí)以其帶有的任何"身份"調(diào)用一個(gè)對(duì)象,這就是所謂的"動(dòng)態(tài)綁定"或"運(yùn)行時(shí)綁定".
    2006-09-06 11:40 | JavaSuns

    # re: [oop] 面向?qū)ο笥蓽\入深  回復(fù)  更多評(píng)論   

    雖然Java只支持從一個(gè)父類繼承,但它使用接口的方式支持多重繼承.
    接口實(shí)現(xiàn)了多態(tài),使得我們能夠給與對(duì)象不同特性以滿足不同的需要.
    你可以使用多態(tài)機(jī)制讓完成相似功能的不同的方法擁有相同的名字但是擁有不同的參數(shù)列表.
    動(dòng)態(tài)/運(yùn)行時(shí)的綁定機(jī)制允許一個(gè)對(duì)象在運(yùn)行時(shí)被強(qiáng)制轉(zhuǎn)化成你所需要的對(duì)象類型,前提是這個(gè)對(duì)象實(shí)現(xiàn)了必需的接口或者括展了特定的父類.

    下面我們將討論通過限制對(duì)對(duì)象屬性和方法的訪問來強(qiáng)制實(shí)現(xiàn)對(duì)多重接口實(shí)現(xiàn)和父類拓展的正確使用的目的和實(shí)用性.


    黑箱方法:封裝
    一個(gè)基本的面向?qū)ο蟮母拍罹褪欠庋b--將表示一個(gè)對(duì)象狀態(tài)的數(shù)據(jù)與其它對(duì)象隔離開來.這一點(diǎn)是通過一個(gè)通常叫做作用域的概念來實(shí)現(xiàn)的.作用域指的是編程語(yǔ)言的一種能力,這種能力被用來實(shí)現(xiàn)一些限制對(duì)類或者結(jié)構(gòu)體成員變量的訪問的規(guī)則.大多數(shù)面向?qū)ο蟮恼Z(yǔ)言支持作用域機(jī)制,這些機(jī)制通常是通過諸如public, protected, 和 private之類的特殊關(guān)鍵字來實(shí)現(xiàn)的.

    Java提供了四種不同的作用范圍:public, package, protected, 和 private.任何類,方法或者成員變量都能通過使用public, protected, 和 private關(guān)鍵字來顯式的加以保護(hù).任何類,方法,或者成員變量如果沒有使用上面的關(guān)鍵字都將被隱式的給與package的作用范圍.所有這些就構(gòu)成了Java中命名空間的概念.


    命名空間和軟件包
    一個(gè)命名空間可以被看成是在一個(gè)給定的上下文中一組相關(guān)的名字或是標(biāo)識(shí)符.命名空間避免了擁有相同名字或標(biāo)識(shí)符的實(shí)體存在于同一個(gè)上下文里.這里隱含的意思是只要實(shí)體是存在于不同的命名空間中,那么擁有相同名字或者標(biāo)識(shí)符的實(shí)體就能夠呆在一塊兒.Java使用軟件包的概念來實(shí)現(xiàn)命名空間和作用范圍控制.

    軟件包是一個(gè)在統(tǒng)一的名字下的類和接口的集合.每一個(gè)類或者接口都必須存在于用package關(guān)鍵字構(gòu)成的軟件包申明語(yǔ)句定義的命名空間中.例如,下面的申明語(yǔ)句:

    package com.mycompany.apps.HelloWorld;

    它申明了一個(gè)存在于com.mycompany.apps軟件包中的名叫HelloWorld的類或者接口.軟件包申明總是放在包含了類或者接口定義的文件的頂部.

    在java開發(fā)界,目前對(duì)軟件包的命名有一個(gè)建議,就是使用公司或組織的域名(以相反的順序),作為你的軟件包的第一部分.因?yàn)橛蛎侨蛭ㄒ坏?所以使用你的域名來命名你的軟件包也能使你軟件包的名字全球唯一.

    如果一個(gè)Java類或者接口沒有包含一個(gè)軟件包申明,那么它就屬于"unamed package,"也就是沒有名字的軟件包.無名的軟件包應(yīng)該只用來測(cè)試程序或是代碼原型等等.

    2006-09-06 11:41 | JavaSuns

    # re: [oop] 面向?qū)ο笥蓽\入深  回復(fù)  更多評(píng)論   

    class Cup

    {

    Cup(int marker)

    {

    System.out.println("Cup(" + marker + ")");

    }

    void f(int marker)

    {

    System.out.println("f(" + marker + ")");

    }

    }



    class Cups

    {

    static Cup c1=new Cup(1);

    Cup c3=new Cup(3);

    static Cup c2= new Cup(2);

    Cups()

    {

    System.out.println("Cups()");

    }

    Cup c4=new Cup(4);

    }



    public class ExplicitStatic

    {

    Cups c=new Cups();

    {

    System.out.println("Hello");

    }

    public static void main(String[] args)

    {

    System.out.println("Inside main()");

    Cups.c1.f(99);

    ExplicitStatic x=new ExplicitStatic();

    }

    static Cups x = new Cups();

    }

    大家可以手動(dòng)執(zhí)行一下這個(gè)程序,考慮一下結(jié)果是什么,然后參照下面的答案對(duì)照一下,看看是否正確:



    Cup(1)

    Cup(2)

    Cup(3)

    Cup(4)

    Cups()

    Inside main()

    f(99)

    Cup(3)

    Cup(4)

    Cups()

    Hello

    我總結(jié)了四個(gè)初始化的要點(diǎn),如下:

    1、 如果有static,即靜態(tài)成員定義,首先初始化static的變量,如,在類Cups中c3在c2前面,可是在輸出的結(jié)果中,你可以發(fā)現(xiàn),c2是在c3前執(zhí)行的,這就是因?yàn)椋械膕tatic都在第一時(shí)間被初始化。

    2、 Static只初始化一次,在第二次創(chuàng)建類的對(duì)象的時(shí)候,就不會(huì)去執(zhí)行static的語(yǔ)句,如,在第二次執(zhí)行new Cups()的時(shí)候,就只輸出了Cup(3)和Cup(4),顯然,static的兩個(gè)創(chuàng)建對(duì)象的語(yǔ)句沒有做。

    3、 變量的初始化在方法前。如,在Cups類中,方法Cups()在語(yǔ)句Cup c4=new Cup(4)之前,可是輸出結(jié)果的時(shí)候,打印的Cups()卻在Cup(4)之后。

    4、 在含有main的類中執(zhí)行順序是先做static,然后就是main,而不是像其它類一樣,除了static就按順序做下來。如,在main函數(shù)中,如果去掉語(yǔ)句ExplicitStatic x=new ExplicitStatic(),則Cups c=new Cups()和System.out.println("hello")都不會(huì)執(zhí)行。另外,留個(gè)小問題,如果去掉了System.out.println("hello")外的括號(hào)會(huì)怎么樣呢?

    2006-09-06 11:41 | JavaSuns

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 无码国产精品一区二区免费模式 | 男女超爽刺激视频免费播放 | A在线观看免费网站大全| 久久最新免费视频| 亚洲精品乱码久久久久久蜜桃图片| 亚洲国产精品高清久久久| 免费人成网站在线高清| 国产免费不卡视频| 午夜网站在线观看免费完整高清观看 | 亚洲一区二区三区在线网站| 国产亚洲av片在线观看播放| 国产精品高清全国免费观看| 日韩亚洲国产高清免费视频| 8x网站免费入口在线观看| 和老外3p爽粗大免费视频| 狠狠入ady亚洲精品| 亚洲熟妇无码AV不卡在线播放| 77777_亚洲午夜久久多人| 亚洲无线码一区二区三区| 亚洲日韩人妻第一页| 国产免费午夜a无码v视频| 好爽又高潮了毛片免费下载 | 亚洲国产精品无码久久久| 久久久亚洲精品国产| 亚洲午夜国产精品无码 | 美景之屋4在线未删减免费| 亚洲国产成人久久一区二区三区| 久久精品国产亚洲AV久| 91亚洲性爱在线视频| 亚洲日韩乱码久久久久久| 亚洲黄色三级视频| 亚洲视频免费在线观看| 国产精品国产亚洲精品看不卡| 亚洲视频在线免费| 亚洲中久无码不卡永久在线观看| 亚洲第一视频在线观看免费| 免费夜色污私人影院在线观看| 无码不卡亚洲成?人片| 亚洲国产成人影院播放| 亚洲黄片毛片在线观看| 国产偷国产偷亚洲高清日韩|