Javase学习09-匿名内部类
Posted TSCCG
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javase学习09-匿名内部类相关的知识,希望对你有一定的参考价值。
1. 什么是匿名内部类?
1.1 定义
匿名内部类就是没有名称的内部类
1.2 说明
1.3 前提
-
必须是类或者接口
-
格式:
//相当于是一个子类实现类或接口的实现类 new 类名/接口名(){ 重写抽象方法 }
2. 使用方式
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(); }
第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();
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(); }
以上是关于Javase学习09-匿名内部类的主要内容,如果未能解决你的问题,请参考以下文章
JavaSE-22.1.7Lambda表达式和匿名内部类的区别
JavaSE基础(十 三 )---<内部类>成员内部类,静态内部类,局部内部类,匿名内部类,内部类的意义