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

上一篇 / 下一篇  2011-01-05 17:02:08 / 个人分类:Java

  我在写这篇文章之前,我对Java内部类也不是很清楚,只知道简单的应用。前几天有个朋友问我怎么理解Java内部类,我当时就有点傻了,想了半天也没有说出来,我想,如果让大家来回答这个问题,大家该怎么回答呢?我估计,总有一些人回答不上来的,或者说回答的不够完整。我特意查了查,自己又总结了总结,在这给大家分享一下。 在说之前,我先列出几个问题:

  1.外部类(非主类)通过怎样的方式访问内部类?

  2.内部类能不能访问主类私有的属性,为什么?

  3.内部类能不能继承别的类和接口?

  4.内部类能不能是static的?

  5.在主类的方法里面可不可以定义内部类?

  6.初始化主类的时候是不是也把内部类给初始化了?为什么?

  7.怎样写一个匿名的内部类?

  我目前想到的就这些,在我给大家陈述之前,希望大家好好想想,再往下看:

  第一个问题:外部类是怎样引用内部类的?这个问题,我想,可能有的人就会这样写:

  这是内部类:InnerClass.

 1publicclassMainClass {
2   
3   publicclassInnerClass{
4       publicString name="name";
5
6       publicString getName() {
7           returnname;
8        }
9
10       publicvoidsetName(String name) {
11           this.name=name;
12        }
13    }
14}

  以下是引用:

1publicclassCheckClass {
2   publicstaticvoidmain(String[] args) {
3        InnerClass innerClass=newInnerClass();
4        System.out.println(innerClass.getName());
5    }
6}

  如果这样写的话,会报编译错误。那么为什么会报错呢?因为在Java的设计中,如果想访问一个类的内部类,你必须通过宿主类去取它,然后,再对它进行操作,Java就是想这样把内部类给封闭起来的,好吧,正确的写法,我给大家贴出来:

  以下是内部类的写法:

 1publicclassMainClass {
2   publicInnerClass getInnerClass() {
3       returnnewInnerClass();
4    }
5
6   publicclassInnerClass {
7       publicString name="name";
8
9       publicString getName() {
10           returnname;
11        }
12
13       publicvoidsetName(String name) {
14           this.name=name;
15        }
16    }
17}

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

1publicclassCheckClass {
2   publicstaticvoidmain(String[] args) {
3        MainClass mainClass=newMainClass();
4        System.out.println(mainClass.getInnerClass().getName());
5    }
6}

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

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

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

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

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

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

  这是要实现的那个接口:

1publicinterfaceSuperInterface {
2   publicvoidprint();
3}

  以下是主类的代码:

 1publicclassMainClass {
2   
3   publicSuperInterface print(){
4       
5       returnnewSuperInterface(){
6
7           publicvoidprint() {
8                System.out.println("Hello Anonymity Interface");
9            }};
10    }
11}

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

 


TAG: java JAVA Java 内部类

 

评分:0

我来说两句

日历

« 2024-03-27  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

我的存档

数据统计

  • 访问量: 13367
  • 日志数: 14
  • 建立时间: 2011-01-04
  • 更新时间: 2011-01-05

RSS订阅

Open Toolbar