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

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

對Java多態性綜合運用的探討

2019-11-18 15:45:22
字體:
來源:轉載
供稿:網友

  或許大家java的多態問題,對上溯,下溯造型有了一定的概念,對PRotect和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的方法?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 五寨县| 金昌市| 武定县| 靖安县| 西和县| 蒙山县| 安达市| 淮安市| 涡阳县| 渭南市| 莫力| 卓资县| 阿勒泰市| 霍城县| 台江县| 祥云县| 博兴县| 铁岭县| 长阳| 武隆县| 萝北县| 霍城县| 拜泉县| 荥阳市| 垣曲县| 百色市| 措勤县| 蒙城县| 绥阳县| 昌黎县| 西畴县| 五台县| 宣武区| 偏关县| 平利县| 景泰县| 甘谷县| 临安市| 中阳县| 刚察县| 嵩明县|