Javase学习09-匿名内部类
Javase学习09-匿名内部类
1. 什么是匿名内部类?
1.1 定义
匿名内部类就是没有名称的内部类
1.2 说明
在某一个类或者接口只有一个抽象方法时,如果我们不想去搞它的子类或者实现类 ,那么我们可以使用匿名内部类来实现它。
1.3 前提
-
必须是类或者接口
-
格式:
//相当于是一个子类实现类或接口的实现类 new 类名/接口名(){ 重写抽象方法 }
2. 使用方式
2.1 使用传统方式调用抽象类方法
public class Demo01 {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat();
}
}
abstract class Animals {
abstract void eat();
}
class Dog extends Animals{
@Override
void eat() {
System.out.println("狗吃肉");
}
}
结果:
狗吃肉
可见,该Animals抽象类只有一个抽象方法,并且只需要调用一次。如此写一个Dog实现类太麻烦且无意义。
这时,我们就可以使用匿名内部类来调用抽象类中的方法。
2.2 使用匿名内部类调用抽象类方法
public class Demo01 {
public static void main(String[] args) {
// 整体相当于Animals的子类对象
new Animals() {
@Override
void eat() {
System.out.println("狗吃肉");
}
};
//
}
}
abstract class Animals {
abstract void eat();
}
使用匿名内部类来调用父类eat()方法有两种方式:
第1种:
new Animals() {
@Override
void eat() {
System.out.println("狗吃肉");
}
}.eat();
第2种:
//前面说过,该整体相当于是Animals抽象类的子类对象,父类调用子类对象,这就是多态的体现形式。
Animals a = new Animals() {
@Override
void eat() {
System.out.println("狗吃肉");
}
};
a.eat();
通过匿名内部类访问局部变量时,在JDK1.8版本之前必须要在局部变量前加final关键字,在该版本之后会自动添加,虽然不显示,但实际存在,无法对菊部变量重新赋值
String type = "二哈";
Animals a = new Animals() {
@Override
void eat() {
System.out.println( type + "在吃肉");
}
};
a.eat();
2.3 使用匿名内部类调用接口方法
public class Demo02{
public static void main(String[] args) {
new Inter(){
@Override
public void method() {
System.out.println("method!!!");
}
}.method();
}
}
interface Inter{
void method();
}
2.4 匿名内部类的作用
作为方法参数的时候进行传递:
当一个方法需要调用接口中的方法时,需要传入一个接口的实现类。
按传统的方法需要写一个接口的实现类重写接口中的抽象方法,然后new一个实现类对象传入到方法中
/**
* @author: TSCCG
* @date: 2021/5/19
*/
public class Demo02{
public static void main(String[] args) {
Son son = new Son();
function(son);
}
//function方法需要一个接口的实现类 Inter inter = new Inter();
public static void function(Inter inter) {
inter.method();
}
}
class Son implements Inter {
@Override
public void method() {
System.out.println("method!!!");
}
}
interface Inter{
void method();
}
这在接口中只有一个方法且只调用一次时过于麻烦,使用匿名内部类即可代替实现类
/**
* @author: TSCCG
* @date: 2021/5/19
*/
public class Demo02{
public static void main(String[] args) {
function(
//匿名内部类相当于传递了一个实现类到function里
new Inter() {
@Override
public void method() {
System.out.println("method!!!");
}
}
);
}
//function方法需要一个接口的实现类 Inter inter = new Inter();
public static void function(Inter inter) {
inter.method();
}
}
interface Inter{
void method();
}