这是我参与更文挑战的第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内部类的一些特点,如有不足或错误之处欢迎大家留言指正!