Java内部类解析

news/2024/5/21 15:45:05/文章来源:https://blog.csdn.net/m0_56911284/article/details/127931762

作者:~小明学编程 

文章专栏:JavaSE基础

格言:目之所及皆为回忆,心之所想皆为过往
在这里插入图片描述

目录

什么是内部类

静态内部类

静态内部类访问外部类的规则

外部类访问静态内部类的规则

实例化静态内部类

非静态内部类

内部类访问外部类规则

外部类访问内部类规则

实例化内部类

局部内部类

匿名内部类


什么是内部类

什么是Java的内部类呢?

简单来说就是在我们原有的类中再次的嵌套一个类。

静态内部类

class OutClass {public int data1 =1;private int data2 = 2;public static int data3 = 3;static class InnerClass {public int data4 = 4;private int data5 = 5;public static int data6 = 6;}
}

形如上述代码,我们的OutClass是一个外部类,我们的InnerClass是一个内部,并且我们在InnerClass的前面加了一个static,此时我们的InnerClass就是一个静态内部类了。

静态内部类访问外部类的规则

然后我们也可以像外部类那样,同时在我们的内部类中定义一些成员,同时我们也可以定义方法,例如:

class OutClass {public int data1 =1;private int data2 = 2;public static int data3 = 3;static class InnerClass {public int data4 = 4;private int data5 = 5;public static int data6 = 6;public void func() {System.out.println(data1);System.out.println(data2);System.out.println(data3);System.out.println(data4);System.out.println(data5);System.out.println(data6);}}
}

 但是此时我们发现代码报错了,我们在内部类中不能够直接的打印我们的data1和data2,这是为什么呢?

因为此时我们的InnerClass是一个静态的内部类,我们静态的内部类是不依赖对象的,也就是说在我们的静态内部类中是不能直接访问外部非静态的成员的,那么想要访问该怎么办呢?

答案很简单,就是new一个我们的外部对象然后访问就行了。

        public void func() {OutClass outClass = new OutClass();System.out.println(outClass.data1);System.out.println(outClass.data2);System.out.println(data3);System.out.println(data4);System.out.println(data5);System.out.println(data6);}

写成这样我们的代码就不会再报错了。

外部类访问静态内部类的规则

刚说了我们的静态内部类访问外部类的规则,那么我们的外部类去访问我们的静态内部类又会如何呢?

class OutClass {public int data1 =1;private int data2 = 2;public static int data3 = 3;static class InnerClass {public int data4 = 4;private int data5 = 5;public static int data6 = 6;public void func() {OutClass outClass = new OutClass();System.out.println(outClass.data1);System.out.println(outClass.data2);System.out.println(data3);System.out.println(data4);System.out.println(data5);System.out.println(data6);}}public void test() {System.out.println(data1);System.out.println(data2);System.out.println(data3);System.out.println(data4);System.out.println(data5);System.out.println(data6);}
}

 这里我们可以看到我们的下面三个静态内部类的成员均不能直接访问。如何解决这个问题呢?

对于静态变量的data6因为不依赖对象所以我们在前面直接加一个我们的内部类就行了。对于data4和data5来说的话,我们要借助内部类对象了。

    public void test() {InnerClass innerClass = new InnerClass();System.out.println(data1);System.out.println(data2);System.out.println(data3);System.out.println(innerClass.data4);System.out.println(innerClass.data5);System.out.println(InnerClass.data6);}

那么疑惑再次来袭,我们的data4是一个public可以理解但是我们的data5是一个private 的怎么能直接访问呢?

这是因为我们的外部类可以访问我们静态内部类中的所有成员

实例化静态内部类

既然我们处理好了我们的静态内部类,那么我们该怎么去实例化我们的静态内部类呢?

    public static void main(String[] args) {OutClass.InnerClass innerClass = new OutClass.InnerClass();innerClass.func();}

这里我们采用的方式是   外部类.内部类 类名 = new 外部类.内部类()的方式去实例化我们的静态内部类的。

非静态内部类

class OutClass2 {public int data1 =1;private int data2 = 2;public static int data3 = 3;class InnerClass {public int data4 = 4;private int data5 = 5;public final static int data6 = 6;public void func() {System.out.println(data1);System.out.println(data2);System.out.println(data3);System.out.println(data4);System.out.println(data5);System.out.println(data6);}}public void test() {InnerClass innerClass = new InnerClass();System.out.println(data1);System.out.println(data2);System.out.println(data3);System.out.println(innerClass.data4);System.out.println(innerClass.data5);System.out.println(InnerClass.data6);}
}

下面我们所说的内部类均代表非静态的内部类。

内部类访问外部类规则

        public void func() {System.out.println(data1);System.out.println(data2);System.out.println(data3);System.out.println(data4);System.out.println(data5);System.out.println(data6);}

这里我们可以看到我们的func()方法无论是内部类还是外部类的成员我们都可以直接的访问,所以这里我们内部类在访问外部类的时候还是比较容易的,直接就能进行访问。

class OutClass2 {public int data1 =1;private int data2 = 2;public static int data3 = 3;class InnerClass {public int data1 = 111;public int data4 = 4;private int data5 = 5;public final static int data6 = 6;public void func() {System.out.println(data1);//111System.out.println(OutClass2.this.data1);//1}}
}

这里我们可以看到我们的内部类和外部类都有data,当我们打印data1的时候将会打印我们内部类中的data1,要是想打印外部类中的data1就得采用  外部类.this.成员的方式去访问。

外部类访问内部类规则

    public void test() {InnerClass innerClass = new InnerClass();System.out.println(data1);System.out.println(data2);System.out.println(data3);System.out.println(innerClass.data4);System.out.println(innerClass.data5);System.out.println(InnerClass.data6);}

外部类访问我们内部类的规则依旧同上,需要我们new一个内部类的对象然后才能进行访问,对于静态常量,直接通过类名就能访问。

实例化内部类

实例化我们的非静态内部类相对就比较麻烦一点。

    public static void main(String[] args) {//方式一OutClass2 outClass2 = new OutClass2();OutClass2.InnerClass innerClass = outClass2.new InnerClass();innerClass.func();//方式二OutClass2.InnerClass innerClass1 = new OutClass2().new InnerClass();innerClass1.func();}

我们可以一次性实例化也可以分两次来进行实例化,都能达到我们实例化的需求。

局部内部类

class OutClass3 {public int a = 1;public void func() {class InnerClass {int c = 2;public void func() {System.out.println("hello");}}InnerClass innerClass = new InnerClass();innerClass.func();}
}

形如上述代码,我们在我们外部类的方法中或者{}体中定义的类叫做局部类。

    public static void main(String[] args) {OutClass3 outClass3 = new OutClass3();outClass3.func();//hello}

 我们的局部类同样也有字节码文件。

匿名内部类

在了解匿名内部类之前让我们先看一段熟悉的代码

interface A {void func();
}
class AA implements A {@Overridepublic void func() {System.out.println("haha");}
}
    public static void main(String[] args) {A a = new AA();a.func();}

我们有一个接口,接口里面有一个抽象方法func(),当我们想用这个方法的时候我们需要有一个类去实现它,然后重写里面的方法,最后new一个对象再去调用方法。

对于接口里面方法比较少的话这种写法比较麻烦。

下面我们用内部类的写法:

    public static void main(String[] args) {new A() {@Overridepublic void func() {System.out.println("haha");}}.func();}

我们new一个接口然后重写里面的方法,最后在后面直接调用就行了。

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

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

相关文章

双向链表的实现

这里以结构体的方式来实现链表,也可以使用类。结构体在没有修饰符的情况下,默认是共有访问。如有不对,希望能指出。 目录 一、链表和结点结构体的声明 (ListNode.h) 二、链表各个功能的实现 1、增 (1) 构造函数(创建链表头结点…

信息安全工程实践笔记--Day1 信息收集漏洞扫描

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录实验目标(一)信息收集一、搜索引擎二、域名1.whois 查询2.子域名查询3.真实ip(1)什么是cdn?(2) 如何验证目标服务器是否挂载cdn&a…

零基础自学javase黑马课程第十六天

零基础自学javase黑马课程第十六天 ✨欢迎关注🖱点赞🎀收藏⭐留言✒ 🔮本文由京与旧铺原创,csdn首发! 😘系列专栏:java学习 💻首发时间:🎞2022年11月21日&…

中国市场杂志社中国市场编辑部2022年第32期目录

前沿理论 新冠肺炎疫情下跨境冷链物流的新思考——以大连冷链业疫情为例 廖燕莲;谷玉红;尚书山; 1-3《中国市场》投稿:cnqikantg126.com 数字经济背景下数字服务税问题探析 李瑞玲; 4-6 我国工业能源效率提升的阻碍及其对策探究 韩洁平;田振东;张诗雅; …

Linux 之 Linux/Ubuntu 中开发操作中常用的命令整理

Linux 之 Linux/Ubuntu 中开发操作中常用的命令整理 目录 Linux 之 Linux/Ubuntu 中开发操作中常用的命令整理 一、简单介绍 二、常用命令 1、 打开终端 :Ctrl Alt T 2、退出终端:exit 3、查看安装 Ubuntu 版本/显示系统等信息:uname…

Advances in Graph Neural Networks笔记4:Heterogeneous Graph Neural Networks

诸神缄默不语-个人CSDN博文目录 本书网址:https://link.springer.com/book/10.1007/978-3-031-16174-2 本文是本书第四章的学习笔记。 感觉这一章写得不怎么样。以研究生组会讲异质图神经网络主题论文作为标准的话,倒是还行,介绍了HGNN的常见…

csdn月入过万的作者是如何练成的?

很多年前,我有一个成为作家的梦想。 后来从事了技术,觉得与作家梦越来越远了。 虽然梦想远去,但写字的欲望没有停止。 这些年,一直在有道云笔记上记录自己的工作心得,偶尔会来csdn上写一写。 我在csdn真正发力的时候…

openGauss数据库客户端连接工具之Datastudio安装

Datastudio使用前电脑必须安装jdk1.8版本或者1.11版本,如未安装可点击以下连接,参考第一步把jdk给安装成功。 点击此处查看jdk安装步骤 Datastudio下载地址:软件包|Datastudio 下载完成后,解压安装包,双击exe文件打开…

链表中快慢指针的应用

目录 一、链表的中间结点 二、回文链表 三、链表中倒数第K个结点 四、删除链表的倒数第n个结点 五、环形链表 六、环形链表Ⅱ 一、链表的中间结点 给定一个头结点为 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间…

基于Spring Cloud的架构使用学习升级之路

引言 Spring Cloud全家桶用了挺长时间了,很长一段时间都是基于已有的架构进行需求研发。今年成为团队技术负责人,承担了新的项目,这是很好的一个机会,于是开启了项目架构升级之路。 架构,是团队项目的根基。在一个团…

为什么开源在线表单工具能做好数据管理?

在数字化时代,数据的有效应用和管理可以说是企业的无形资产,做好数据管理既能提升办公效率,又能帮助企业从规律的数字化管理中获取高效的管理策略。那么,什么样的开源在线表单工具可以实现这一目的?对于企业而言&#…

token的使用

一:什么是token及token的作用? 1.什么是token? Token是首次登录时,由服务器下发,作为客户端进行请求时的一个令牌。当请求后台方法时,用于身份验证 当第一次登录后,服务器生成一个Token便将此…

【SpringBoot】SpringBoot+SpringSecurity+CAS实现单点登录

文章目录一.CAS的概述1.SSO2.CAS3.概念二.CAS的流程三.CAS服务端部署1.下载地址2.源码打包3.部署运行4. java.io.FileNotFoundException: \etc\cas\thekeystore (系统找不到指定的文件。)四.CAS的定制1.定制数据源2.兼容 HTTP3.定制登录页五.SpringBoot集成CAS1.工程创建2.导入…

【OpenCV 例程 300篇】248. 特征描述之HOG描述符

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】248. 特征描述之HOG描述符 1. 方向梯度直方图 方向梯度直方图(Histogram of Oriented Gradient, HOG)使用梯度方向的分布作为特征来构造描述符,应用非常广泛。 梯…

十万部冷知识:“澳大利亚”为什么属于亚洲球队?

在2022年卡塔尔世界杯上,总共有6支球队入围,他们分别是日本队,韩国队,沙特队,伊朗队,澳大利亚队,还有就是东道主卡塔尔队。但是我们知道,澳大利亚,并不是亚洲的国家&…

前端面试题(JS部分)

目录一, 数据类型1,什么是引用类型,值类型?2,哪些值类型3,哪些引用类型4,判断数据类型5,typeof判断6,instanceof7,construtor二,浅拷贝 / 深拷贝1…

在阿里云 ACK 上部署 EMQX MQTT 服务器集群

云进入以「应用为中心」的云原生阶段,Operator 模式的出现,则为 Kubernetes 中的自动化任务创建配置与管理提供了一套行之有效的标准规范。通过将运维知识固化成高级语言 Go/Java 代码,使得运维知识可以像普通软件一样交付,并能支…

Jmeter的使用说明

一、安装Jmeter工具 链接:https://pan.baidu.com/s/1ZYc15eq9DO-r0ChKHxMXlg?pwdckcd 提取码:ckcd --来自百度网盘超级会员V5的分享二、Jmeter的常用元器件说明 jmeter八大元件件:取样器,前置处理器,后置处理器&a…

MySQL的高阶学习:索引、B+树

1.索引 索引是一种数据结构,如果没有索引,查找一个数据就需要从第一页开始全局检索直至找到需要的数据,有了索引可以先在目录中根据拼音查找到该数据所在的页数,因此通过索引可以大大减少了查询时间。 索引有两种存储类型&#xf…

汽车安全气囊设计?Abaqus/Part特殊建模方法-附案例step-by-step教学

作者 | 邓怡超 Abaqus/Part基于特征的建模功能可以说非常齐全,基本能够满足一般的分析要求,更复杂的模型则可以通过与专业三维建模软件之间的接口来导入,今天要说的是部件的另外一种建模方法。 有一种类型的分析,部件自身的初始…