49天精通Java,第21天,Java内部类,看看文心一言、ChatGPT怎么说

在这里插入图片描述

目录

    • 文心一言谈Java内部类
    • ChatGPT谈Java内部类
    • 下面来聊聊哪吒的见解。
    • 一、为什么需要内部类?
    • 二、内部类分为四种
    • 三、成员内部类
      • 1、什么是成员内部类
      • 2、代码实例
      • 3、成员内部类进阶代码实例
      • 4、控制台显示
      • 5、外部类访问内部类
    • 四、局部内部类
    • 五、匿名内部类
      • 1、匿名内部类简介
      • 2、代码实例
      • 3、控制台输出
      • 4、访问权限
    • 六、静态内部类
    • 七、内部类的使用场景

大家好,我是哪吒。

【百度】文心一言:你现在可以体验了,快来向我提问吧。

在这里插入图片描述

哈哈,排队排了那么久,终于可以体验文心一言了。

赶紧问问它。

文心一言谈Java内部类

在这里插入图片描述

我滴个乖乖,回答的有模有样。

ChatGPT谈Java内部类

在这里插入图片描述
有一说一,我觉得就这个问题而言,文心一言完胜。

🏆本文收录于,100天精通Java从入门到就业。

全网最细Java零基础手把手入门教程,系列课程包括:基础篇、集合篇、Java8新特性、多线程、代码实战,持续更新中(每周1-2篇),适合零基础和进阶提升的同学。

下面来聊聊哪吒的见解。

一、为什么需要内部类?

内部类是定义在另一个类中的类。

  1. 内部类可以对同一个包中的其它类隐藏;
  2. 内部类方法可以访问定义这些方法的作用域中的数据,包括原本私有的数据。

内部类的对象会有一个隐式引用,指向实例化这个对象的外部类对象。通过这个指针,它可以访问外部对象的全部状态。比如,Iterator类不需要它所指的LinkedList的一个显示指针。

二、内部类分为四种

  1. 成员内部类
  2. 局部内部类
  3. 匿名内部类
  4. 静态内部类

三、成员内部类

1、什么是成员内部类

成员内部类是最常见的内部类,它就定义在类的内部。

2、代码实例

package com.guor.bean;

public class Teacher implements Cloneable {
    private Integer id;
    private String name;

    private final String const_NEZHA = "哪吒";

    private void study(){
        System.out.println("我是哪吒");
    }

    private void speak(){
        Student student = new Student();
        student.speak();
    }

    class Student {
        private Integer teacherId;
        private String teacherName;

        private void speak(){
            System.out.println("我是"+const_NEZHA+"成员内部类");
        }
    }

    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        teacher.speak();
    }
}


上述代码中,类Student是类Teacher的一个成员,Teacher类称为外部类。成员内部类可以无条件访问外部类的所有成员属性和成员方法,包括private成员和静态成员。

3、成员内部类进阶代码实例

有一点是需要注意的,那就是如果内部类拥有和外部类同名的成员变量或方法时,会发生隐藏现象,默认情况下回访问成员内部类的成员,如果要访问外部类的成员变量,需要使用外部类.this.成员变量的形式。

package com.guor.bean;

public class Teacher implements Cloneable {
    private Integer id;
    private String name;

    private final String const_NEZHA = "哪吒";

    private void study(){
        System.out.println("我是哪吒");
    }

    private void speak(){
        Student student = new Student();
        student.speak();
    }

    class Student {
        private Integer teacherId;
        private String teacherName;
        private static final String const_NEZHA = "比比东";
        private void speak(){
            System.out.println("我是"+Teacher.this.const_NEZHA+"成员内部类");
        }
    }

    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        teacher.speak();
    }
}

4、控制台显示

在这里插入图片描述

5、外部类访问内部类

虽然内部类可以无条件的访问外部类,但,外部类好像不能随心所欲的访问内部类。
成员内部类是依附于外部类而存在的,所以说,创建内部类的时候,必须得有外部类,是不是这样呢?让我们一探究竟。

外部类访问内部类第一种方式:

    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        Student student = teacher.new Student();
        student.speak();
    }

外部类访问内部类第二种方式:

    private Student getStudentInstance(){
        return new Student();
    }

    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        Student student = teacher.getStudentInstance();
        student.speak();
    }

内部类也可以使用private、protected、public修饰,访问权限和正常情况下无异。

四、局部内部类

局部内部类,顾名思义,是定义在一个方法内或者一个作用域内的类,它和成员内部类的区别在于局部内部类的访问权限仅限于访问内或某作用域内。

public class Teacher {
    private Integer id;
    private String name;

    class Student {
        public Teacher getWoman(){
            class Girl extends Teacher {   //局部内部类
                int age =0;
            }
            return new Girl();
        }
    }
}

局部内部类就像方法里的局部变量一样,是不能有修饰符修饰的。

五、匿名内部类

1、匿名内部类简介

匿名内部类可以使你的代码更加简洁,定义一个类的同时对其进行实例化,它与局部内部类很相似,不同的是它没有类名,如果某个局部类你只需要使用一次,那么就可以使用匿名内部类。

2、代码实例

package com.guor.bean;

public class Student {
    private Integer id;
    private String name;

    interface StudyJava{
        void study();
    }

    private void work(){
        // 1、局部内部类实现Java接口
        class StudyJavaImpl implements StudyJava {
            final String name = "javase";
            @Override
            public void study() {
                System.out.println("哪吒 study "+name);
            }
        }

        StudyJava studyJavaImpl = new StudyJavaImpl();
        studyJavaImpl.study();

        // 2、匿名内部类实现study方法
        StudyJava studyJava = new StudyJava() {
            final String name = "spring";

            @Override
            public void study() {
                System.out.println("云韵 study " + name);
            }
        };

        studyJava.study();
    }

    public static void main(String[] args) {
        Student student = new Student();
        student.work();
    }
}

代码需要用心去感悟。

3、控制台输出

在这里插入图片描述

4、访问权限

  1. 匿名内部类可以访问外部类的所有成员;
  2. 匿名内部类定义的变量会屏蔽其作用域范围内的其它同名变量;
    这个在局部内部类测试过了,这里我就不做代码介绍了。

六、静态内部类

静态内部类就是在局部内部类的基础上,加了一个static。
静态内部类是不需要依赖于外部类的,并且它不能使用外部类非static的变量和方法,其实这个很好理解,java的特性不就是这样的嘛。
在这里插入图片描述

七、内部类的使用场景

  1. 每个内部类都可以独立的继承一个类,所以无论外部类是否继承了某个类,内部类依然可以继承其他类,这就完美的解决了java没有多继承的问题。
  2. 可以有效的将有一定关系的类组织在一起,又可以对外界有所隐藏。
  3. 方便编写事件驱动程序
  4. 方便编写多线程代码
  5. 用来装逼,代码越复杂,是不是感觉越牛逼。

在这里插入图片描述

🏆本文收录于,100天精通Java从入门到就业。

全网最细Java零基础手把手入门教程,系列课程包括:基础篇、集合篇、Java8新特性、多线程、代码实战,持续更新中(每周1-2篇),适合零基础和进阶提升的同学。

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。

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

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

相关文章

Dragonfly 最新正式版本 v2.0.9 已经发布!

作者:戚文博-蚂蚁集团 Dragonfly 最新正式版本 v2.0.9 已经发布!感谢 Dragonfly 的贡献者们,同时也感谢默默支持 Dragonfly 项目的各个公有云团队。欢迎访问 d7y.io [ 1] 网站来了解详情,下面具体介绍 v2.0.9 版本带来了那些更新。…

【Redis】十大数据类型(下篇)

文章目录redis位图(bitmap) --- 底子还是string基本命令图示setbit key offset value setbit 键 偏移位 只能零或者1getbit key offset 查看获取字符串长度 strlen统计key中包含1的个数 bitcount keybitop 统计两个比特key是否都为1技术落地:打卡签到,频…

【C语言蓝桥杯每日一题】——等差数列

【C语言蓝桥杯每日一题】——等差数列😎前言🙌等差数列🙌解题思路分析:😍解题源代码分享:😍总结撒花💞😎博客昵称:博客小梦 😊最喜欢的座右铭&…

让ChatGPT帮我写shell脚本, 结局很感人

七问ChatGPT, 剑指shell脚本编写 step1: 初问step2: 再问step3: 三问step4: 四问step5: 五问step6: 问个derstep7: 解决问题step8: 小问一下关于ChatGPT思考昨天浏览一篇关于脚本的技术文章的时候, 偶然看见一篇文章中写道关于mysql备份的脚本. 但是这个脚本时基于本地的MySQL服…

Idea+maven+spring-cloud项目搭建系列--13 整合MyBatis-Plus多数据源dynamic-datasource

前言:对于同一个系统,不同的租户需要自己独立分隔的数据库(每个数据库的表结构可以是相同的),同时也要支持跨数据源的查询;并且支持分布式事务,如果这里不使用分库分表插件,需要怎样…

使用dd复制将乌班图系统(Ubuntu22.04)完整迁移到新硬盘并扩容

我的折磨历程 开始的时候用乌班图的时候,不懂事,根目录太小了,后来就满了,就就感觉完全没法用,看着现在硬盘贼便宜,去狗东买了个新的硬盘。感觉挂载硬盘并不能解决我的问题,最后选择了保留系统数…

ython和PyTorch实现ChatGPT批量AI智能写作

怎么实现用chatgpt批量写作 ChatGPT是一种针对文本生成的自然语言处理工具,它可以用于生成大量的文本内容。但是,由于ChatGPT需要的计算资源较大,处理时间较长,因此在批量写作时需要考虑花费的时间和资源。 以下是一些步骤&…

又一个免费GPT-4工具 Cursor,程序员写代码将被颠覆

每天都被openai震撼到, 他们家被广为人知的产品是chatgpt,就是那个聊天工具。现在已经开始有越来越多的产品集成openai,比如微软的office,bing。现在又一个工具出现,一个叫Cursor的编辑器已经集成了openai的GPT-4&…

Spring系列(六) --- SpringBoot 与 Servlet 的比较及 Spring 读取配置文件的方式

SpringSpringBoot VS ServletSpring 读取配置文件的方式yml 和 properties 的区别SpringBoot VS Servlet Spring 读取配置文件的方式 1 Value 注解获取单个配置项 如在 yml 中定义一个 qq 音乐的 token; 然后输出, 如下: 2 针对对象的读取: ConfigurationProperties 在 yml 中…

YOLOv5添加辅助训练头

1. 介绍 思路 添加 Aux head 的主要原因是让网络中间层学到更多信息,有更丰富的梯度信息帮助训练。这里要注意,好的梯度信息能够让相同参数量的网络学的更好。 作者原文为: By letting the shallower auxiliary head directly learn the information that lead head has l…

【C#基础】泛型的概念?有什么例子?在游戏中有什么可以使用的地方?

概念 让chatGpt来为我们讲解。 在C#中,泛型是一种允许开发人员编写可重用代码,可以处理多种数据类型的特性。 使用泛型,可以创建类、方法、接口和委托这种不属于任何特定数据的类型,但可以处理满足某些约束条件的任何数据类型。…

手机银行评测系列:北京银行“京彩生活”7.0从用户视角出发,实现沉浸式体验重塑

易观:2023年3月28日,北京银行发布“京彩生活”APP 7.0版本,从旅程再造、特色金融、场景生态、平台联动、协同经营、体验管理和安全守护七大方面全面升级,从用户视角出发,重塑用户旅程,简化操作流程&#xf…

PDF Extra(安卓)

首先,软件是一个一体化的扫描仪和编辑器,工具主要包含有编辑,创建,转换,阅读和查看,其它等等多个功能类型。 编辑里面包含有编辑文本和图像,填写并签署,组织页面,压缩&am…

PLG 基础概念和关键点

什么是 PLGPLG 是 Product Led Growth 的缩写,常翻译为产品增长或产品主导型增长。这个概念最早是风投公司 OpenView 2016年提出的。定义:PLG 是一个聚焦终端用户的增长模型,依赖于产品自身作为获取、转化、扩展客户的核心动力。• 以产品来驱…

入行软件测试7年,才知道原来字节跳动这么容易进

当前就业环境,裁员、失业消息满天飞,好像有一份工作就不错了,更别说高薪了。其实这只是一方面,而另一方面,各大企业依然求贤若渴,高技术人才依然紧缺,只要你技术过硬,拿个年薪50w不是…

vue3快速上手

Vue3快速上手 1.Vue3简介 2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王)耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址:https://github.com/vuejs/vue-next/release…

核心 Android 调节音量的过程

核心 Android 系统提供的调节音量的方法 核心 Android 系统提供了多种调节音量的方法,这些方法主要包括如下这些。 如在 Android Automotive 调节音量的过程 中我们看到的,CarAudioService 最终在 CarAudioDeviceInfo 中 (packages/services/Car/servi…

开源DataX集成可视化项目Datax-Web的使用

上一篇文章我们已经搭建好了 Datax-Web 后台,这篇文章我们具体讲一下如何通过Datax-Web来配置,同步MySQL数据库。 目标 MySql数据库全量同步 1.执行器配置 1、"调度中心OnLine:"右侧显示在线的"调度中心"列表, 任务执行结束后, 将会…

红黑树、B树以及B+树及应用

目录 一.二叉查找树(二叉搜索树,BST) 1.1查找操作 1.2插入操作 1.3删除操作 1.4支持重复数据的二叉查找树 1.5二叉查找树的性能分析 二.平衡二叉查找树 2.1定义 2.2红黑树 2.3为什么红黑树这么受欢迎 三.哈希表为什么不能替代二叉查找树 四.MySQL数据库索…

基于springboot实现学生综合成绩测评系统【源码】分享

基于springboot实现学生综合成绩测评系统演示开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包…