NewMoring

          與Java同路,贏在未來。

          統(tǒng)計(jì)

          積分與排名

          http://bbs.javawind.net/index.jspx

          http://www.chubeibao.com/bbs/index.php

          http://www.java2000.net/

          http://www.javaeye.com/

          http://www.javathinker.org/index.jsp

          http://www.programbbs.com/bbs/index.asp

          最新評(píng)論

          java中protected

          1. protected 訪問控制符能被用于方法和成員變量。
              2. 聲明為protected的方法和成員變量能被同一個(gè)包里的所有類所訪問,就像默認(rèn)修飾符package一樣。
              3. 能被該類的子類所訪問,子類可以和父類不在一個(gè)包中。
              這樣,當(dāng)你想讓一個(gè)類中的某個(gè)方法或成員變量在包中都可見,而且其子類也能訪問(子類有可能和父類不在同一個(gè)包中)但又不想讓所有類都可以訪問該類時(shí),就可以用protected修飾符。
              可訪問性:
              public > protected > package >private

              注意:
              4. But a subclass in another package can access the protected members in the super-class via only the references of subclass or its subclasses. A subclass in the same package doesn’t have this restriction. This ensures that classes from other packages are accessing only the members that are part of their inheritance hierarchy.

             
              下面的例子可以說明上述幾點(diǎn):(特別注意第4點(diǎn))
              我們將創(chuàng)建一個(gè)父類Bird.java,放在birdpack包中,父類中有一個(gè)protected int的成員變量nFeathers;
              再分別創(chuàng)建4個(gè)Bird類的子類Duck1.java,Duck2.java,Duck3.java,Swan.java,放在duckpack包中,通過在每個(gè)子類中調(diào)用nFeathers的不同方法說明上述幾點(diǎn)


          下面的程序并不用于運(yùn)行,因?yàn)樵L問控制在編譯期間就要確定,我們只需編譯下述文件,看是否能通過。在編譯下述文件前,先想想能不能編譯通過?

          //Bird.java------------------------------
          package birdpack;

          public class Bird{
           protected int nFeathers;
           
          }

          //Duck1.java-----------------------------
          package duckpack;

          import birdpack.Bird;

          public class Duck1 extends Bird{
           public void setn(int duck1n){
            //在子類中直接訪問父類中的protected變量
            nFeathers=duck1n;
           }
          }
          //Duck2.java------------------------------ 
          package duckpack;

          import birdpack.Bird;

          public class Duck2 extends Bird{

           public void construct(int newduck2){
            Duck2 d2 = new Duck2();
            //在子類中通過子類的對(duì)象訪問父類中的protected變量
            d2.nFeathers=newduck2;
           }
          }

          //Duck3.java------------------------------
          package duckpack;

          import birdpack.Bird;

          public class Duck3 extends Bird{

           public void construct(int newduck3){
            Bird b = new Bird();
            //子類中用父類對(duì)象反而不能訪問父類中的protected變量
            b.nFeathers=newduck3;
           }
          }

          //Swan.java--------------------------------
          package duckpack;

          import birdpack.Bird;

          public class Swan extends Bird{

           public void construct(int swan){
            Duck1 d1 = new Duck1();
            //子類中用另外一個(gè)子類的對(duì)象也不能訪問父類中的protected變量
            d1.nFeathers=swan;
           }
          }

          編譯上述幾個(gè)文件,后2個(gè)不能通過。編譯器提示:
          " nFeathers has protected access in birdpack.Bird"。

           

          //Bird.java------------------------------
          package birdpack;

          public class Bird{
           protected int nFeathers;
           
          }

          //Duck1.java-----------------------------
          package duckpack;

          import birdpack.Bird;

          public class Duck1 extends Bird{
           public void setn(int duck1n){
            //在子類中直接訪問父類中的protected變量
            nFeathers=duck1n;
           }
          }
          //Duck2.java------------------------------ 
          package duckpack;

          import birdpack.Bird;

          public class Duck2 extends Bird{

           public void construct(int newduck2){
            Duck2 d2 = new Duck2();
            //在子類中通過子類的對(duì)象訪問父類中的protected變量
            d2.nFeathers=newduck2;
           }
          }

          //Duck3.java------------------------------
          package duckpack;

          import birdpack.Bird;

          public class Duck3 extends Bird{

           public void construct(int newduck3){
            Bird b = new Bird();
            //子類中用父類對(duì)象反而不能訪問父類中的protected變量
            b.nFeathers=newduck3;
           }
          }

          //Swan.java--------------------------------
          package duckpack;

          import birdpack.Bird;

          public class Swan extends Bird{

           public void construct(int swan){
            Duck1 d1 = new Duck1();
            //子類中用另外一個(gè)子類的對(duì)象也不能訪問父類中的protected變量
            d1.nFeathers=swan;
           }
          }

          編譯上述幾個(gè)文件,后2個(gè)不能通過。編譯器提示:
          " nFeathers has protected access in birdpack.Bird"。

          第4點(diǎn)說明,就算在子類中,也只能通過子類(或子類的子類)的引用來訪問父類中的protected方法和成員變量。
          在Duck3和Swan兩個(gè)子類中,直接通過父類和另一個(gè)子類來訪問父類中的protected方法和成員變量就不行。

          附:編譯技巧
          當(dāng)編譯含有包聲明的源文件時(shí),使用 -d 選項(xiàng)會(huì)帶來很多方便,它能保證編譯后的class文件存放在正確的目錄路徑下。
          我們可以把上述5個(gè)文件都放在protectedtest目錄下,然后用 -d 選項(xiàng)去編譯:
          javac -d . Bird.java
          javac -d . Duck1.java
          .....
          其中.表示以當(dāng)前目錄創(chuàng)建包結(jié)構(gòu)的目錄層次。編譯成功后,會(huì)在protectedtest下生成2個(gè)目錄:birdpack和duckpack,里面是生成的class文件。
           

          posted on 2009-04-26 20:12 清晨 閱讀(2467) 評(píng)論(0)  編輯  收藏


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 根河市| 舞阳县| 柞水县| 大安市| 遂溪县| 拉萨市| 万州区| 子洲县| 松江区| 滨州市| 茌平县| 万宁市| 黔西县| 精河县| SHOW| 民乐县| 石河子市| 和林格尔县| 西充县| 会泽县| 柞水县| 新乡市| 乌海市| 梧州市| 铜山县| 乌鲁木齐县| 镇康县| 黄浦区| 巴彦县| 麦盖提县| 什邡市| 定襄县| 武隆县| 屏东县| 肥城市| 洛宁县| 大埔县| 克拉玛依市| 嘉兴市| 上蔡县| 邻水|