锁定老帖子 主题:Java的内部类——你知道多少?
精华帖 (0) :: 良好帖 (1) :: 新手帖 (5) :: 隐藏帖 (6)
|
|
---|---|
作者 | 正文 |
发表时间:2011-03-03
最后修改:2011-03-03
1.外部类(非主类)通过怎样的方式访问内部类? 2.内部类能不能访问主类私有的属性,为什么? 3.内部类能不能继承别的类和接口? 4.内部类能不能是static的? 5.在主类的方法里面可不可以定义内部类? 6.初始化主类的时候是不是也把内部类给初始化了?为什么? 7.怎样写一个匿名的内部类? 我目前想到的就这些,在我给大家陈述之前,希望大家好好想想,再往下看: 第一个问题:外部类是怎样引用内部类的?这个问题,我想,可能有的人就会这样写: 这是内部类:InnerClass. 1 public class MainClass { 2 3 public class InnerClass{ 4 public String name = "name"; 5 6 public String getName() { 7 return name; 8 } 9 10 public void setName(String name) { 11 this.name = name; 12 } 13 } 14 } 以下是引用: 1 public class CheckClass { 2 public static void main(String[] args) { 3 InnerClass innerClass = new InnerClass(); 4 System.out.println(innerClass.getName()); 5 } 6 } 如果这样写的话,会报编译错误。那么为什么会报错呢?因为在Java的设计中,如果想访问一个类的内部类,你必须通过宿主类去取它,然后,再对它进行操作,Java就是想这样把内部类给封闭起来的,好吧,正确的写法,我给大家贴出来: 以下是内部类的写法: 1 public class MainClass { 2 public InnerClass getInnerClass() { 3 return new InnerClass(); 4 } 5 6 public class InnerClass { 7 public String name = "name"; 8 9 public String getName() { 10 return name; 11 } 12 13 public void setName(String name) { 14 this.name = name; 15 } 16 } 17 } 如果你想访问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 } 其实上面的一段代码就是一个匿名内部类,为什么叫匿名内部类呢?因为,你没有给那个内部类起名字,而是直接实现那个接口,所以叫匿名内部类。 好吧,我看写的也不少了,不过,可能我还会有疏漏的地方,希望大家能参与进来共同讨论 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-03-03
楼主:我觉得你讲这么多还是没有讲清楚到底何时用内部类,何时用静态内部类,何时用匿名内部类,何时用局部类。
|
|
返回顶楼 | |
发表时间:2011-03-03
xutao5641745 写道 楼主:我觉得你讲这么多还是没有讲清楚到底何时用内部类,何时用静态内部类,何时用匿名内部类,何时用局部类。
能不能讲解下???谢谢 |
|
返回顶楼 | |
发表时间:2011-03-03
8830417 写道 xutao5641745 写道 楼主:我觉得你讲这么多还是没有讲清楚到底何时用内部类,何时用静态内部类,何时用匿名内部类,何时用局部类。
能不能讲解下???谢谢 这个问题自己研究去! |
|
返回顶楼 | |
发表时间:2011-03-03
当内部类是 静态内部类的时候
实例化 外部类的时候 内部类不会跟着初始化吗?????????? |
|
返回顶楼 | |
发表时间:2011-03-03
天下本不需内部类,庸人自扰之。
|
|
返回顶楼 | |
发表时间:2011-03-03
每个内部类都能独立地继承自一个实现, 所以无论外围类是否已经继承了某个实现, 对于内部类都没有影响。 即内部类有效地实现了多重继承
|
|
返回顶楼 | |
发表时间:2011-03-03
最后修改:2011-03-03
引用 如果这样写的话,会报编译错误。那么为什么会报错呢?因为在Java的设计中,如果想访问一个类的内部类,你必须通过宿主类去取它,然后,再对它进行操作,Java就是想这样把内部类给封闭起来的,好吧,正确的写法,我给大家贴出来:
以下是内部类的写法: 1 public class MainClass { 2 public InnerClass getInnerClass() { 3 return new InnerClass(); 4 } 5 6 public class InnerClass { 7 public String name = "name"; 8 9 public String getName() { 10 return name; 11 } 12 13 public void setName(String name) { 14 this.name = name; 15 } 16 } 17 } 如果你想访问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 } 这样的话,编译就不会报错了。 不用这么麻烦非要在外围类里面通过方法返回一个内部类的实例吧? 因为你的内部类是public的, 所以可以这样子写 1 public class CheckClass { 2 public static void main(String[] args) { 3 MainClass main = new MainClass(); 4 MainClass.InnerClass inner = main.new InnerClass(); 5 } 6 } |
|
返回顶楼 | |
发表时间:2011-03-03
ricoyu 写道 引用 如果这样写的话,会报编译错误。那么为什么会报错呢?因为在Java的设计中,如果想访问一个类的内部类,你必须通过宿主类去取它,然后,再对它进行操作,Java就是想这样把内部类给封闭起来的,好吧,正确的写法,我给大家贴出来:
以下是内部类的写法: 1 public class MainClass { 2 public InnerClass getInnerClass() { 3 return new InnerClass(); 4 } 5 6 public class InnerClass { 7 public String name = "name"; 8 9 public String getName() { 10 return name; 11 } 12 13 public void setName(String name) { 14 this.name = name; 15 } 16 } 17 } 如果你想访问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 } 这样的话,编译就不会报错了。 不用这么麻烦非要在外围类里面通过方法返回一个内部类的实例吧? 因为你的内部类是public的, 所以可以这样子写 1 public class CheckClass { 2 public static void main(String[] args) { 3 MainClass main = new MainClass(); 4 MainClass.InnerClass inner = main.new InnerClass(); 5 } 6 } 好的,谢谢 |
|
返回顶楼 | |
发表时间:2011-03-03
最后一个问题就是:怎样写一个匿名的内部类?如果大家搞过Java Swing或者Android开发,这个问题对你来说很简单,因为在随便的一些事件里,你就可以定义一个匿名的内部类,然后实现它的方法。
================================================ 没有讲到内部类的真实 目的 内部类最大好处 就是保持跟外部类的生命周期一致,可以通过管理一个类的生命周期来维护俩个类的生命周期 在线成池 ,连接池 ,通信套接字 是必然用到的 这些要求内存管理很高的时候,对类的生命是必须负责的 ,但过多的类不好维护,通常为便于方便维护,就将归纳 并放在一起 |
|
返回顶楼 | |