Java 内部类
Java 内部类是一种特殊的类,它在一个类的内部定义,可以直接访问这个类的成员,包括私有成员。
内部类的包括:
- 成员内部类
- 成员内部类可以无限制访问外部类的所有成员属性。
- 外部类想要访问内部类的成员,必须先创建一个成员内部类的对象
- 局部内部类
- 定义在一个方法或者一个作用域里面的类,所以局部内部类的生命周期仅限于作用域内。
- 局部内部类就好像一个局部变量一样,它是不能被权限修饰符修饰的,比如说 public、protected、private 和 static 等。
- 局部内部类需要继承外部方法类
- 匿名内部类
- 匿名内部类是我们平常用得最多的,尤其是启动多线程的时候,会经常用到,并且 IDE 也会帮我们自动生成。
- 匿名内部类就好像一个方法的参数一样,用完就没了,以至于我们都不需要为它专门写一个构造方法,它的名字也是由系统自动命名的。
- 匿名内部类是唯一一种没有构造方法的类。
- 匿名内部类的作用主要是用来继承其他类或者实现接口,并不需要增加额外的方法,方便对继承的方法进行实现或者重写。
- 静态内部类
- 静态内部类和成员内部类类似,只是多了一个 static 关键字。
- 由于 static 关键字的存在,静态内部类是不允许访问外部类中非 static 的变量和方法的
使用内部类的特性:
- 内部类可以使用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。
- 在单个外部类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。
- 创建内部类对象的时并不依赖于外部类对象的创建。
- 内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。
- 内部类提供了更好的封装,除了该外围类,其他类都不能访问。
内部类的优点:
- 内部类可以方便地定义私有成员,可以用于实现简单的封装。
- 内部类可以实现延迟初始化,可以减少代码的重复编写。
- 内部类可以实现代码的复用,可以用于解决单继承的限制。
内部类的缺点:
- 内部类可能会产生额外的开销,因为每个内部类都需要在编译时创建一个对象。
- 内部类可能会造成代码的可读性问题,因为内部类会破坏类的封装性,可能会引起代码复杂度增加。
以下示例:
在类 Person 中定义内部类 Friend
public class Person {
private String name;
private int age;
private Friend friend;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void setFriend(Friend friend) {
this.friend = friend;
}
public Friend getFriend() {
return friend;
}
public void printFriend() {
System.out.println(friend.getName());
}
}
class Friend {
private String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
在这个示例中,内部类 Friend 在 Person 类中定义,并实现了 getFriend() 方法,该方法返回 Person 类的成员变量 friend。