所谓内部类就是在类的内部继续定义其他内部结构类。但是一点,他破坏了类的结构性,这种牺牲对于开发者有一定的帮助,可以轻松的访问外部类的私有属性。外部类也可以访问内部类的私有属性。
class Outer { // 外部类
private String msg = "Hello World !";
class Inner { // 定义一个内部类
public void print() {
System.out.println(msg);
}
}
public void fun() {
new Inner().print(); // 实例化内部类对象,并且调用print()方法
}
}
public class TestDemo {
public static void main(String args[]) {
Outer out = new Outer(); // 实例化外部类对象
out.fun(); // 调用外部类方法
}
}
在不破坏类的结构性的情况下,实现相同的功能。
class Outer { // 外部类
private String msg = "Hello World !" ;
public void fun() {
// this表示当前调用fun()方法的对象,在本程序中主方法由out对象调用,所以this就是out
new Inner(this).print() ; // 实例化内部类对象,并且调用print()方法
}
// 内部类需要访问msg属性,但是此属性属于Outer类,而在Outer类里面此属性使用private进行封装
// 所以如果此时要得到这个属性的内容,需要定义一个getter方法
public String getMsg() {
return this.msg ;
}
}
class Inner { // 定义一个内部类
private Outer out ; // 必须依靠对象才可以调用getMsg()方法
public Inner(Outer out) { // 在构造方法中接收外部类对象
this.out = out ;
}
public void print() { // 利用Outer类对象调用方法
System.out.println(this.out.getMsg()) ;
}
}
public class TestDemo {
public static void main(String args[]) {
Outer out = new Outer() ; // 实例化外部类对象
out.fun() ; // 调用外部类方法
}
}
显然比使用内部类要复杂。内部类的实例化格式
外部类.内部类 对象 = new 外部类().new 内部类();
Outer.Inner in = new Outer().new Inner();
- 定义私有内部类:如果将内部类定义为私有类,该类只能在外部类内部使用,这个内部类只为一个类服务。
- 使用static定义内部类:如果内部类使用static定义,他的属性方法不在受类实例化对象的控制,相当于变为外部类,并且只能访问外部类的static成员。实例化格式与不用static定义的内部类有所区别。
外部类.内部类 对象 = new 外部类.内部类();
Outer.Inner in = new Outer.Inner();
用static定义的内部类相当于一个外部类,在实例化时,不再需要先实例化外部类再实例化内部类所以使用外部类.内部类
的形式。
- 在方法中定义内部类:在jdk1.8之后在方法中定义类,内部类也可以访问方法的参数和变量。但是在jdk1.8之前,如果想要访问参数和变量,需要在参数和变量之前加上final关键字
class Outer { // 外部类
private String msg = "Hello World !" ;
public void fun(final int num) { // 外部类普通方法
final double score = 99.9 ; // 方法变量
class Inner { // 方法中定义的内部类
public void print() {
System.out.println("属性:" + Outer.this.msg) ;
System.out.println("方法参数:" + num) ;
System.out.println("方法变量:" + score) ;
}
}
new Inner().print() ; // 内部类实例化对象调用print()输出
}
}