- 内部类
内部类是指在一个外部类的内部再定义一个类。
- 使用场景
在J2EE编程中使用较少,不过在窗口应用编程中特别常见,主要用来事件的处理。java通过内部类加上接口,可以很好的实现多继承的效果。
做GUI(图形用户界面)开发时候,事件的响应处理全靠内部类了。
- 特点
可以是静态static的,也可用public,default,protected和private修饰。编译完成后出现outer.class和outer$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。必须使用外部类对象来创建内部类对象,而不是直接去new一个。
- 分类:成员内部类、局部内部类、静态内部类、匿名内部类
- 成员内部类
- 内部类作为外部类的一个成员存在,与外部类的属性、方法并列。可访问外部类的全部域和方法。包括私有域。(访问控制与命名控制)访问外部类的同名成员变量,外部类名.this.变量名。不同名,直接访问。
- 外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。
- 成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的。
- 基于安全考虑,内部类最好声明为private,由其所在外部类生成对象。
public class Outer {
private int salary;
private int age;
public static void main(String[] args) {
// 创建一个内部类对象
Outer outer = new Outer();
Inner in = outer.new Inner();
in.countSalary();
}
private class Inner {
private int age = 5;
private void countSalary() {
int s = salary;
int oua = Outer.this.age; // 内外有同名成员,使用外部类.this.成员名访问外部成员
int ina = this.age;// 访问内部类自己的成员
System.out.println(ina);
}
}
}
- 局部内部类
在方法中定义的内部类。与局部变量类似。如if(){}语句块里可以使用。只在该方法或条件的作用域内才能使用。使用场景:如果只在某个方法内创建对象时使用,则可以用局部内部类。不仅可以访问外部类的域和方法,还能访问外部类这个方法声明为final的局部变量
public void part() {
class PDestination implements Serializable {
private String label;
private PDestination(String whereTo) {
label = whereTo;
}
public String readLabel() {
return label;
}
}
PDestination d = new PDestination("");
}
- 静态内部类
(场景:取消对外部类中的引用,此内部类无须引用其它对象时使用。)静态方法中只能用静态内部类。
静态内部类中可以定义静态和非静态的成员。不需要内部类对象和外部类对象之间的联系,就是说我们可以直接引用outer.inner,即不需要创建外部类,也不需要创建内部类。不能声明为private,一般声明为public,方便调用。
- 匿名内部类
为了免去给内部类命名,便倾向于使用匿名内部类。没有构造器。匿名内部类是不能加访问修饰符的。要注意的是,new 匿名类,这个类是要先定义的当所在的方法的形参需要被内部类里面使用时,该形参必须为final。
参考:http://lavasoft.blog.51cto.com/62575/179484。
http://www.cnblogs.com/silence250627170/archive/2011/11/29/thinkinginjava.html 其实参考了很多文章,真的是很多,就不一一列了,只列得这两篇觉得最合适的。