Java进阶学习笔记19——内部类

1、 内部类:

是类中五大成分之一(成员变量、方法、构造函数、内部类、代码块),如果一个类定义在另一个 类的内部,这个类就是内部类。

场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。

内部类的四种形式:

成员内部类:了解

静态内部类:了解

局部内部类:了解

匿名内部类:重点

成员内部类:

就是类中的一个普通成员,类似前面我们学过的普通的成员变量、成员方法。

Outer类:

内含内部类:

package cn.ensource.d1_inner_class1;

public class Outer {
    private int age = 99;
    public static String a;

    // 普通成员内部类
    public class Inner{
        private String name;
        private int age = 88;
        public static String schoolName;  // JDK16才支持静态成员的

        public void test() {
            System.out.println(age);
            System.out.println(a);

            int age = 66;
            // 66
            System.out.println(age);
            // 88
            System.out.println(this.age);
            // 99
            System.out.println(Outer.this.age);

        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

测试类:

package cn.ensource.d1_inner_class1;

public class Test {
    public static void main(String[] args) {
        // 目标:了解成员内部类
        Outer.Inner in = new Outer().new Inner();
        in.test();
    }
}

注意:

JDK16之前,成员内部类中不能定义静态成员,JDK16开始也可以定义静态成员了。

创建对象的格式:

成员内部类中访问其他成员的特点:

1)和前面学过的实例方法一样,成员内部类的实例方法中,同样可以直接访问外部类的实例成员、静态成员。

2)可以在成员内部类的实例方法中,拿到当前外部类对象,格式: 外部类名.this

静态内部类:

所谓静态内部类,有static修饰符的内部类,属于外部类自己持有。

静态内部类是外部类持有的。

Outer类:包含静态内部类:

package cn.ensource.d1_inner_class2;

public class Outer {
    private int age;
    public static String schoolName;
    // 静态内部类
    public static class Inner {
        private String name;
        public static int a;

        public void test() {
//            System.out.println(age);  // 只能通过外部类对象访问
            System.out.println(schoolName);

        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public static int getA() {
            return a;
        }

        public static void setA(int a) {
            Inner.a = a;
        }
    }

    public static void test2() {
        System.out.println(schoolName);
//        System.out.println(age);

    }
}

 测试类:

package cn.ensource.d1_inner_class2;

public class Test {
    public static void main(String[] args) {
        // 目标:了解静态内部类
        Outer.Inner in = new Outer.Inner();
        in.getName();
        in.test();
    }
}

特别要注意的是:

可以直接访问外部类的静态成员,不可以直接访问外部类的实例成员。

外部类的实例成员只能通过外部类对象来访问。

局部内部类:

局部内部类是定义在方法中,代码块中,构造器等执行体中。

匿名内部类:(重点)

就是一种特殊的局部内部类;所谓匿名:指的是程序员不需要为这个类声明名字。

package d3_inner_class3;

public class Test {
    public static void main(String[] args) {
        // 目标:掌握匿名内部类,并掌握其作用
        Animal a = new Cat();   // 创建子类对象
        a.cry();

    }
}

class Cat extends Animal {

    @Override
    public void cry() {
        System.out.println("喵喵~");
    }
}

abstract class Animal {
    public abstract void cry();
}

进化:

package d3_inner_class3;

public class Test {
    public static void main(String[] args) {
        // 目标:掌握匿名内部类,并掌握其作用
//        Animal a = new Cat();   // 创建子类对象
//        a.cry();

        // 我们只要创建一下子类对象就可以了,不需要经常性的创建子类
        // 匿名内部类
        // 把这个匿名内部类编译成一个子类,然后会立即创建一个子类出来
        Animal a = new Animal() {

            @Override
            public void cry() {
                System.out.println("喵喵~");
            }
        };
        a.cry();
    }
}

class Cat extends Animal {

    @Override
    public void cry() {
        System.out.println("喵喵~");
    }
}

abstract class Animal {
    public abstract void cry();
}

匿名内部类的概念。

匿名内部类本质上是不是一个子类呢?

反编译可以看到这个匿名类是Animal的子类。

编译生成一个匿名的构造方法。

并且有内部方法cry方法。

特点:匿名内部类本质就是一个子类,并会立即创建出一个子类对象。

作用:用于更方便地创建一个子类对象。

匿名内部类的常见使用场景:

通常作为一个参数传递给方法。

package d3_inner_class3;

public class Test2 {
    public static void main(String[] args) {
        // 目标:掌握匿名内部类的使用场景:
        Swimming s1 = new Swimming(){

            @Override
            public void swim() {
                System.out.println("狗游泳!");
            }
        };
        go(s1);
        Swimming s2 = new Swimming() {

            @Override
            public void swim() {
                System.out.println("猫游泳!");
            }
        };
        go(s2);
    }

    // 设计一个方法,可以接收swimming接口的一切实现类对象进来参加游泳比赛
    // go 表示开始参加比赛
    public static void go(Swimming s) {
        System.out.println("开始----------");
        s.swim();
    }
}

// 猫和狗都要参加有用比赛
interface Swimming{
    void swim();
}

匿名内部类有啥特点:

匿名内部类本质上就是一个子类,并会立即创建出一个子类对象。

匿名内部类有啥作用、应用场景?

可以更方便创建出一个子类对象。

匿名内部类通常作为一个参数传递给方法。

拓展:

package cn.ensource.d4_inner_class5;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Test {
    public static void main(String[] args) {
        // 拓展:内部类在开发中的真实使用场景
        // GUI编程:
        // 1. 创建窗口
        JFrame win = new JFrame("登录");
        JPanel panel = new JPanel();
        win.add(panel);

        JButton btn = new JButton("登录");
        panel.add(btn);

        // 给按钮绑定单击事件监听器
        // 调别人的匿名内部类,需要用的时候才用
        // 真实应用场景
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(win, "登录一下");
            }
        });
        
        win.setSize(400, 400);
        win.setLocationRelativeTo(null);
        win.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        win.setVisible(true);
    }
}

最终目的是为了简化代码。

箭头语法后面会讲得。

匿名内部类,我们需要的时候才会用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/644997.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux服务升级:Predixy 升级代理 Redis-cluster 集群

目录 一、实验 1.环境 2. 启动Redis服务 3.Predixy 升级代理 Redis-cluster 集群 二、问题 1. Predixy进行set操作报错 2.如何创建脚本启动predixy 3.Redis代理对比 一、实验 1.环境 (1)主机 表1 主机 系统版本节点软件IP备注CentOS7.9Redis…

JavaFX学习教程二

一、JavaFX 体系结构 JavaFX 场景图(Scene Graph)是构建 JavaFX 应用程序的起点,一种树状数据结构,用于排列(和分组)图形对象,以便于逻辑表示。 stage:舞台,操作系统窗口的 JavaFX 表示,是所有…

网络编程的基础知识(适合新手)

网络编程 在Java中,网络编程是指使用Java语言进行网络通信的编程技术。这种技术使得位于不同地理位置的计算机能够通过网络进行通信,实现资源共享和信息传递。 一、定义 Java网络编程是Java语言在网络通信方面的应用,它利用Java提供的网络…

恢复Android数据的综合指南:适用于Android的数据恢复工具

随着存储空间的快速增长,智能手机已成为我们最可靠的个人数据库。我们的 Android 手机不亚于我们自己的延伸,包含各种重要文件、照片、文档、视频、联系人、通话记录等等。由于这些智能 Android 设备上存储了如此多有价值的信息,意外删除或丢…

Java进阶学习笔记22——泛型方法、通配符和上下限

泛型方法: package cn.ensource.d11_generics_method;public class Test {public static void main(String[] args) {// 泛型方法String res test("Java");System.out.println(res);Dog dog1 test(new Dog());System.out.println(dog1);}// 泛型方法pub…

常用API(正则表达式、爬取、捕获分组和非捕获分组 )

1、正则表达式 练习——先爽一下正则表达式 正则表达式可以校验字符串是否满足一定的规则,并用来校验数据格式的合法性。 需求:假如现在要求校验一个qq号码是否正确。 规则:6位及20位之内,0不能在开头,必须全部是数字…

一文了解 - GPS/DR组合定位技术

GPS Global Position System 全球定位系统这个大家都很熟悉, 不做太多介绍。 DR Dead Reckoning 车辆推算定位法, 一种常用的辅助的车辆定位技术。 DR系统的优点: 不需要发射和接收信号; 不受电磁波干扰。 DR系统的缺点&#x…

SVM兵王问题

1.流程 前面六个就是棋子的位置,draw就是逼和,后面的数字six就代表,白棋最少用六步就能将死对方。然后呢,可以看一下最后一个有几种情况: 2.交叉测试 leave one out: 留一个样本作测试集,其余…

精品PPT | 精益生产管理中MES系统的实现与应用(免费下载)

【1】关注本公众号,转发当前文章到微信朋友圈 【2】私信发送 MES系统的实现与应用 【3】获取本方案PDF下载链接,直接下载即可。 如需下载本方案PPT/WORD原格式,请加入微信扫描以下方案驿站知识星球,获取上万份PPT/WORD解决方案&…

深入理解 Spring Web 应用程序初始化流程

前言 在构建基于 Spring 的 Web 应用程序时,了解初始化流程是至关重要的。本文将详细介绍 Servlet 容器的初始化过程,并重点探讨 Spring 框架在其中的作用,特别是 ServletContainerInitializer、SpringServletContainerInitializer 和 WebAp…

2024年软考总结 信息系统管理师

选择题 英文题,我是一题也没把握,虽然我理解意思。 千万不要认为考死记硬背不对。目的不在于这。工程项目中有很多重要的数字,能记住说明你合格。 案例 几乎把答案全写在案例中了。 计算题 今年最简单。没有考成本。 只考了关键路径&a…

微信小程序毕业设计-智慧旅游平台系统项目开发实战(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…

RAG技术综述

RAG的基本架构。,生成器和检索器。 参考paper:https://arxiv.org/html/2402.19473v4 文中将rag的内容从文本扩展至多模态,打开了思路。 生成器:transformer,LSTM,扩散模型,gan 检索器&#xf…

Sourcetree安装教程及使用

1 Sourcetree介绍 Sourcetree是一款免费的Git图形化客户端,它由Atlassian开发,提供了跨平台的支持,可运行在Windows和Mac操作系统上。Sourcetree可以让开发者更方便地使用Git来管理代码,不需要在命令行中输入复杂的Git命令&#x…

【强训笔记】day25

NO.1 思路&#xff1a;哈希质数判断。 代码实现&#xff1a; #include <iostream> #include<string> #include<cmath> using namespace std;bool isprime(int n) {if(n<2) return false;for(int i2;i<sqrt(n);i){if(n%i0) return false;}return true…

Python筑基之旅-运算符

目录 一、运算符 1、了解定义 2、理解意义 2-1、基本数据处理 2-2、条件判断 2-3、逻辑操作 2-4、赋值和更新 2-5、位操作 2-6、提高代码可读性 2-7、解决实际问题 2-8、学习其他编程语言的基础 3、探索方法 3-1、理解概念 3-2、练习基本运算 3-3、掌握优先级 …

ICML 2024 Mamba 论文总结

2024ICML&#xff08;International Conference on Machine Learning&#xff0c;国际机器学习会议&#xff09;在2024年7月21日-27日在奥地利维也纳举行 &#x1f31f;【紧跟前沿】“时空探索之旅”与你一起探索时空奥秘&#xff01;&#x1f680; 欢迎大家关注时空探索之旅 …

ciscn2024(上传一下,有侵权什么的问题的话联系删除)

Web Simple_php 这个Simple_php一点儿也不Simple (⋟﹏⋞) 源码放这儿了&#xff1a; <?phpini_set(open_basedir, /var/www/html/); error_reporting(0);if(isset($_POST[cmd])){$cmd escapeshellcmd($_POST[cmd]); if (!preg_match(/ls|dir|nl|nc|cat|tail|more|flag…

原生标签WebComponent

文章目录 介绍一、web Component二、怎么使用三、在Vue中使用使用场景 前端必备工具推荐网站(免费图床、API和ChatAI等实用工具): http://luckycola.com.cn/ 介绍 平常浏览各个网站过程中&#xff0c;经常遇到的一种现象&#xff1a;页面广告。 这种广告按照来源可分为两种&…

C++面向对象程序设计 - 输入和输出

程序的输入指的是文件将数据传送给程序&#xff0c;程序的输出指的是从程序将数据传送输出文件。 C的输入和和输出包括以下三个方面&#xff1a; 对系统指定的标准设备的输入和输出&#xff0c;即从键盘输入数据&#xff0c;输出到显示器屏幕。以外存磁盘&#xff08;或光盘、…