1 内部类定义
简单的说,将一个类的定义放在另一个类的定义内部,这就是内部类,嵌套内部类的叫做外围类,下面的代码片段定义了一个内部类:
public class Outer {
/**
* 内部类
*/
class Inner {
private int j;
public int get() {
return this.j;
}
}
/**
* 外部类方法
*/
public void operation() {
Inner in = new Inner();
System.out.println(in.get());
}
/**
* 获取内部类
* @return
*/
public Inner getInner(){
return new Inner();
}
public static void main(String[] args) {
Outer out = new Outer();
out.operation();
}
}
在外围类的方法中,我们可以像调用普通类那样去调用内部类,而在内部类中,我们可以调用外部类中的属性和方法(包括私有属性和私有方法),就像调用类本身的属性和方法,如果要在外部类之外的方法中创建内部类对象,则需要使用下面的方法:
Outer out = new Outer();
Outer.Inner in = out.getInner();
当然也可以使用下下面的方法实例化内部类:
Outer out = new Outer();
Outer.Inner in = out.new Inner();
如果内部类有与外部类同名的域或者方法,可以用外部类名.this来访问外部成员,例如下面这个例子:
class A {
private int s = 10;
public class B {
private int s = 20;
public void mb(int s) {
System.out.println(s);//30
System.out.println(this.s);//20
System.out.println(A.this.s);//10
}
}
}
public class TestInner {
public static void main(String[] args) {
A a = new A();
A.B b = a.new B();
b.mb(30);
}
}
内部类与类中的域、方法一样是外部类的成员,它的前面有访问修饰符和其它修饰符。内部类可用的修饰符比外部类的修饰符更多,外部类的修饰符包括public和默认的包访问权限,而内部类除了能使用外部类的修饰符之外,还能使用诸如protected、private和static等修饰符。
内部类在使用static修饰符时需要遵循以下规则:
- 实例化static内部类时,在new前面不需要使用外围类对象变量;
- static内部类中不能访问其外部类的非static的域及方法,既只能够访问static成员;
- static方法中不能访问非static的域及方法,也不能够不带前缀地new一个非static的内部类