读书人

Thinking in Java以内部类

发布时间: 2013-04-05 10:24:33 作者: rapoo

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两个字节码

文件。

Thinking in Java以内部类

局部内部类

在方法中定义的内部类称为局部内部类.它与局部变量类似,因此局部内部类是不能有访问

修饰符的,因为它不是外部类成员,但是他可以访问当前方法中的代码块的常量,和外部类的所有

成员.

内部类的继承问题

有时候我们只是需要继承内部类,但是内部类的构造器又必须用到外部对象的引用

, 因此在继承一个内部类的时候就有点特别了,主要的问题在于外部类对象的引用必须

初始化,而在被继承类中并不存在,也就是单一继承内部类的时候,没有内部类与其外部类

的一种关联.

可以使用一下方式解决:

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只是集成了内部类,但是其缺省的构造器并不能用,而且仅仅传递一个

外部类的引用还不够,还必须首先调用外部类的构造方法.这样才提供了内部类与外部类对象

的引用关联,才能够通过编译的.


读书人网 >编程

热点推荐