java学习笔记---理解内部类
2013-04-25 23:30
225 查看
(1)内部类的继承
enclosingClassReference.super();
这样才提供了必要的引用,然后程序才能编译通过。
(2)内部类可以被覆盖吗
如果创建了一个内部类,然后继承其外围类并重新定义此内部类时,会发生什么呢?也就是说,内部类可以被覆盖吗?实际上,内部类就好像是外围类的一个方法,其实并不起作用。
结果为:
默认的构造器是编译器自动生成的,这里是调用基类的默认构造器。该例子说明,当继承了某个外围类的时候,内部类并没有什么特别神奇的变化。这两个内部类时完全独立的两个实体,各自在自己的命名空间内。
当然,明确继承某个内部类也是可以的
结果是:
此例的另一个目的也是在此熟悉,当存在继承结构时,各个构造方法的调用顺序。
class WithInner { class Inner { } } public class InheritInner extends WithInner.Inner { InheritInner(WithInner wi) { wi.super(); } public static void main(String[] args) { WithInner wi=new WithInner(); InheritInner ii=new InheritInner(wi); } }可以看到,InheritInner只继承自内部类,而不是外围类。但是当要生成一个构造器时,默认的构造器并不算好,而且不能只是传递一个指向外围类对象的引用。此外,还必须在构造器中使用如下语法:
enclosingClassReference.super();
这样才提供了必要的引用,然后程序才能编译通过。
(2)内部类可以被覆盖吗
如果创建了一个内部类,然后继承其外围类并重新定义此内部类时,会发生什么呢?也就是说,内部类可以被覆盖吗?实际上,内部类就好像是外围类的一个方法,其实并不起作用。
class Egg1 { private York y; protected class York { public York() { System.out.println("Egg.York()"); } } public Egg1() { System.out.println("New Egg()"); y=new York(); } } public class BigEgg extends Egg1 { public class York { public York() { System.out.println("BigEgg.York()"); } } public static void main(String[] args) { new BigEgg(); } }
结果为:
New Egg() Egg.York()
默认的构造器是编译器自动生成的,这里是调用基类的默认构造器。该例子说明,当继承了某个外围类的时候,内部类并没有什么特别神奇的变化。这两个内部类时完全独立的两个实体,各自在自己的命名空间内。
当然,明确继承某个内部类也是可以的
class Apple { public Apple() { System.out.println("Apple()"); } } class Egg { protected class York { public York() { System.out.println("Egg.York()"); } public void f() { System.out.println("Egg.York.f()"); } } private York y=new York(); private Apple a=new Apple(); public Egg() { System.out.println("Egg()"); } public void insertYork(York yy) { y=yy; } public void g() { y.f(); } } public class OverrideInnerClassTest extends Egg { private Apple a=new Apple(); public class York extends Egg.York { public York() { System.out.println("BigEgg.York()"); } public void f() { System.out.println("BigEgg.York.f()"); } } public OverrideInnerClassTest() { insertYork(new York()); } public static void main(String[] args) { OverrideInnerClassTest bigEgg=new OverrideInnerClassTest(); bigEgg.g(); } }
结果是:
Egg.York() Apple() Egg() Apple() Egg.York() BigEgg.York() BigEgg.York.f()
此例的另一个目的也是在此熟悉,当存在继承结构时,各个构造方法的调用顺序。
相关文章推荐
- 学习深入理解java虚拟机笔记--对象已死吗
- 【学习笔记14】java面向对象-成员内部类、局部内部类
- Java学习笔记_成员内部类,静态内部类,方法内部类
- 深入理解java虚拟机-学习笔记
- 【Java学习笔记之二十六】深入理解Java匿名内部类
- 深入理解 Java 虚拟机之学习笔记(3)
- 学习笔记 Java_ch04_内部类内部接口 2014.7.27
- Java 并发编程学习笔记 理解CLH队列锁算法
- Java学习笔记之内部类和异常类、匿名类
- Java学习笔记之内部类和匿名类
- Java菜鸟学习笔记--面向对象篇(十二):Package简单理解
- 【Java学习笔记之二十四】对Java多态性的一点理解
- java基础学习,一些零散的笔记之内部类
- Java多线程学习笔记——从Java JVM对多线程数据同步的一些理解
- Android(java)学习笔记229:服务(service)之绑定服务调用服务里面的方法 (采用接口隐藏代码内部实现)
- [每日学习笔记][2012.07.10]使用Java理解程序逻辑(七)
- [每日学习笔记][2012.08.02]使用Java理解程序逻辑(九)
- jdk的配置和JVM内部原理 java 基础学习笔记 第一天
- Java学习笔记—理解i++和++i
- 8大内部排序算法学习笔记--(4)归并、基数排序 Java实现