JAVA学习笔记--匿名内部类
匿名内部类,即没有名字的内部类。
我们在编写JAVA程序时,往往要创建很多类,类是可以被重复使用的。但有时,我们创建了一个类,却只需要使用该类一次,那么单独为其编写一个类就显得有些麻烦,这时可以使用匿名内部类来编写这个类,匿名内部类只能使用一次。
· 匿名内部类没有名字,因而没有构造器;
· 使用匿名内部类有个前提条件:必须继承一个父类或实现一个接口。
匿名内部类可以通过以下语句来创建:
new InterfaceName(){......};
或 new SuperClassName(){......};
{}中是匿名内部类的具体实现。
下面用几个例子来展示一下匿名内部类的使用
1)没有使用匿名内部类的普通方式:
package com.tongye.anonymous; abstract class BaseClass{
abstract public void printMessage();
} class TestClass extends BaseClass {
public void printMessage(){
System.out.println("匿名内部类测试");
}
} public class AnonymousClass {
public static void main(String[] args){
TestClass testClass = new TestClass();
testClass.printMessage();
}
} /* output:
匿名内部类测试
*/
本例没有使用匿名内部类,创建一个新的类继承了抽象类,并实现了抽象类的方法。显然,这个新类可以被重复调用,也可以被继承。
2)使用匿名内部类方式1
package com.tongye.anonymous; abstract class BaseClass{
abstract public void printMessage();
} public class AnonymousClass {
public static void main(String[] args){
BaseClass testClass = new BaseClass(){
public void printMessage(){
System.out.println("匿名内部类测试");
}
};
testClass.printMessage();
}
}
/* output:
匿名内部类测试
*/
这个例子看上去好像是通过 new 操作符创建了一个抽象类的实例。但我们知道,抽象类是不能通过new操作符来创建实例的,这其实是一个假象,而且和普通的类的实例化写法也不一样,后面有 {} 。这里其实是创建了一个匿名内部类,{}里面的部分就是匿名内部类的实现细节。这个匿名类继承了抽象类BaseClass,它实现了BaseClass抽象类的抽象方法,当然,还可以往里面添加自己的方法体。
3)使用匿名内部类方式2
package com.tongye.anonymous; abstract class BaseClass{
abstract public void printMessage();
} public class AnonymousClass {
public BaseClass testClass(){ // 创建一个BaseClass类型的方法testClass(),其返回值类型是BaseClass类型
return new BaseClass(){ // 创建一个继承自BaseClass的匿名类的对象
public void printMessage(){
System.out.println("匿名内部类测试");
}
};
} public static void main(String[] args){
AnonymousClass anonymous = new AnonymousClass();
anonymous.testClass().printMessage();
}
}
/* output:
匿名内部类测试
*/
这个例子也用到了匿名内部类,只是这里的实现方式与2)中的有些不一样。在本例中,先创建了一个BaseClass类型的方法testClass(),然后,方法 testClass()使用匿名内部类返回了一个实现了接口BaseClass的类的对象。匿名类的具体实现仍然是在{}中。
4)使用匿名内部类继承一个具有带参构造器的父类
package com.tongye.anonymous; class BaseClass{
private int x; public BaseClass(int i){
x = i;
} public void getx(){
System.out.println(x);
}
} public class AnonymousClass {
public BaseClass baseClass(int x){ // 创建一个BaseClass类型的方法baseClass(),其返回值类型是BaseClass类型
return new BaseClass(x){ // 创建一个继承自BaseClass的匿名类的对象
public void getx(){
System.out.println("匿名类测试");
super.getx();
}
};
} public static void main(String[] args){
AnonymousClass anonymous = new AnonymousClass();
BaseClass baseClass = anonymous.baseClass(10);
baseClass.getx();
}
}
/* output:
匿名内部类测试
10
*/
如果一个匿名内部类继承了一个只含有带参构造函数的父类,则创建它的时候,必须带上这些参数,并且在实现的过程中使用super关键字调用相应的内容。尽管这里的BaseClass类是一个有具体实现的普通类,但是它还是被其导出类当做公共“接口”来使用。
如果想要在匿名内部类使用一个在其外部定义的对象,则必须保证其参数是final的。
匿名内部类与继承有些相似,但相对普通的继承而言,又有些限制。匿名内部类既可以扩展类,又可以实现接口,但是不能两者兼备;而且如果实现接口,也只能实现一个接口。
JAVA学习笔记--匿名内部类的更多相关文章
- 【Java学习笔记之二十六】深入理解Java匿名内部类
在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- java学习笔记9--内部类总结
java学习笔记系列: java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对 ...
- Java学习笔记之---内部类
Java学习笔记之---内部类 (一)成员内部类 内部类在外部使用时,无法直接实例化,需要借助外部类信息才能实例化 内部类的访问修饰符可以任意,但是访问范围会受到影响 内部类可以直接访问外部类的成员, ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
- Java学习笔记(04)
Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
随机推荐
- ubuntu配置telnet服务
1.安装xinetd 以及telnetd #:~$ sudo apt-get install xinetd telnetd 2.配置文件(若文件不存在就手动添加文件和相应配置信息) 1): #:~$ ...
- Gradle Goodness: Group Similar Tasks
In Gradle we can assign a task to a group. Gradle uses the group for example in the output of $ grad ...
- 求1!+2!+3!+4!+5!+6!+7!+8!+9!+10!+...+N! N阶阶乘求和算法 JAVA C Python
一行代码算出1!+2!+3!+4!+5!+6!+7!+8!+9!+10!+...+N! N阶阶乘求和 时间复杂度为O(n) 空间复杂度为O(1) 对于任意正整数N 求1!-N!一行算出和给定求1 ...
- [原创]HBase学习笔记(2)- 基本操作
1.使用hbase shell连接hbase 2.输入help可以查看帮助 3.输入list查看当前hbase中的所有表 4.使用create创建表test 其中test是表名,cf是列族.该表只创建 ...
- Web—10-前端性能优化
前端性能优化 从用户访问资源到资源完整的展现在用户面前的过程中,通过技术手段和优化策略,缩短每个步骤的处理时间从而提升整个资源的访问和呈现速度.网站的性能直接会影响到用户的数量,所有前端性能优化很重要 ...
- ubuntu SDL2 安装时依赖文件导致安装失败
今天打算学习littlev GUI,使用Ubuntu来实现仿真,然后在安装SDL2的时候,始终因为依赖关系导致安装失败,我尝试手动去安装那些有依赖关系的包发现根本不可行,然后我百度上也没有找到合适的法 ...
- Tomcat 或JBOSS java.lang.ArrayIndexOutOfBoundsException: 8192原因及其解决方法
2018-04-02 09:24:55 org.apache.catalina.connector.CoyoteAdapter service 严重: An exception or error oc ...
- 前端应该掌握的ps知识
你说有美图秀秀之后PS要over了,NO PS 依旧很重要,当然除了修人像,比如切图什么的 来吧 开始吧 在开始切图之前,先科普几个小技巧 1. 如果快速从大图中拿出自己想要的小图 : 需求:快速拿出 ...
- thinphp5-image图片处理类库压缩图片
使用tp5的thinkphp-image类库处理图片 使用方法手册都有,为了增加印象我自己记录一下 手册:https://www.kancloud.cn/manual/thinkphp5/177530 ...
- vue-nuxt.js部署到宝塔主机服务器
废话不多说,直接上步骤,如下: 本文章为在 vue环境下使用了nuxt.js 1.搭建环境--由于本人安装的是宝塔主机,因此如下: 由于我直接使用的是宝塔主机,直接去“软件管理”安装 PM2管理器. ...