interface OutInterface{
public void f();
}
public class InterfaceInner
{
public static void main(String[]args)
{
OuterClass2 out=new OuterClass2();
OutInterface out1=out.doit();
out1.f();
}
  
}
class OuterClass2
{
private class InnerClass implements OutInterface
{
InnerClass(String s)
{
System.out.println(s);
}
public void f()
{
System.out.println("访问内部类中的f()方法");
}
}
public OutInterface doit()
{
return new InnerClass("访问内部类构造方法");
}
}
下面是书上对这段代码的解释,不过我有点晕了,,,
如果某个类继承了外部类,由于内部的权限不可以向下转型为内部类InnerClass,同时也不能访问f()方法,但是却可以访问接口中的f()方法。例如InterfaceInner类中最后一条语句,接口引用调用f()方法,从执行结果可以看到,这条语句执行的是内部类中的f()方法,
问题出现了,上面说不能访问内部类f()方法,可以访问接口中的f()方法,可怎么它举个例子又访问了内部类的f()方法呢,这点给我搞晕了,希望高手给我指点迷津,,

解决方案 »

  1.   

    是间接访问,就像你不能直接操作计算机的电路,但却可以通过输入设备(键盘,鼠标)等来间接操作它。
    隐藏实现,暴露接口,很OO设计中的一条规则。建议多看些OO基础概念方面的资料,多思考。
      

  2.   

    方法是动态绑定的,真正调用的是具体的instance的方法
    例子中的内部类是私有的,跟private的变量一样,在OuterClass2外部都不可以使用
    但却可以通过一个public的方法来返回一个private内部类的对象(doit())
    所以例子中声明一个接口的变量,让它指向一个具体实现类的对象(由doit()返回)
      

  3.   

    out.doit()返回了一个InnerClass类的对象,然后调用自己的f()当然不会有问题啊。
    我觉得还是书上说得有问题,什么叫访问接口中的f()方法,明明就是访问对应实现类中的方法。
      

  4.   

    OutInterface out1=out.doit(); 
    访问OutInterface的f()方法
      

  5.   

    out.doit()应该是返回一个OutInterface接口,
      

  6.   

    InnerClass是私有的内部类,除OuterClass2 以外
    的类都无法访问,就无法获得InnerClass引用,
    return new InnerClass("访问内部类构造方法")
    传出内部类的引用,有了引用就可以访问内部类的f()方法了
      

  7.   

    OutInterface out1是不是就是创建一个接口对象,我记得好像是不能直接用接口名字创建对象的呀
      

  8.   

    LZ没听说过多态?没有听说过父类引用指向子类对象这些?
    OutInterface out1只是声明一个变量而已,真正创建对象的new
    先看看OOP的特征会比较好一点
      

  9.   

    楼主我教你怎么贴代码:
    1、将代码进行良好的格式化,以方便阅读。
    2、在发帖文本框的上方单击“#”按钮,选择 Java
    3、将代码粘贴到【code=Java】和【/code】之间。发出来的帖子就会是下面的效果:public class Hello {    // 程序入口
        public static void main(String[] args) {
            System.out.println("Hello!");
        }
    }