内部类与匿名类
在类的内部中定义的类,称为内部类,例如,在 A中定义了一个类 B,类B就是 A 的内部类。
内部类可以直接访问外部类的成员,包括私有。外部类要访问内部类的成员必须创建对象。内部类相当于外部类的一个成员。
内部类的四种形式:
- 成员内部类; 在类体内定义的类, 其与成员变量一样,属于类的全局成员。
- 局部内部类: 在类的方法内定义的类,其与局部变量一样,属于类的局部成员。
- 静态内部类: 使用 static 关键字修饰的内部类, 其与静态成员变量一样,可以在类中直接引用。
- 匿名内部类: 没有名称的类, 称为匿名类,是一种特殊的内部类。 使用匿名内部类可以使代码更加简洁、紧凑,模块化程度更高。 算是一种常简化代码的应用。匿名内部类有两种实现方式:第一种, 继承一个类,重写其方法; 第二种,实现一个接口(可以使多个),实现其方法。
匿名类的特点
匿名内与其他类不同就在于匿名,也就是没有名称。 Java中允许创建子类对象时,除了使用父类的构造方法外,还可以使用类体,匿名类就是一个没有类声明的类体,因为没有名称,所以匿名类不可以声明对象,但可以创建对象。
匿名类的特点:
- 匿名类是一个子类,可以继承父类的方法也可以重写父类的方法。
- 匿名类可以访问外嵌类中的成员变量和方法,但在匿名类中不能声明静态变量和静态方法。
- 使用匿名类时,必须在某个类中直接使用匿名类创建对象。
- 使用匿名类创建对象时,要直接使用父类的构造方法。
- 匿名类主要用来创建接口的唯一实现类,或者创建某个类的唯一子类。
创建匿名类的格式: new< 类名 > {匿名类的类体}
public class Demo1{ //主类
public static void main(String[] args) {
Demo1 nm = new Demo1();
nm.show();
}
private void show() { //在这个方法中构造了一个匿名内部类, 即类Demo1中又定义了一个类
Out out1 = new Out() {
void show() {
System.out.println("这是创建的匿名类。");
super.show();
}
};
out1.show();
}
class Out{
void show() {System.out.println("这是匿名类的父类。");}}
}
注意这段代码
Out out1 = new Out(){
void show() {
System.out.println("这是创建的匿名类。");
super.show();
}
};
这段是两个功能的组合,首先是类的建立(这个类没有名字)
Out(){
void show(){
System.out.println("这是创建的匿名类");
super.show();
}
};
因为匿名类没有名字,所以extends , implement这些也就不需要了。
第二部分是 实例对象的创建,实例对象是匿名类的对象。
Out out1 = new Out() {},
中括号之间就是刚才类名的定义, 发现问题了吗? out1 指定了匿名类的父类,但是用匿名类来实例化,这其实是一个向上转型的例子,这就是匿名类的好处,对于向上转型的例子,如果某些子类的存在是一次性的,即只是为了向上转型而用,这时候使用匿名类可以使代码更简洁。