題目
在第一個包中創建一個至少有一個方法的接口。然後在第二個包中創建一個類,在其中增加一個protected的內部類以實現那個接口。在第三個包中,繼承這個類,並在一個方法中返回這個protected內部類的對象,返回的時候向上轉型爲第一個包中的接口類型。
代碼
package P195Practice6.Package1;
public interface InnerClassInterface {
void show();
}
package P195Practice6.Package2;
import P195Practice6.Package1.InnerClassInterface;
public class Outer {
protected class Inner implements InnerClassInterface {
public Inner() { //最坑的地方,類構造器的訪問權限和類訪問權限是相同的,因此如果不寫public構造器的話,是不能創建Inner對象的,因爲Inner不可見
}
@Override
public void show() {
System.out.println("this is " + this.getClass());
}
}
}
package P195Practice6.Package3;
import P195Practice6.Package1.InnerClassInterface;
import P195Practice6.Package2.Outer;
public class ExtendedClass extends Outer {
public InnerClassInterface getInner(){
return new Outer().new Inner();
}
}
//要繼承Outer纔有Inner的訪問權限
//可以把Inner看成是Outer內部的一個protected對象,因此必須繼承Outer纔有Inner可見
package P195Practice6;
import P195Practice6.Package3.ExtendedClass;
public class Practice6 {
public static void main(String[] args) {
new ExtendedClass().getInner().show();
}
}
//output: this is class P195Practice6.Package2.Outer$Inner
吐槽
內部類和訪問權限混在一起的時候就很混亂,這次發現了默認構造器這個坑,以後怕不是會發現更多坑。(我滿臉都是:WHAT???啥玩意???