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()方法呢,这点给我搞晕了,希望高手给我指点迷津,,
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()方法呢,这点给我搞晕了,希望高手给我指点迷津,,
解决方案 »
- Java JPanel加滚动条?
- 正则表达式的(?is)
- 怎么样解决在JSP中网页的显示速度慢的问题
- 如何实现dos中命令行的不让光标移动到提示符的前面的功能(在jtextpane中,急)
- 怎样使一个BufferedImage的背景透明?
- 弱弱的问一下,classpath需要设置具体到目录还是jar文件?
- !!!需要在NET和Java程序之间进行网络互联的朋友请注意:它们之间的一个细微差别可能让你费劲!!!
- 在JAVA中Primitive type 和 Wrapper type类型的关系是什么?
- 刚学java,有一个简单的问题望各位高手指点,谢谢!
- 急!!!JavaApplet的一个小问题,不过很急,请高手进来取分!
- 如何设置button的长度?
- this和instanceof 的用法?
隐藏实现,暴露接口,很OO设计中的一条规则。建议多看些OO基础概念方面的资料,多思考。
例子中的内部类是私有的,跟private的变量一样,在OuterClass2外部都不可以使用
但却可以通过一个public的方法来返回一个private内部类的对象(doit())
所以例子中声明一个接口的变量,让它指向一个具体实现类的对象(由doit()返回)
我觉得还是书上说得有问题,什么叫访问接口中的f()方法,明明就是访问对应实现类中的方法。
访问OutInterface的f()方法
的类都无法访问,就无法获得InnerClass引用,
return new InnerClass("访问内部类构造方法")
传出内部类的引用,有了引用就可以访问内部类的f()方法了
OutInterface out1只是声明一个变量而已,真正创建对象的new
先看看OOP的特征会比较好一点
1、将代码进行良好的格式化,以方便阅读。
2、在发帖文本框的上方单击“#”按钮,选择 Java
3、将代码粘贴到【code=Java】和【/code】之间。发出来的帖子就会是下面的效果:public class Hello { // 程序入口
public static void main(String[] args) {
System.out.println("Hello!");
}
}