文章目录

  • 内部类
    • 局部内部类
    • 匿名内部类
      • 匿名内部类介绍
      • 常见的使用形式
      • 开发中使用场景

内部类

局部内部类

局部内部类 (鸡肋语法,了解即可)

局部内部类, 在方法、代码块、构造器等执行体中创建一个类, 称为为局部内部类(但是我们一般都不会这样写)。

局部内部类的类文件名为: 外部类$N内部类.class。

基本演示代码:

package com.chenyq.d10_innerClass;public class Test {public static void main(String[] args) {// 在方法中创建一个类class Inner {private String name;public static int age;public Inner() {}public Inner(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}}// 使用局部内部类Inner inr = new Inner("chenyq");Inner.age = 22;System.out.println(inr.getName());System.out.println(Inner.age);}
}

匿名内部类

匿名内部类介绍

匿名内部类:

本质上是一个没有名字的局部内部类,定义在方法中、代码块中、等。

作用:方便创建子类对象,最终目的为了简化代码编写。

匿名内部类格式:

new 类|抽象类名|或者接口名() {重写方法;
};

匿名内部类演示代码:

Animal a = new Animal() {public void run() {}
};a. run();

特点总结:

匿名内部类是一个没有名字的内部类。

匿名内部类写出来就会产生一个匿名内部类的对象。

匿名内部类的对象类型相当于是当前new的那个的类型的子类类型

匿名内部类用于方便创建子类对象, 不需要创建一个子类继承自父类

演示代码:

我们来看下面这样一个案例, 有一个抽象父类Animal, 我们根据父类得到一个子类Tiger有两种方式:

方式一: 定义一个子类Tiger继承自抽象父类Animal

package com.chenyq.d11_innerlass_anonymous;public class Test {public static void main(String[] args) {Tiger tig = new Tiger();tig.run();}
}/**定义Tiger子类*/
class Tiger extends Animal {@Overridepublic void run() {System.out.println("老虎是跑的");}
}/**定义抽象父类*/
abstract class Animal {public abstract void run();
}

方式二: 通过匿名内部类创建子类对象

package com.chenyq.d11_innerlass_anonymous;public class Test {public static void main(String[] args) {Animal tig = new Animal() {@Overridepublic void run() {System.out.println("老虎是跑的");}};tig.run();}
}/**定义抽象父类*/
abstract class Animal {public abstract void run();
}

总结:

1.匿名内部类的作用?

方便创建子类对象,最终目的为了简化代码编写。

2.匿名内部类的格式?

Animal a = new Animal() {public void run() {}
};
a. run();

3.匿名内部类的特点?

匿名内部类是一个没有名字的内部类。

匿名内部类写出来就会产生一个匿名内部类的对象。

匿名内部类的对象类型相当于是当前new的那个的类型的子类类型。

常见的使用形式

匿名内部类在开发中的使用形式了解

例如: 某个学校需要让老师,学生一起参加游泳比赛

首先, 我们需要定义一个接口Swimming, 接口中有抽象方法swimming

其次, 定义一个方法goSwimming, 用于实现所有角色游泳

最后, 通过匿名内部类实现出来老师, 学生的角色, 再调用方法goSwimming将角色传递进去

演示代码:

基本使用

package com.chenyq.d11_innerlass_anonymous;public class Test2 {public static void main(String[] args) {// 学生角色Swimming stu = new Swimming() {@Overridepublic void swimming() {System.out.println("学生正在游泳");}};// 老师角色Swimming tec = new Swimming() {@Overridepublic void swimming() {System.out.println("老师正在游泳");}};// 调用方法goSwimmming(stu);goSwimmming(tec);}// 定义一个方法, 用于实现角色游泳功能public static void goSwimmming(Swimming swim) {System.out.println("开始游泳");swim.swimming();System.out.println("结束游泳");}
}/**定义一个接口*/
interface Swimming {// 要求实现swimming方法void swimming();
}

代码简化:

上面我们通过匿名内部类分别创建了stu和tec两个角色后, 调用goSwimming方法

其实我们可以直接调用goSwimming方法, 在goSwimming传递参数时创建角色, 如下

public static void main(String[] args) {// 创建学生角色并传入到goSwimming方法中goSwimmming(new Swimming() {@Overridepublic void swimming() {System.out.println("学生正在游泳");}});System.out.println("------------------");// 创建老师角色并传入到goSwimming方法中goSwimmming(new Swimming() {@Overridepublic void swimming() {System.out.println("老师正在游泳");}});
}

使用总结:

匿名内部类可以作为方法的实际参数进行传输。

开发中使用场景

匿名内部类在开发中的真实使用场景演示: 通过GUI编程理解匿名内部类的真实使用场景

例如: 给如下按钮绑定点击事件

演示代码:

首先通过GUI编程, 创建一个窗口展示按钮(这个代码无需理解, 只是用来举例子)

public static void main(String[] args) {// 1.创建窗口和桌布JFrame win = new JFrame("登录界面");JPanel panel = new JPanel();win.add(panel);// 2.创建按钮JButton btn = new JButton("登录");// 3.把按钮添加到桌布上展示panel.add(btn);// 4.设置窗口大小 窗口居中显示 展示窗口win.setSize(400, 300);win.setLocationRelativeTo(null);win.setVisible(true);
}

接下来监听按钮点击, 通过addActionListener方法

addActionListener方法要求传入一个参数, 参数要求是ActionListener接口类型的, 我们可以通过匿名内部类穿件ActionListener类型的对象

并重写actionPerformed方法, 在该方法中完成点击后的要实现的功能

public static void main(String[] args) {// 1.创建窗口和桌布JFrame win = new JFrame("登录界面");JPanel panel = new JPanel();win.add(panel);// 2.创建按钮JButton btn = new JButton("登录");// 监听按钮的点击:// 点击中要求传入一个ActionListener接口类型的对象// 我们通过匿名内部类直接创建一个ActionListener类型的对象btn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// 点击按钮弹框JOptionPane.showMessageDialog(win, "点击了按钮");}});// 3.把按钮添加到桌布上展示panel.add(btn);// 4.设置窗口大小 窗口居中显示 展示窗口win.setSize(400, 300);win.setLocationRelativeTo(null);win.setVisible(true);
}

匿名内部类通过->新语法可以简化代码(了解, 后续有文章会专门讲解)

public static void main(String[] args) {// 1.创建窗口和桌布JFrame win = new JFrame("登录界面");JPanel panel = new JPanel();win.add(panel);// 2.创建按钮JButton btn = new JButton("登录");// 简化代码btn.addActionListener(e -> JOptionPane.showMessageDialog(win, "点击了按钮"));// 3.把按钮添加到桌布上展示panel.add(btn);// 4.设置窗口大小 窗口居中显示 展示窗口win.setSize(400, 300);win.setLocationRelativeTo(null);win.setVisible(true);
}

使用总结:

开发中不一定是我们主动去定义匿名内部类的,而很多时候是别人需要我们写或者我们可以写的时候才会使用。

匿名内部类的代码可以实现代码进一步的简化

Java内部类介绍 - 局部内部类和匿名内部类相关推荐

  1. java 内部类 返回值_Java基础第10天+形式参数和返回值的问题、包、导包、权限修饰符、常见的修饰符、内部类(局部内部类,成员内部类,匿名内部类)...

    1:形式参数和返回值的问题(理解) (1)形式参数: 类名:需要该类的对象 抽象类名:需要该类的子类对象 接口名:需要该接口的实现类对象 (2)返回值类型: 类名:返回的是该类的对象 抽象类名:返回的 ...

  2. Java 内部类、局部内部类、静态内部类使用

    1.上代码: //局部内部类.静态内部类.匿名类接口仅仅解决了多继承的部分问题,内部类有效实现了多重继承package ClassN1;public final class InnerClass {p ...

  3. 外部类、内部类、局部内部类、匿名类(Java)

    外部类.内部类.局部内部类.匿名类(Java) 代码一: public class Application {public static void main(String[] args) {Outer ...

  4. java局部内部类_Java 局部内部类、匿名内部类详解

    外部类与内部类 众所周知,每个java文件必须有一个与这个java文件同名的外部类,这个外部类可以是public或default的.而除了这个同名外部类,还可以有与这个同名外部类平级的其他外部类,但它 ...

  5. Java的(((φ(◎ロ◎;)φ))) 实例(成 员)内部类、局部内部类、匿名内部类和静态内部类。

    关于让你晕头的Java类 总结 2.细枝末节 小试牛刀 Biu~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~pia! # 梳理一下 # 前言 Java里有各种各样 ...

  6. 【java笔记】成员内部类 局部内部类 匿名内部类

    内部类:一个类的内部包含另一个类 如:身体和心脏的关系,汽车和发动机的关系 分类:(1)成员内部类 (2)局部内部类(包含匿名内部类) 成员内部类: 定义格式:修饰符 class 外部类名称{ 修饰符 ...

  7. JAVA基础——内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

    成员内部类 静态内部类 局部内部类 匿名内部类 1.成员内部类(实例内部类.非静态内部类) 成员内部类中不能写静态属性和方法 实例化内部类,首先需要实例化外部类,通过外部类去调用内部类   作用 要想 ...

  8. java 局部内部类常用么_Java中的内部类

    一.内部类概述 在一个类的内部定义一个类.在 A 类中定义 类 B.B 类就被叫做 A 的内部类.A 类就是 B 的外部类. 二.内部类的种类 内部类分为:成员内部类.静态内部类.局部内部类.匿名内部 ...

  9. 第三次学JAVA再学不好就吃翔(part43)--局部内部类访问局部变量

    学习笔记,仅供参考 面向对象 局部内部类访问局部变量 啥叫局部内部类? 局部内部类是指在方法中定义的内部类. 举个例子(访问局部内部类) 局部内部类: class InnerTest1 {public ...

  10. Java基础篇:内部类详解

    目录: 一.内部类的好处: 二.成员内部类: 三.局部内部类: 四.静态内部类: 五.匿名内部类: 六.总结: 内部类:可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个编译时概念 ...

最新文章

  1. 二本学生连发10篇SCI直博香港城大,被质疑「灌水」,本人回应!
  2. 青源 LIVE 第 20 期 | 复旦大学吴祖煊:高效视频内容识别
  3. A Fully Featured Windows HTTP Wrapper in C++
  4. C语言再学习 -- 声明与定义
  5. java中List Array相互转换
  6. OpenGL编程轻松入门之二次几何体
  7. nginx请求转发被拒绝_nginx反向代理(请求转发-URL匹配规则)
  8. tomcat java_opts 最大_tomcat性能优化(JAVA_OPTS)
  9. Pandas dtypes
  10. SSO单点登录学习总结(3)—— 基于CAS实现单点登录实例
  11. JAVA入门到精通-第64讲-sql server备份恢复
  12. 了解RxJava以及如何在Android应用中使用它
  13. IT工作十年总结之14个单据通用字段
  14. 用java下载音频文件_喜马拉雅FM下载的音频转换为正常文件的JAVA实现
  15. 遥感专业学c语言吗,2019遥感科学与技术专业怎么样、学什么、前景好吗
  16. 第四章 维纳滤波原理及自适应算法
  17. 坚果pro3刷miui_坚果Pro3刷机包
  18. 第一章 时空、运动
  19. java apache commons_Apache commons(Java常用工具包)简介
  20. 想要在华为云上部署javaweb项目怎么做

热门文章

  1. php addslash,php addslashes用法详解
  2. arm mali 天梯图_电视盒子CPU天梯图:原来这些处理器都在这个档位
  3. 2019杭电多校第六场 HDU6638 Snowy Smile(线段树区间合并+枚举)
  4. 【复习总结】玫瑰人生 La Vie en Rose
  5. 马哥教育开学感想随笔
  6. 如何将PPT输出为高精度的图片
  7. 计算机怎么看事件管理,如何打开事件查看器 win7事件查看器打开及使用方法介绍...
  8. Flask框架学习:蓝图的使用
  9. wps怎么统一修改标点符号_标点符号采用宋体全角 wps标点统一全角
  10. 基于HTML和JS实现的保护海洋动物、保护环境的硬核小游戏