Java 嵌套类
来源:互联网 发布:北大青鸟java好吗 编辑:程序博客网 时间:2024/04/30 02:59
Java 嵌套类其实平时很少用,常见的是在多线程和事件处理(例如 Swing,xml 解析)时才需要用到。这里总结一下嵌套类的一些特性。
嵌套类的定义
- 在一个类中定义的类,就称为嵌套类 (nested class)。嵌套类分为两大类,静态嵌套类 (static nested class) 和非静态嵌套类 (non-static nested class),非静态嵌套类也叫内部类 (inner class)。
- 定义嵌套类时可以使用任意访问修饰符 (private, protected, public, 默认),不同于普通类只能使用 public 或者默认。
使用嵌套类的原因
- 嵌套类可作为一种类的逻辑分组方式。例如类 B 只对类 A 有用,那么将 B 作为 A 的内部类更合适。
- 更好的封装。例如上述类 A 和 B,如果 B 是内部类,就可以直接访问 A 的成员。
- 能使代码的可读性和可维护性更好。
静态嵌套类
- 静态嵌套类实际上跟一个普通的类一样,只是因为有利于类的逻辑分组而使用。
内部类
- 内部类跟类的成员相似,可以访问其它类成员(变量或方法)。一个内部类的实例必须存在其外部类的一个实例中。内部类不能有静态成员(静态成员只能在顶级类或静态嵌套类中声明)。
- 内部类出现跟外部类成员变量同名的变量时,默认访问内部类成员,但可以用 "外部类名.this.变量名" 来访问同名的外部类成员。
- 在方法内定义的类称为本地内部类 (local inner class)。如果这个类是一个子类(继承了父类或者实现了接口),它可以没有类名,这样的类称为匿名内部类或匿名类 (anonymous [inner] class)。
Outer outer = new Outer();
Inner inner = outer.new Inner(); // 内部类的实例化
匿名类
- 匿名类不能定义构造方法(因为它没有类名),但可以使用初始化块 (initialization block) 进行初始化。如果它继承自某个类,则新建实例时可以调用父类的构造方法(但不能重写)。
- 匿名类使用其包围方法的局部变量时,这个变量必须声明为final(使用其外部类的成员时则没有这个限制)。
// 匿名类例子
public class AnonymousClassTest {
private String str = "outer str";
public static void main(String[] args) {
Base base = new AnonymousClassTest().getBase();
base.print();
}
public Base getBase() {
return new Base(5) { // 匿名类,调用父类的构造函数
private String str = "inner str"; // 跟外部类成员变量同名
{
i = 10; // 可以在初始化块中进行必要的初始化
}
public void print() {
System.out.println("Anonymous print(), i = " + i +
", str = " + AnonymousClassTest.this.str); // 访问同名的外部类成员
}
};
}
}
abstract class Base {
protected int i;
public Base(int i) {
System.out.println("Base Constructor, i = " + i);
}
public abstract void print();
}
参考资源
http://download.oracle.com/javase/tutorial/java/javaOO/nested.html
http://www.java2s.com/Tutorial/Java/0100__Class-Definition/0201__Anonymous-inner-class.htm
- Java嵌套类
- Java 嵌套类
- JAVA嵌套类用法
- Java 嵌套类
- Java嵌套类
- java 嵌套类
- Java中的嵌套类
- Java嵌套类
- Java嵌套类
- java中的嵌套类
- java-嵌套类
- java基础-嵌套类
- Java中的嵌套类
- Java进阶---嵌套类
- java中的嵌套类
- java嵌套类
- Java支持哪些嵌套类?
- java 嵌套类 访问方法
- 各种排序算法的稳定性和时间复杂度小结
- 分享一道Kingsoft的笔试题——Kingsoft笔试归来(应聘职位:服务器端开发工程师)
- 用WPS2007制作版记与下划线
- __cdecl __stdcall __fastcall
- PL/SQL工具连接ORALCE数据库的方法
- Java 嵌套类
- 给DataList中列出的图片列表提供预览图片功能
- tonyja
- jquery 解析json
- jquery in array
- MySQL中遗忘root密码解决方法分享(转)
- 理解SQL_Server系统表sysobjects
- ExtJs Combobox 二级联动
- 一些比较重要的算法