个人认为不能 A.D ab = a.getD(); 是因为A.D 是 private 因为假如我将 D 和 DImp2 ,以及dRef, receiveD() 改成以下形式,编译通过,并正确输出: private interface D extends B { void f(); } public class DImp2 implements D { public void f(){System.out.println("DImp2");} } public B getD(){ return new DImp2()/* or DImp(); no difference*/;} private B dRef; //OK. but u cannot new D(); abstract class same public void receiveD (B d) { dRef = d; dRef.f(); }另外,这一句:“将 private interface 实现出来,只是一种方法,用以强迫‘该 interface 中的函数的定义’不要被加上任何型别信息” interface 中的函数定义怎样算加上型别信息,又怎样算没加? 请赐教 谢谢!!
上面的代码有点错误,我加了点注释,结果复制出来看起来有点问题,其实是这样的: private interface D extends B { void f(); } public class DImp2 implements D { public void f(){System.out.println("DImp2");} } public B getD(){ return new DImp2();} private B dRef; public void receiveD (B d) { dRef = d; dRef.f(); }
又漏了,今天是怎么搞的 在main() 里加上A.B ab = a.getD(); 再配合楼上的代码,能够输出 DImp 所以我认为不能A.D ad = a.getD(); 是access的问题,而与能否向上转型无关
向上转型 就是把子类强制转化成某超类。 由于接口的存取范围私有化了,所以无法 向上转型。 也就是说无法使用超类的类型来保存子类的实例了。interface 中的函数定义怎样算加上型别信息,又怎样算没加?就是 通过某个类型类存取某个方法。 比如 a.getD(); 其中的 getD() 就带有 a 类型信息。后面好像会有一章讲专门讲这个的。如果没有讲,你自己研究一下 Class 这个东西。--------------------------------------------------------------------------------------- infinite_wxy() 个人认为不能 A.D ab = a.getD(); 是因为A.D 是 private --------------------------------------------------------------------------------------- 就是这说法了。
因为假如我将 D 和 DImp2 ,以及dRef, receiveD() 改成以下形式,编译通过,并正确输出:
private interface D extends B {
void f();
}
public class DImp2 implements D {
public void f(){System.out.println("DImp2");}
}
public B getD(){ return new DImp2()/* or DImp(); no difference*/;}
private B dRef; //OK. but u cannot new D(); abstract class same
public void receiveD (B d) {
dRef = d;
dRef.f();
}另外,这一句:“将 private interface 实现出来,只是一种方法,用以强迫‘该 interface 中的函数的定义’不要被加上任何型别信息”
interface 中的函数定义怎样算加上型别信息,又怎样算没加? 请赐教 谢谢!!
private interface D extends B {
void f();
}
public class DImp2 implements D {
public void f(){System.out.println("DImp2");}
}
public B getD(){ return new DImp2();}
private B dRef;
public void receiveD (B d) {
dRef = d;
dRef.f();
}
所以我认为不能A.D ad = a.getD(); 是access的问题,而与能否向上转型无关
由于接口的存取范围私有化了,所以无法 向上转型。 也就是说无法使用超类的类型来保存子类的实例了。interface 中的函数定义怎样算加上型别信息,又怎样算没加?就是 通过某个类型类存取某个方法。
比如 a.getD(); 其中的 getD() 就带有 a 类型信息。后面好像会有一章讲专门讲这个的。如果没有讲,你自己研究一下 Class 这个东西。---------------------------------------------------------------------------------------
infinite_wxy() 个人认为不能 A.D ab = a.getD(); 是因为A.D 是 private
---------------------------------------------------------------------------------------
就是这说法了。