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嵌套类中访问外部类成员.doc
Java 深入理解嵌套类和内部类,让你对知识点有个全面深入的理解
java 嵌套接口 程序 学习java必须要学习的经典案例,加油学习把
主要介绍了Java嵌套类和内部类详解,本文讲解了什么是嵌套类及内部类、静态嵌套类、在外部类中定义内部类、在方法中定义内部类、匿名内部类等内容,需要的朋友可以参考下
主要介绍了java 嵌套类的详解及实例代码的相关资料,需要的朋友可以参考下
19.java嵌套的try…catch语句.zip19.java嵌套的try…catch语句.zip19.java嵌套的try…catch语句.zip19.java嵌套的try…catch语句.zip19.java嵌套的try…catch语句.zip19.java嵌套的try…catch语句.zip19.java嵌套的...
java静态内部类(嵌套类)的实例 。嵌套类意味着: 1. 要创建嵌套类的对象,并不需要其外围类的对象。 2. 不能从嵌套类的对象中访问非静态的外围类对象。
本Java精华内容深入Java API、嵌套类和内部类、与时间有关的类Date,DateFormat,Calendar、文件与流、Java变量类型间的相互转换、Java与Web、用连接池提高Servlet访问数据库的效率、Java扩展、应用服务器的集群策略及...
这是一个关于Java的for语句嵌套练习,可以打印出各种星型,供大家学习,很有意思哦~~
java try…catch嵌套捕获异常的实例 java try…catch嵌套捕获异常的实例
主要介绍了详解Java 中的嵌套类与内部类的相关资料,希望通过本文大家能掌握Java 嵌套类与内部类的使用方法,需要的朋友可以参考下
1.Nested Class(嵌套类) 1.1.Nested class 1.2.Nested class的分类 1.3.Nested class的使用原因 2.Static Nested Classes 2.1.static nested class访问enclosing class(outer class)的成员 2.2.enclosing...
多层嵌套循环 参数转换 数据库配置报文父子级结构 java实现
java freemark list嵌套导出word
http://blog.csdn.net/u011001084/article/details/54090425 资源类
嵌套浏览器,火狐内核,java实现,展示效果非常漂亮。程序需要maven下载必要包,如果下载不下来,可以配置阿里代码库或代码中国代码库进行尝试
net.sf.json.JSONObject ==> Java对象
主要介绍了 java开发中嵌套类的详解及实例的相关资料,一般把定义内部类的外围类成为包装类(enclosing class)或者外部类,需要的朋友可以参考下