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

本文详细介绍了Java内部类的概念、如何访问内部类、内部类能否访问宿主类的私有属性、内部类是否能继承其他类和接口、是否能在主类方法中定义内部类、初始化主类时是否也初始化内部类以及如何编写匿名内部类。

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

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

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

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

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

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

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

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

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

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

这是内部类:innerclass.

1 public class mainclass {

2

3public class innerclass{

4public string name = "name";

5

6public string getname() {

7return name;

8}

9

10public void setname(string name) {

11this.name = name;

12}

13}

14 }

以下是引用:

1 public class checkclass {

2public static void main(string[] args) {

3innerclass innerclass = new innerclass();

4system.out.println(innerclass.getname());

5}

6 }

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

以下是内部类的写法:

1 public class mainclass {

2public innerclass getinnerclass() {

3return new innerclass();

4}

5

6public class innerclass {

7public string name = "name";

8

9public string getname() {

10return name;

11}

12

13public void setname(string name) {

14this.name = name;

15}

16}

17 }

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

1 public class checkclass {

2public static void main(string[] args) {

3mainclass mainclass = new mainclass();

4system.out.println(mainclass.getinnerclass().getname());

5}

6 }

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

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

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

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

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

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

这是要实现的那个接口:

1 public interface superinterface {

2public void print();

3 }

以下是主类的代码:

1 public class mainclass {

2

3public superinterface print(){

4

5return new superinterface(){

6

7public void print() {

8system.out.println("hello anonymity interface");

9}};

10}

11 }

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

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


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值