内部类的含义

在Java编程语言里,程序是由类(class)构建而成的。在一个类的内部也可以声明类,我们把这样的类叫做内部类。

作用

  • 实现了更好的封装,我们知道,普通类(非内部类)的访问修饰符不能为private或protected,而内部类可以。当我们将内部类声明为private时,只有外部类可以访问内部类,很好地隐藏了内部类。
  • 内部类可以继承(extends)或实现(implements)其他的类或接口,而不受外部类的影响。
  • 内部类可以直接访问外部类的字段和方法,即使是用private修饰的,相反的,外部类不能直接访问内部类的成员。
  • 内部类在编译后也会生成一个class文件,文件名为:外部类名$内部类名.class

分类

Java内部类可分为成员内部类、局部内部类、匿名内部类、静态内部类。

成员内部类

定义在外部类的成员(属性、方法)位置
可以使用四种访问权限修饰符修饰内部类
可以在内部类的内部定义属性和方法
注意:内部类不允许有静态成员

成员内部类的访问权限

成员内部类前可加上四种访问修饰符。
private:仅外部类可访问。
protected:同包下或继承类可访问。
default:同包下可访问。
public:所有类可访问。

成员内部类例子

成员内部类无条件访问外部类的属性和方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class A {
//创建外部类
private String name="外部类";
public class Z {
//创建内部类
private void print(){
System.out.println(name);
}

}
public static void main(String[] args) {
A a = new A();
//实例化外部类
A.Z z = a.new Z();
//通过外部类创建内部类
z.print();
//内部类调用外部类的私有属性

}
}
外部类访问内部类属性和方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class A {
private class Z{
String name="星猫";
private void say(){
System.out.println("喵喵喵");
}
}
public void cat(){
Z z=new Z();
System.out.println(z.name);
z.say();
}

public static void main(String[] args) {
A a=new A();
a.cat();
}
}
外部类属性或方法隐藏
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class C{
private String name = "外部类";
public void run(){
System.out.println("外部类奔跑");
}
/*使用内部类的属性和方法*/
public void eat(){
D d = new D();
System.out.println(d.value);
d.say();
}
class D{
private String value = "DDD";
private String name = "内部类";
public void say(){
System.out.println(C.this.name);
System.out.println(name);
run();
}
}
}
匿名内部类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class test {
public static void say(Stu stu) {
stu.say();

}
public static void main(String[] args) {
say(new Stu() {
@Override
public void say() {
System.out.println("老师好");
}
});
}
}
interface Stu {
public void say();
}

注意事项:匿名内部类没有构造方法。也是唯一没有构造方法的内部类。匿名内部类和局部内部类只能访问外部类的final变量。

内部类的好处

完善了Java多继承机制,由于每一个内部类都可以独立的继承接口或类,所以无论外部类是否继承或实现了某个类或接口,对于内部类没有影响。
方便写事件驱动程序。

总结

静态内部类对象的创建一般是外部类.内部类 类名 = new 外部类.内部类();
成员内部类对象的创建一般是外部类.内部类 类名 = 外部类对象名.new 内部类();