李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
Java匿名内部类(一)
Leefs
2019-11-19 PM
5392℃
4条
# Java匿名内部类(一) ### 前言 今天小编又翻开珍藏已久的《Java编程思想》,想着在往后更新一节。 打开书看了一下标题:匿名内部类,看了十几分钟,又静静的把书原封不动的合上,咱们还是从最简单的开始吧,书上讲的就留给以后更新吧。。。。。。。 ### 一、什么是匿名内部类 匿名内部类我们可以在字面上将这个概念进行拆分成:**匿名**和**内部类** **匿名:很好理解,通俗的讲就是没有名字** **内部类:在一个类里面在定义一个类,里面的类就是内部类,外面的这个类可以叫做外部类** **匿名内部类:就是在一个类里面在定义一个没有名字的类** ### 二、匿名内部类的语法格式 本质:匿名内部类会隐式的继承一个类或者实现一个接口,或者说, 匿名内部类是一个继承了该类或者实现了该接口的子类匿名对象。 ```java new 类名/接口/抽象类(){ } ``` > 例如 ```java new Interface(){ } ``` ### 三、匿名内部类示例 **示例1:不使用匿名内部类来实现抽象方法** ```java abstract class Person { public abstract void eat(); } class Child extends Person { public void eat() { System.out.println("eat something"); } } public class Demo { public static void main(String[] args) { Person p = new Child(); p.eat(); } } ``` > 运行结果 ``` java eat something ``` 可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用 但是,如果此处的Child类只使用一次,那么将其编写为独立的一个类岂不是很麻烦? 这个时候就引入了匿名内部类 **示例2: 匿名内部类的基本实现** ```java abstract class Person { public abstract void eat(); } public class Demo { public static void main(String[] args) { Person p = new Person() { public void eat() { System.out.println("eat something"); } }; p.eat(); } } ``` > 运行结果 ```java eat something ``` 可以看到,我们直接将抽象类Person中的方法在大括号中实现了 这样便可以省略一个类的书写 并且,匿名内部类还能用于接口上 **示例3: 在接口上使用匿名内部类** ```java interface Person { public void eat(); } public class Demo { public static void main(String[] args) { Person p = new Person() { public void eat() { System.out.println("eat something"); } }; p.eat(); } } ``` > 运行结果 ```java eat something ``` 由上面的例子可以看出,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现 最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口 **示例4: Thread类的匿名内部类实现** ```java public class Demo { public static void main(String[] args) { Thread t = new Thread() { public void run() { for (int i = 1; i <= 5; i++) { System.out.print(i + " "); } } }; t.start(); } } ``` > 运行结果 ```java 1 2 3 4 5 ``` **示例5: Runnable接口的匿名内部类实现** ```java public class Demo { public static void main(String[] args) { Runnable r = new Runnable() { public void run() { for (int i = 1; i <= 5; i++) { System.out.print(i + " "); } } }; Thread t = new Thread(r); t.start(); } } ``` > 运行结果 ```java 1 2 3 4 5 ``` ### 四、匿名内部类的特点 1. 1.匿名内部类没有名称,无class关键字,且匿名内部类只能使用一次 2. 2.匿名内部类中不能存在任何的静态成员变量和静态方法 3. 3.因为没有名称,所以匿名内部类也没有构造函数 4. 4.匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法 5. 5.当所在的方法的形参需要被内部类里面使用时,该形参必须为final,为了拷贝引用避免引用值发生改变 *符:[参考文章1](https://blog.csdn.net/hellocsz/article/details/81974251),[参考文章2](https://blog.csdn.net/qq_33098039/article/details/78181287)*
标签:
Java
,
JavaSE
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/209.html
上一篇
Java中静态和非静态的区别
下一篇
Java匿名内部类(二)
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
JavaWeb
Python
查找
Azkaban
FileBeat
BurpSuite
ajax
Spark SQL
JavaScript
DataWarehouse
Jquery
Ubuntu
Kafka
Http
JVM
Zookeeper
SpringBoot
Scala
Jenkins
Spark
国产数据库改造
序列化和反序列化
Spark Core
HDFS
Stream流
MyBatis-Plus
Beego
递归
JavaWEB项目搭建
Elasticsearch
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭