Java(十一)——内部类、成员内部类、静态内部类、局部内部类、匿名内部类

news2024/9/21 4:22:40

个人简介

👀个人主页: 前端杂货铺
开源项目: rich-vue3 (基于 Vue3 + TS + Pinia + Element Plus + Spring全家桶 + MySQL)
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍖开源 rich-vue3 🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒Three.js

🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

内容参考链接
Java基础(一)Hello World,8种数据类型,键盘录入
Java基础(二)数组,方法,方法重载
Java基础(三)类和对象、构造方法
Java基础(四)字符串、StringBuffer、StringBuilder、StringJoiner
Java基础(五)ArrayList
Java基础(六)继承
Java基础(七)多态
Java基础(八)包、final、权限修饰符、静态代码块
Java基础(九)抽象类、抽象方法
Java基础(十)接口

文章目录

    • 前言
    • 内部类
    • 成员内部类
    • 静态内部类
    • 局部内部类
    • 匿名内部类
    • 总结

前言

大家好,这里是前端杂货铺。

本篇文章,我们学习 内部类


内部类

在一个类的里面,再定义一个类。

内部类表示的事物是外部类的一部分,内部类的单独出现没有任何意义。

内部类的访问特点:

  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须创建对象

Car.java

public class Car {
    String carName = "BBA";
    int carAge;
    String carColor;

    public void show() {
        System.out.println(carName);

        Engine e = new Engine();
        System.out.println(e.engineName);
    }

	// 内部类
    class Engine {
        String engineName = "V8";
        int engineAge;

        public void show() {
            System.out.println(engineName);
            System.out.println(carName);
        }
    }
}

Test.java

public class Test {
    public static void main(String[] args) {
        Car car = new Car();
        car.show();
    }
}

在这里插入图片描述


成员内部类

成员内部类:写在成员的位置,属于外部类的成员。

编写成员内部类的注意点:

  • 成员内部类可以被一些修饰符所修饰,如:private、默认、protected、public、static 等。
  • 在成员内部类里面,JDK16 之前不能定义静态变量,JDK16 开始定义静态变量。

获取成员内部类对象的两种方式:

  • 方式一:外部编写方法,对外提供内部类对象。
  • 方式二:直接创建:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
  •  Outer.Inner oi = new Outer.new Inner();
    

Outer.java

public class Outer {
    private int a = 10;

    class Inner {
        int a = 20;

        public void show() {
            int a = 30;
            System.out.println(Outer.this.a); // 10
            System.out.println(this.a); // 20
            System.out.println(a); // 30
        }
    }
}

Test.java

public class Test {
    public static void main(String[] args) {
        Outer.Inner oi = new Outer().new Inner();

        oi.show();
    }
}

在这里插入图片描述


静态内部类

静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象。

创建静态内部类对象的格式:

外部类名.内部类名 对象名 = new 外部类名.内部类名();

调用非静态方法的格式:先创建对象,用对象调用。

调用静态方法的格式:

外部类名.内部类名.方法名();

静态内部类只能访问外部类中的静态变量和静态方法,如果要访问非静态的需要创建外部类的对象。

Outer.java

package com.javabasic.innerclassdemo;

public class Outer {
    int a = 10;
    static int b = 20;
    
    static class Inner {
        public void show1() {
            // 访问非静态变量,需要先创建类对象,再调用
            Outer o = new Outer();
            System.out.println(o.a); // 10

            System.out.println(b); // 20
            System.out.println("非静态的方法被调用了");
        }

        public static void show2() {
            Outer o = new Outer();
            System.out.println(o.a); // 10
            
            System.out.println(b); // 20
            System.out.println("静态的方法被调用了");
        }
    }
}

Test.java

public class Test {
    public static void main(String[] args) {
    	// 调用非静态方法
        Outer.Inner oi = new Outer.Inner();
        oi.show1();
        
		// 调用静态方法
        Outer.Inner.show2();
    }
}

在这里插入图片描述


局部内部类

将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量。

外界是无法直接使用,需要在方法内部创建对象并使用。

该类可以直接访问外部类的成员,也可以访问方法内的局部变量。

Outer.java

public class Outer {
    int b = 20;

    public void show() {
        int a = 10;

        class Inner {
            String name = "zahuopu";
            int age = 20;

            public void method1() {
                System.out.println(a);
                System.out.println(b);
                System.out.println("局部类中的method1方法");
            }

            public static void method2() {
                System.out.println("局部内部类中的method2静态方法");
            }
        }

        Inner inner = new Inner();
        System.out.println(inner.name);
        System.out.println(inner.age);
        inner.method1();
        Inner.method2();
    }
}

Test.java

public class Test {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.show();
    }
}

在这里插入图片描述


匿名内部类

匿名内部类:隐藏了名字的内部类,可以写在成员位置,也可以写在局部位置。

匿名内部类格式:包含了继承或者实现,方法重写,创建对象。整体就是一个类的子类对象或者接口的实现类对象。

new 类名或接口名() {
	重新方法;
}

使用场景:当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象,如果实现类只要使用一次,就可以用匿名内部类简化代码。

Animal.java

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

Test.java

public class Test {
    public static void main(String[] args) {
        new Animal() {
            @Override
            public void eat() {
                System.out.println("重写eat方法");
            }
        };

        method(
                new Animal() {
                    @Override
                    public void eat() {
                        System.out.println("狗在吃骨头");
                    }
                }
        );
    }

    public static void method(Animal animal) {
        animal.eat();
    }
}

在这里插入图片描述


总结

本篇文章我们学习了内部类、成员内部类、静态内部类、局部内部类、匿名内部类的定义及相关使用,其中匿名内部类是需要我们重点掌握的,因为它在一些场景中可以一定程度的简化编码。

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!


参考资料:

  1. Java 基础(bilibili-黑马程序员)
  2. 菜鸟教程–Java

在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统原理:程序、进程、线程的概念

文章目录 程序、进程、线程的概念程序(Program)进程(Process)线程(Thread)关系总结 在日常对操作系统的使用中,大家肯定对程序、进程和线程多少有所耳闻。作为操作系统的重要一部分,…

ROM修改进阶教程------修改自己适配的rom固件 禁止第三方修改 删除自定文件或app后自动重启的步骤解析

很多适配第三方系统的资深作者。都会在rom中加入一些防止他人任意修改的脚本。这种操作主要避免盗包的行为。而且前期有在rom中加入联网锁定id格式化分区的恶意操作。今天主要解析一种删除自带文件后重启手机后会反复重启的脚本步骤。 通过博文步骤可以初步了解; 1----了解删…

CAPL代码中判断网络是CAN还是CANFD

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

ardupilot开发 --- 网络技术综述 篇

不信人间有白头 一些概念参考文献 一些概念 以太网、局域网、互联网 以太网(Ethernet),是一种计算机局域网技术。以太网是一种有线网络技术,网络传输介质包括:以太网电缆,如常见的双绞线、光纤等。根据传输速度,可以氛…

2024107读书笔记|《火车快开(李娟诗集)》——我轰然经过你的生命,又悄然退却,你从不曾爱过我,你只爱我在你的生命中坠落

《火车快开(李娟诗集)》—— 文前第一部分 荒野碎片第二部分 弯路第三部分 告别 《火车快开(李娟诗集)》作者李娟,看的她的第一本书是《记一忘二三》,前段时间《我的阿勒泰》超级火,但我终于还是…

Codeforces Round 962 (Div. 3) A~F

A.Legs(贪心) 题意: 农夫约翰的农场又迎来了美好的一天。 农夫约翰来到农场后,数了数共 n n n条腿。众所周知,农场里只住着鸡和牛,一只鸡有 2 2 2条腿,而一头牛有 4 4 4条腿。 假设约翰农场…

Shell编程 --基础语法(1)

文章目录 Shell编程基础语法变量定义变量使用变量命令的使用只读变量删除变量 传递参数字符串获取字符串长度字符串截取 数组定义方式关联数组获取数组的长度 总结 Shell编程 Shell是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解…

数论——裴蜀定理、欧几里得算法、扩展欧几里得算法、逆元以及求解

裴蜀定理 若整数 a、b 互质(最大公约数为 1),则存在整数 x、y ,使得 ax by 1 。 更一般的情况是:设 a、b 是不全为零的整数,则存在整数 x、y ,使得 ax by gcd(a, b) ,其中 gcd…

第十一章:Kubernetes API服务器的安全防护

本章内容包括: 了解认证机制ServiceAccounts是什么及使用的原因了解基于角色(RBAC)的权限控制插件使用角色和角色绑定使用集群角色和集群角色绑定了解默认角色及其绑定 1 了解认证机制 在前面的内容中,我们说到API服务器可以配置一个到多个认证的插件(授…

等保2.0 | 人大金仓数据库测评

人大金仓数据库,全称为金仓数据库管理系统KingbaseES(简称:金仓数据库或KingbaseES),是北京人大金仓信息技术股份有限公司自主研制开发的具有自主知识产权的通用关系型数据库管理系统。以下是关于人大金仓数据库的详细…

室内养宠空气净化器哪家好?热门室内养宠空气净化器用户体验

自从家里有了4只英短后,一到季节我就得不停的拖地刷床,除了这些可以手动清理的猫毛之外,那么空气中的猫毛怎么办?真的不建议养猫,除非你能接受空气中飞舞着浮毛,衣服、床、筷子、鼻子里全都是猫毛&#xff…

STM32——外部中断(EXTI)

目录 前言 一、外部中断基础知识 二、使用步骤 三、固件库实现 四、STM32CubeMX实现 总结 前言 外部中断(External Interrupt,简称EXTI)是微控制器用于响应外部事件的一种方式,当外部事件发生时(如按键按下、传感器信号…

NC 合并区间

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 给出一组区间…

推流直播服务

pc端建立NVR服务器,并实现NVR功能,具有推流功能,推送给OBS,可以对接到抖音、快手等平台,实现实时直播,应用于无人值守,养殖、农场、旅游等场景 运行MediaServer和webserver 服务端口配置在confi…

C# 使用 NLog 输出日志到文件夹

在项目中使用 NuGet 安装 NLog 包以及 NLog.Config 包 配置 nlog.config 在项目的根目录下创建一个 Nlog.config 文件&#xff08;如果还没有&#xff09;&#xff0c;然后添加如下配置&#xff1a; <?xml version"1.0" encoding"utf-8" ?> <…

leetcode数论(​3044. 出现频率最高的质数)

前言 经过前期的基础训练以及部分实战练习&#xff0c;粗略掌握了各种题型的解题思路。现阶段开始专项练习。 描述 给你一个大小为 m x n 、下标从 0 开始的二维矩阵 mat 。在每个单元格&#xff0c;你可以按以下方式生成数字&#xff1a; 最多有 8 条路径可以选择&#xff1…

17 字符函数、字符串函数和内存函数

目录 一、字符函数 &#xff08;一&#xff09;字符分类函数 &#xff08;二&#xff09;字符转换函数 二、字符串函数 &#xff08;一&#xff09;strlen、strcpy、strcat、strcmp的使用和模拟实现 1、strlen &#xff08;1&#xff09;使用 &#xff08;2&#xff09;…

Java中的5种线程池类型

Java中的5种线程池类型 1. CachedThreadPool &#xff08;有缓冲的线程池&#xff09;2. FixedThreadPool &#xff08;固定大小的线程池&#xff09;3. ScheduledThreadPool&#xff08;计划线程池&#xff09;4. SingleThreadExecutor &#xff08;单线程线程池&#xff09;…

基于切片法计算点云体积 双向最近点三维点排序

具体内容源代码&#xff1a;基于切片法计算点云体积 双向最近点三维点排序 效果 主要方法&#xff1a; 点云切片&#xff08;基于一定厚度度的点云切片投影&#xff09; &#xff1b;切片后的点云分割 &#xff1b;边缘点排序【双向最近邻】&#xff08;可以进行多边形拟合计…

JAVA项目基于Spring Boot的美食烹饪互动平台的设计与实现

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着互联网…