Java的内部类——你知道多少?

发表于:2011-1-05 11:06

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:青竹少年    来源:51Testing软件测试网采编

  如果你想访问Java内部类,你必须先拿到它的宿主类,这样你才能对内部类进行操作:

1 public class CheckClass {
2     public static void main(String[] args) {
3         MainClass mainClass = new MainClass();
4         System.out.println(mainClass.getInnerClass().getName());
5     }
6 }

  这样的话,编译就不会报错了。

  好了,该回答第二个问题了,就是内部类能不能访问宿主类的私有属性?回答是可以的。如果,你会看JVM的源码的话,你就会看到,在编译内部类调用主类私有变量时,会把它们转换成一种特殊的符号,JVM会把这种符号解析成公有的,然后让内部类调用。代码很简单,我就不贴了。

  接着回答第三个和第四个问题:就是内部类能不能继承别的类和接口?内部类能不能是static的?为什么不能,当然可以,这些并没有什么约束。你自己可以试一下。

  该第五个问题了:在主类的方法里面可不可以定义内部类?其实,这个问题,在我回答第一个问题的时候,已经把答案告诉了大家,就是在getInnerClass()方法里面,不就是new了一个内部类吗。

  第六个问题:初始化主类的时候是不是也把内部类给初始化了?为什么?这个嘛,如果反过来说就对了,因为如果,你想调用内部类,你就得初始化它的主类,因此,你在初始化内部类时就初始化了主类,但是,你初始化主类,如果不是显示的去初始化,你就不可能初始化它的内部类,尽管内部类是在主类的里面。如果,你有时间,你可以到编译的主类文件去看看。

  最后一个问题就是:怎样写一个匿名的内部类?如果大家搞过Java Swing或者Android开发,这个问题对你来说很简单,因为在随便的一些事件里,你就可以定义一个匿名的内部类,然后实现它的方法。不过,为了让更多的人明白,我把代码贴出来,以下是我的代码:

  这是要实现的那个接口:

1 public interface SuperInterface {
2     public void print();
3 }

  以下是主类的代码:

 1 public class MainClass {
2    
3     public SuperInterface print(){
4        
5         return new SuperInterface(){
6
7             public void print() {
8                 System.out.println("Hello Anonymity Interface");
9             }};
10     }
11 }

  其实上面的一段代码就是一个匿名内部类,为什么叫匿名内部类呢?因为,你没有给那个内部类起名字,而是直接实现那个接口,所以叫匿名内部类。

  好吧,我看写的也不少了,不过,可能我还会有疏漏的地方,希望大家能参与进来共同讨论。

22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号