java_内部类、匿名内部类的使用
时间:2022-07-23
本文章向大家介绍java_内部类、匿名内部类的使用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
内部类
将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。
内部类的分类
- 成员内部类,类定义在了成员位置 (类中方法外称为成员位置)
- 局部内部类,类定义在方法内
成员内部类 :定义在类中方法外的类。
class 外部类{
// 成员变量
// 成员方法
class 内部类{
// 成员变量
// 成员方法
}
}
内部类可以直接访问外部类的成员,包括私有成员
创建内部类对象格式:
外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和符号 。
比如,AxxBxx.class
局部内部类 :定义在方法中的类
class 外部类名 {
数据类型 变量名;
修饰符 返回值类型 方法名(参数列表) {
// …
class 内部类 {
// 成员变量
// 成员方法
}
}
}
匿名内部类
匿名内部类 :是内部类的简化写法。它的本质是一个 带具体实现的父类或者父接口的匿名的子类对象
匿名内部类必须继承一个父类或者实现一个父接口。
格式:
new 父类名或者接口名(){
// 方法重写
@Override
public void method() {
// 执行语句
}
};
以接口为例,匿名内部类的使用,代码如下:
public class Demo1 {
public static void main(String[] args) {
new Swim(){
@Override
public void swiming() {
System.out.println("蛙泳....");
}
}.swiming(); //蛙泳....
//返回一个实现了swim接口的子类对象,只不过该对象是匿名的
Swim swim = new Swim() {
@Override
public void swiming() {
System.out.println("仰泳...");
}
};
swim.swiming(); //仰泳...
}
}
//定义游泳接口
interface Swim{
void swiming();
}
//定义实现类,实现该接口
class Person implements Swim{
@Override
public void swiming() {
System.out.println("蛙泳.....");
}
}
匿名内部类的本质
- 定义一个没有名字的内部类
- 这个类实现了Swim接口
- 创建了这个没有名字的类的对象
匿名内部类的使用场景
通常在方法的形式参数是接口或者抽象类时,也可以将匿名内部类作为参数传递。
public class Demo1 {
public static void main(String[] args) {
// 普通方法
Student s1 = new Student();
swim(s1);
// 使用匿名内部类方式,创建了一个匿名的类,该类实现了Swim接口
swim(new Swim() {
@Override
public void swiming() {
System.out.println("狗刨式游泳....");
}
});
swim(new Swim() {
@Override
public void swiming() {
System.out.println("蛙泳....");
}
});
}
// 模拟,请一些人去游泳
public static void swim(Swim s) {
s.swiming();
}
}
// 定义游泳接口
interface Swim {
void swiming();
}
// 定义实现类,实现该接口
class Student implements Swim {
@Override
public void swiming() {
System.out.println("狗刨式游泳.....");
}
}
- 【Python3-API】情感倾向分析示例代码
- SpringMVC+Hibernate +MySql+ EasyUI实现CRUD(一)
- 【Python3-API】通用文字识别示例代码
- Python入门教程之安装MyEclipse插件和安装Python环境
- AutoFlowLayout-多功能流式布局与网格布局控件
- RBAC新解:基于资源的权限管理(Resource-Based Access Control)
- 基于开源项目搭建属于自己的技术堆栈
- Redis整合Spring项目搭建实例
- SpringMVC+Hibernate +MySql+ EasyUI实现POI导出Excel(二)
- Nginx+Tomcat+Redis负载均衡Session共享实现超级简单(CentOS6.9系统 Java版本)
- Apache Ignite——新一代数据库缓存系统
- 微信JSSDK接入Java版--步骤及问题处理和解决
- 微信企业号回调模式配置讲解 Java Servlet+Struts2版本 echostr校验失败解决
- Android Material Design系列之RecyclerView和CardView
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- RabbitMQ六种工作模式
- Java生成随机姓名、性别和年龄
- 商业数据分析从入门到入职(8)Python模块、文件IO和面向对象
- 7.13论坛常见问题以及解决办法
- 移植SDL到JZ2440显示BMP图片
- Vue图片验证码-自定义组件高级版
- Angular页面调试一个有用的小技巧 - normalizeDebugBindingName和normalizeDebugBindingValue
- 19个JS超有用的简写技巧
- 【教程】移植web server到Ubuntu就是这么简单!
- 为什么采用Proxy重构响应系统 | Vue3源码系列
- 制作Linux嵌入式系统开机LOGO(图片)
- R语言奇淫巧技之pdftools包
- 14个Spring MVC超实用技巧!
- 想要成为前端Star 吗?一首歌时间将React / Vue 应用Docker 化
- 初识Pandas