基础概念
使用要点
- 内部类是一种特殊的类,指定义在一个类内部的类
- 在实际开发中,为了便于使用外部类的属性和方法,这时我们通常会定义一个内部类。内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。但外部类不能访问内部类的内部属性
- 内部类提供了更好的封装。只能让外部类直接访问
分类
成员内部类
非静态内部类
- 非静态内部类不能有静态方法、静态的属性、静态初始化块
使用要点
- 内部类通过 外部类名.this.属性名,访问外部类的私有属性方法
非静态内部类的对象必须寄存在一个外部类对象里,创建过程是先创建外部类对象,然后使用外部类对象创建内部类对象,创建该对象语法结构为 外部类名.内部部类名 对象名称 = new 外部类名().new 内部部类名()
public class Outer1 {
private int age = 18;
public void show(){
System.out.println("外部类,age:"+age);
}
//内部类。定义在外部类Outer1里面
//非静态内部类不能有静态的方法、静态的属性、静态初始化块
class Inner1 {
private int id = 10001;
private int age = 28;
public void test1(){
System.out.println("Inner1.test1");
System.out.println("内部类的属性,age:"+this.age);
System.out.println("外部类的属性,age:"+Outer1.this.age);
//通过:外部类名.this.属性名,访问外部类的属性
Outer1.this.show();
}
}
}
静态内部类
定义方式
static class ClassName {
//类体
}
使用要点
适合那种只需要使用一次的类。比如键盘监听操作等,在安卓开发 awt swing GUI里开发中常见
例如基于某接口的实现类定义后直接使用一次(定义的位置就是使用的位置)
new 接口名(){
@Override
public void 方法名(){
//一次性方法体
}
}
```java public class TestAnonymousInnerClass {
public void test(A3 a){
System.out.println("TestAnonymousInnerClass.test");
a.run();
}
public static void main(String[] args) {
TestAnonymousInnerClass tc = new TestAnonymousInnerClass();
//匿名内部类只使用一次!!
tc.test(new A3() {
@Override
public void run() {
System.out.println("匿名内部类的run()");
}
});
tc.test(new A3() {
@Override
public void run() {
System.out.println("TestAnonymousInnerClass.run");
}
});
} }
interface A3 { void run(); }
局部内部类
- 局部内部类定义在方法内部,作用域只限于本方法
- 局部内部类在实际开发中很少使用