亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

引用 造型 protected和private的困惑

2019-11-18 13:18:40
字體:
來源:轉載
供稿:網友

  或許大家java的多態問題,對上溯,下溯造型有了一定的概念,對PRotected和private大家想必也很清楚,但是,這幾個個結合在一起,往往令人產生很多困惑,在這里,我舉一個例子,大家或許會發覺這篇文章對你來說還是很有意義的:
  例子一共有兩個class. 可能出現困惑的地方我都會在后面一一解釋.
  A是一個父類,B繼續A,并且實現了protectedTest(Object obj)方法.如下面所示:
  B.java的源代碼:
  package cn.org.matrix.test;
  import cn.org.matrix.test.A;
  /**
   * <p>Title: protect, private and upcasting </p>
   * <p>Description: email:chris@matrix.org.cn</p>
   * <p>Copyright: Matrix Copyright (c) 2003</p>
   * <p>Company: Matrix.org.cn</p>
   * @author chris
   * @version 1.0,who use this example pls remain the declare
   */
  public class B extends A
  {
    protected int protectedb = 0;
    protected int protectedab = 0;
    
  
    protected void protectedTest(Object obj)
    {
      System.out.println("in B.protectedTest(Object):" + obj);
    }
  }
  
  A.java的源代碼:
  package cn.org.matrix.test;
  import cn.org.matrix.test.B;
  /**
   * <p>Title: protect, private and upcasting </p>
   * <p>Description: email:chris@matrix.org.cn</p>
   * <p>Copyright: Matrix Copyright (c) 2003</p>
   * <p>Company: Matrix.org.cn</p>
   * @author chris
   * @version 1.0,who use this example pls remain the declare
   */
  
  public class A
  {
    protected int protecteda = 0;
    protected int protectedab = 0;
    private void privateTest()
    {
      System.out.println("in A.privateTest()");
    }
    protected void protectedTest(Object obj)
    {
      System.out.println("in A.protectedTest(Object):" + obj );
    }
  
    protected void protectedTest( String str )
    {
      System.out.println("in A.protectedTest(String):" + str);
    }
  
    public static void main (String[] args)
    {
      // Test A
      A a1 = new A();
      a1.privateTest();
      // Test B
      String helloStr = "Hello";
      Object helloObj = helloStr;
      B b1 = new B();
      A a2 = b1;             // 這里發生了什么?困惑1
      b1=a1;               //編譯錯誤,困惑2
      b1. privateTest();           //編譯錯誤,困惑3
    b1.protectedTest(helloObj);      //輸出結果?困惑4
      b1.protectedTest(helloStr);       //編譯錯誤,困惑5
      a2.protectedTest(helloObj);      //輸出結果? 困惑6
      a2.protectedTest(helloStr);       //輸出結果?困惑7 ?
    }
  }
  
  下面,我來逐個解釋每一處困惑的地方:
  
  困惑1:
  這里其實就是子類自動上溯造型到父類A。這里a2其實是指向了一個B類型的對象. 我們通常都可以這樣作: A a2=b1, 這樣作的意思實際上就是讓a2指向了一個類型B的對象—在這里就是b1了.
    在java里面,關于跨類引用,有兩條規則應該記住:
  1. 假如a是類A的一個引用,那么,a可以指向類A的一個實例,或者說指向類A的一個子類.
  2. 假如a是接口A的一個引用,那么,a必須指向實現了接口A的一個類的實例.
  所以,根據這兩個規則,我們就不難理解例子中的A a2 = b1是什么意思了.
  
  困惑2:
     A a2 = b1是可以的,但是為什么b1=a1卻是不行? 在這里,我們依然可以套用上面的兩條規則,我們可以看到,b1是類B的一個引用,a1既不是類B的實例,也不是類B的子類的實例,所以直接b1=a1就出現了編譯錯誤.
     假如確實需要進行這樣的轉化,我們可以這樣作:b1=(B)a1; 進行強制轉化,也就是下溯造型. 在java里面,上溯造型是自動進行的,但是下溯造型卻不是,需要我們自己定義強制進行.
    
  困惑3:
     b1. privateTest();編譯不通過? 這是很顯然的,你可以回顧一下private的定義: 私有域和方法只能被定義該域或方法的類訪問.  所以,在這里,b1不能訪問A的方法privateTest(),即使b1是A的子類的實例.
     請看下面的例子:
  public class A
  {
   private int two(int i) { return i; }
  }
  class Test extends A {
   public static void main(String[] args) {
   System.out.println(A.two(3));
   }
  }
  
     System.out.println(A.two(3));這行編譯出錯,顯然,因為private方法不能在這個類之外被訪問。
    
  而protected則不同,我們回顧一下protected的定義: 被保護的域或方法只能被類本身、類的子類和同一 程序包中的類所訪問。
  下面是一個錯誤使用protected的例子:
  package cn.org.matrix.test;
  public class ProtectedTest {
   protected void show() {
    System.out.println("I am in protected method");
   }
  }
  
  import cn.org.matrix.test.*;
  public class Test {
    public static void main (String[] args) {
     ProtectedTest obj = new ProtectedTest();
     obj.show();
    }
  }
  因為訪問權限問題,你會得到”show() has protected access in test.ProtectedTest”的出錯信息. 
  
  困惑4:
    b1.protectedTest(helloObj); 輸出的是”in B.protectedTest(Object):…” 這到底是為什么呢? 為什么jvm能夠確定是輸出B的方法而不是A的方法? 這就和jvm的運行機制有關系了. 我們上面提到了,a1是一個A類型的引用,但是指向了一個B類型的實例. 在這里,假如jvm根據引用的類型-在這里就是A 來定義調用哪個方法的話,那么應該是調用A的protectedTest(helloObj).
    然后實際上不是這樣的,因為jvm的動態編譯能力,jvm會在run-time來決定調用哪一個method,而不是在compile time. 也就是所謂的late-binding(run-time)和early-binding(compile-time).
    
  困惑5:
    b1.protectedTest(helloStr); 這里為什么會出現編譯錯誤? 他可以調用類B的protectedTest(Object obj)方法啊,把helloStr上溯造型成一個object就行了啊..或者上溯造型到A然后調用A的protectedTest(helloStr)方法啊.
    呵呵,問題的根源就在于此了,既然有兩種選擇,jvm應該選擇那一種?這種不確定性假如交給jvm來動態決定的話,勢必帶來程序的不確定性..雖然java在其他的一些地方也有類似的情形出現,比如static變量的循環定義造成的不確定性,但是,在這里,jvm還是在編譯階段就解決了這個問題.
    所以,我們會在這一步碰到編譯錯誤: “reference to protectedTest is ambiguous; both method protectedTest(java.lang.String) in mytest.A and method   protectedTest(java.lang.Object) in mytest.B match at line 46.
    在這里,我們碰到的是顯式的reference ambiguous錯誤,但是,有時候,隱式的reference ambiguous卻往往是更加的危險.
     在這里,我舉個例子:
    父類的 源代碼:
    public super
  {
    private void test(int i, long j);
    {
      System.out.println(i+”and”+j);
    }
  }
    子類的源代碼:
  public sub
  {
    private void test(long j, int i);
    {
      System.out.println(i+”and”+j);
    }
  }
  
    子類和父類都用有相同名稱的方法test,參數類型不同而已.這種情況下,編譯可以被通過.
    但是假如你在另外一個類中用到了如下代碼:
    Sub sb = new Sub();
    sb.test(100, 3000);  
    你就會碰到編譯錯誤,因為沒有確定的指出3000的類型,所以造成reference ambiguous的錯誤了.
    
  困惑6:
    a2.protectedTest(helloObj);  
    輸出結果分別是:”in B.protectedTest(Object)..” 經過上面的解釋,想必大家都能很清楚的知道為什么會有這兩個輸出結果了:a2.protectedTest(helloObj);因為jvm的late-binding,所以在run-time的時候,調用了B類的方法,雖然在編譯期間a2只是一個父類A的引用類型。
  
  困惑7:
    a2.protectedTest(helloStr); 為什么這里會輸出” in A.protectedTest(Object)…”。為什么這里不會編譯出錯?為什么b1. protectedTest(helloStr)會出錯而a2. protectedTest(helloStr)會出錯?我調用了a2.equals(b1)和a2==b1得到的結果都是true啊?但是為什么這里出這個錯誤?
    在這里,這個問題是最要害的,也是我們放到最后來解答的原因。
    首先,回顧一下equals()和==的在java里面的概念,記得有一道scjp

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久91| 免费不卡在线观看av| 欧美精品在线免费播放| www欧美xxxx| 国产精品免费观看在线| 伊人伊成久久人综合网小说| 66m—66摸成人免费视频| 久久久成人的性感天堂| 影音先锋欧美在线资源| 成人在线视频网| 亚洲成色777777女色窝| 久久久久久91香蕉国产| 国语自产在线不卡| 国产一区二区在线免费| 国产+人+亚洲| 91国产精品91| 亚洲国产私拍精品国模在线观看| 欧美理论电影在线播放| 亚洲精品欧美一区二区三区| 国产精品偷伦视频免费观看国产| 亚洲欧美在线一区二区| 欧美一级免费看| 国产精品视频免费观看www| 精品国产精品三级精品av网址| 美女性感视频久久久| 欧美日韩亚洲91| 日韩欧美一区二区三区久久| 亚洲图片欧美日产| 国产精品一二三视频| 午夜精品一区二区三区在线播放| 97视频在线观看视频免费视频| 亚洲精品美女久久久| 亚洲国产美女久久久久| 国产一区二区三区毛片| 色综合91久久精品中文字幕| 日韩精品极品视频| 欧美乱人伦中文字幕在线| 国产91精品黑色丝袜高跟鞋| 亚洲欧美日韩国产精品| 91影院在线免费观看视频| 欧美黄色片视频| 国产精品久久久久久久久久小说| 91av在线视频观看| 日韩欧美在线第一页| 欧美国产日韩一区二区三区| 亚洲国产97在线精品一区| 国产成人高潮免费观看精品| 最新国产精品拍自在线播放| 欧美日韩国产丝袜美女| 国产欧美最新羞羞视频在线观看| 国产色婷婷国产综合在线理论片a| 韩国精品久久久999| 成人免费高清完整版在线观看| 91精品综合久久久久久五月天| 日韩欧美高清在线视频| 91精品久久久久久久久久入口| 亚洲区免费影片| 国产亚洲精品久久久| 欧美成人午夜免费视在线看片| 日韩久久免费视频| 国产精品v日韩精品| 136fldh精品导航福利| 亚洲人成亚洲人成在线观看| 亚洲国产高清福利视频| 日韩电影免费观看在线观看| 97国产一区二区精品久久呦| 国产精品盗摄久久久| 成人性生交大片免费看小说| 奇米一区二区三区四区久久| 成人激情综合网| 精品美女国产在线| 俺去亚洲欧洲欧美日韩| 国产在线拍偷自揄拍精品| 亚洲国产古装精品网站| 国产精品美女999| 亚洲精品美女久久久| 国模吧一区二区三区| 91国语精品自产拍在线观看性色| 久久国产精品99国产精| 91久久精品在线| 中文字幕亚洲欧美在线| 美日韩丰满少妇在线观看| 伊人久久精品视频| 欧美日韩亚洲精品一区二区三区| 欧美性生交xxxxx久久久| 欧美成人剧情片在线观看| 美日韩精品免费观看视频| 欧美xxxx18性欧美| 高跟丝袜欧美一区| 国产欧美精品一区二区三区-老狼| 亚洲欧美另类在线观看| 欧美日韩中文字幕日韩欧美| 国产亚洲美女精品久久久| 亚洲网站在线播放| 国产极品精品在线观看| 欧美国产乱视频| 日本国产欧美一区二区三区| 奇米成人av国产一区二区三区| 国产精品福利在线| 亚洲**2019国产| 中文字幕久精品免费视频| 久久久精品一区二区| 91精品在线国产| 久久天堂电影网| 亚洲成人免费网站| 国产一区二区三区三区在线观看| 精品毛片三在线观看| 国产精品久久久久久久av电影| 国产精品女主播| 青青草99啪国产免费| 久色乳综合思思在线视频| 丝袜美腿亚洲一区二区| 亚洲电影中文字幕| 国产成一区二区| 国产精品精品久久久| 国产精品爽黄69天堂a| 91久久精品国产91久久| 亚洲欧美另类人妖| 国产成人小视频在线观看| 日韩av影视综合网| 久久亚洲欧美日韩精品专区| 亚洲片av在线| 国产精品嫩草影院久久久| 亚洲成年人在线| 亚洲va欧美va在线观看| 国产日本欧美一区二区三区| 成年无码av片在线| 国产视频丨精品|在线观看| 日本免费久久高清视频| 亚洲成人久久久| 久久久久久久久爱| 欧美精品电影免费在线观看| 午夜精品在线视频| 另类视频在线观看| 亚洲自拍偷拍福利| 96国产粉嫩美女| 91精品国产色综合久久不卡98口| 亚洲男人天堂久| 国产精品第七十二页| 97在线视频观看| 亚洲在线免费视频| 青青久久aⅴ北条麻妃| 456亚洲影院| 91沈先生在线观看| 奇米四色中文综合久久| 亚洲日本欧美日韩高观看| 国产精品视频男人的天堂| 亚洲a∨日韩av高清在线观看| 午夜精品久久久99热福利| 国产成人精品av| 国产成人a亚洲精品| 久久成人精品视频| 国产精品美女av| 亚洲第一视频网| 国产九九精品视频| 91久久久久久国产精品| 国产精品免费看久久久香蕉| 国产盗摄xxxx视频xxx69| 亚洲精品免费在线视频| 欧美精品电影在线| 亚洲免费av网址| 91久久久久久久一区二区| 另类美女黄大片| 日韩一中文字幕|