Thinking in Java之内部类
前言
学习Java已经有一段日子了,最近的日子笔者在重新对java进行再学习。不过这个阶段的学习
笔者不会再着眼于具体的语法哪些细枝末节的东西了,这个阶段的学习中笔者将会对以前学习的
模糊的,遗漏的知识概念做一些相关性的总结。今天,恰好看到内部类这块了,记得以前对内部类
的使用就有一些模糊,因此专门就内部类做一些总结。
内部类概念所谓内部类就是指在一个外部类中再定义一个类(内部类),这样内部类就作为一个成员依附于
外部类而存在。不过在使用内部类的时候需要注意的是内部类可以static,protect,private,但是
外部类只能使用public和缺省的包访问权限.
若非这两种编译出错:
Illegal modifier for the class Outer; only public, abstract & final are permitted
Tips:在创建一个内部类的时候除非你已经有了一个外部类对象,否则不可能生成
方法内部类对象,因为内部类对象会悄悄的链接到创建他的外部类的对象,没有外部类对象
自然也就不可能生成内部类对象了,不过还需注意的是内部类是一个在编译时的概念,一旦编译
通过,就会成为完全不同的两个类,也就是会出现Outer,class和Outer$Inner,class两个字节码
文件。
局部内部类
在方法中定义的内部类称为局部内部类.它与局部变量类似,因此局部内部类是不能有访问
修饰符的,因为它不是外部类成员,但是他可以访问当前方法中的代码块的常量,和外部类的所有
成员.
内部类的继承问题有时候我们只是需要继承内部类,但是内部类的构造器又必须用到外部对象的引用
, 因此在继承一个内部类的时候就有点特别了,主要的问题在于外部类对象的引用必须
初始化,而在被继承类中并不存在,也就是单一继承内部类的时候,没有内部类与其外部类
的一种关联.
可以使用一下方式解决:
package com.kiritor;import com.kiritor.Outer.Inner;class Outer {public Outer() {System.out.print("Outer:");new Inner();}class Inner {public Inner() {System.out.println("Inner");}}}public class Inner2 extends Outer.Inner { Inner2(Outer outer) { outer.super(); //构造器只能是这种方式的 System.out.println("只能为此种构造器"); } public static void main(String[] args) {new Inner2(new Outer());}}输出结果为:Outer:Inner
Inner
只能为此种构造器
可以看出的是,Inner2只是集成了内部类,但是其缺省的构造器并不能用,而且仅仅传递一个外部类的引用还不够,还必须首先调用外部类的构造方法.这样才提供了内部类与外部类对象
的引用关联,才能够通过编译的.