Java——匿名类详解

3,026 阅读3分钟

这是我参与更文挑战的第7天,活动详情查看: 更文挑战

还是老样子,在学习之前我们先要提出三个问题:

什么是匿名类?

匿名类用来做什么?

匿名类如何创建并使用?

首先我们来回答第一个问题:什么是匿名类?

匿名类的定义

创建子类对象时,除了使用父类的构造方法外还有类体,此类体被认为是一个子类去掉类声
明后的类体,称为匿名类。

知道了什么是匿名类,那匿名类是用来做什么的呢?也就是我们的第二个问题,下面我们来看匿名类的作用。

匿名类的作用

假如没有显式地声明一个类的子类,而又想用子类来创建一个对象。
匿名类适合创建那种只需要一次使用的类。

那么该如何创建一个匿名类呢?来到我们的第三个问题。

匿名类的创建及使用

在创建匿名类之前我们先来了解匿名类的几个规则

1.匿名类必须继承一个父类或实现一个接口,并且最多继承一个父类或实现一个接口。
2.匿名类不能是抽象类。因为抽象类不能用new来创建对象,而匿名类创建时就会立即创建
对象。
3.匿名类不能有构造器。因为匿名类没有类名。

匿名类怎么创造呢?格式如下:

new 父类名|接口名(){
    匿名类的类体;
}

是不是很简单?但要记住,匿名类有以下特点:

1.匿名类可以继承父类的方法,也可以重写父类的方法。
//这在我们用集合的Collections排序时经常用到,重写排序的方法。
2.匿名类一定是内部类。
3.匿名类可以访问外部类的成员变量和方法,匿名类的类体中不可以声明static成员变量
和方法。
//这是因为匿名类在创建时会立即创建匿名类的实例,创建结束后,这个类的定义立即消失,匿名类只能使用一次。
4.匿名类不能有构造器,所以匿名类创建对象时,使用的是父类的构造方法。

需要注意的是:虽然匿名类没有经过类声明步骤,但匿名类的对象的引用可以传给一个匹配的参数。

下面我们通过具体例子来体会匿名类的特点。

package cn.prg.testDemo;

public class Test {
	private int num;
	public void Show(A a){
		a.Print();
	}
	public int getNum(){
		return num;
	}
	public void setNum(int n){
		num=n;
	}
	public static void main(String[] args) {
		Test test = new Test();
		int n;
		//创建匿名类,匿名类作为方法的参数
		test.Show(new A(){
			//匿名类不能有构造器,因为没有类名
			public void Print(){//重写了父类的方法。
				System.out.println("我是匿名类");
				//匿名类可以访问外部类的成员变量和方法
				test.num=10;
				System.out.println(test.getNum());
				test.setNum(100);
			}
		});
		System.out.println(test.getNum());
	}
}
class A{
	public void Print(){
		System.out.println("我是匿名类的父类!");
	}
}

以上就是java内部类的一些特点,如有不足或错误之处欢迎大家留言指正!