【JavaSE】你真的了解内部类吗?

前言

本篇会详细讲解内部类的四种形式,让你掌握内部类~

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

前言

 内部类介绍

实例内部类

定义

调用

静态内部类

定义

调用

匿名内部类

定义和调用1

调用方法2

局部内部类

定义和调用


 内部类介绍

在 Java 中,可以将一个类定义在另一个类或者一个方法的内部, 前者称为内部类,后者称为外部类。(B类定义在A类的内部,称B类为内部类,A类为外部类)内部类也是封装的一种体现。

内部类分为三种

实例内部类、静态内部类、匿名内部类、局部内部类

实例内部类

定义

实例内部类定义在外部类的里面,方法的外面

class OuterClass{public int data1=1;public int data2=2;public static int data3=3;class InnerClass{public int data4=4;public int data5=5;public static int data6=6;//内部类的成员方法public void test(){System.out.println("InnerClass::test()");}}public void testA(){System.out.println("OuterClass::testA()");}
}

调用

实例内部类的实例化  

外部类.内部类  内部类引用=外部类引用.new内部类对象

实例内部类可以理解为是外部类的一个成员,要通过外部类的引用来调用

    public static void main(String[] args) {OuterClass outerClass=new OuterClass();//实例化外部类OuterClass.InnerClass innerClass=outerClass.new InnerClass();//实例化内部类innerClass.test();//调用内部类中的成员方法}

 实例内部类的方法可以调用自己的成员变量及外部类的成员变量

        //内部类的成员方法public void test(){System.out.println("InnerClass::test()");System.out.println(data4);System.out.println(data5);System.out.println(data6);System.out.println("###########");System.out.println(data1);System.out.println(data2);System.out.println(data3);}

 调用test方法 结果如图

 当内部类和外部类有相同的成员变量时,首先会访问内部类中的成员

此时,若就想访问外部类的成员变量,可以使用 外部类.this.成员变量 即可访问

 

静态内部类

定义

静态内部类定义在 外部类的里面,方法的外面,并且用static修饰

生成内部类引用不需要外部类引用的调用

class OuterClass{public int data1=1;public int data2=2;public static int data3=3;//静态内部类,外部类的里面,方法的外面,并且用static修饰static class InnerClass{public int data4=4;public int data5=5;public static int data6=6;//内部类的成员方法public void test(){System.out.println("InnerClass::test()");}}public void testA(){System.out.println("OuterClass::testA()");}

调用

静态内部类的实例化  

        OuterClass.InnerClass innerClass=new OuterClass.InnerClass();innerClass.test();

 调用外部类的成员变量,通过直接在静态内部类的成员方法中 实例化一个外部类对象,通过对象直接调用外部类的成员变量

//静态内部类的成员方法public void test(){System.out.println("InnerClass::test()");OuterClass outerClass=new OuterClass();System.out.println(data4);System.out.println(data5);System.out.println(data6);System.out.println("###########");System.out.println(outerClass.data1);System.out.println(data3);}

 结果

内部类和外部类共用同一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件

匿名内部类

定义和调用1

相当于一个类实现了这个接口,同时重写了test方法

//接口
interface ITestable{void test();
}public class Test4 {public static void main(String[] args) {
//匿名内部类new ITestable(){@Override//重写了接口的方法public void test() {System.out.println("test(");}}.test();//调用test方法  直接在后面.test方法}
}

调用方法2

通过引用对象it调用test方法

        ITestable it =new ITestable() {@Overridepublic void test() {System.out.println("test()");}};it.test();

 

局部内部类

定义和调用

定义在外部类的方法中的类

class OuterClass{public int  data1=1;public void testA(){//局部内部类 定义在方法里面  只能在当前方法中使用class InnerClass {public int data1=100;public static int data2=2;public void test(){System.out.println("InnerClass::test");}}
//局部内部类 只能在当前方法testA中使用InnerClass innerClass=new InnerClass();innerClass.test();}  
}

注意:

  • 局部内部类只能在所定义的方法体内部使用
  • 不能被public、static等修饰符修饰
  • 编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class
  • 几乎不会使用

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

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

相关文章

【数据结构与算法】之双向链表及其实现!

​ 个人主页:秋风起,再归来~ 数据结构与算法 个人格言:悟已往之不谏,知来者犹可追 克心守己,律己则安! 目录 1、双向链表的结构及概念 2、双向链表的实现 2.1 要实现的接口…

深度学习 Lecture 8 决策树

一、决策树模型(Decision Tree Model) 椭圆形代表决策节点(decison nodes),矩形节点代表叶节点(leaf nodes),方向上的值代表属性的值, 构建决策树的学习过程: 第一步:决定在根节点…

JAVA面试八股文之多线程相关

多线程 说一下并行和并发有什么区别?说一下线程和进程的区别?如果在java中创建线程有哪些方式?runnable 和 callable 两个接口创建线程有什么不同呢?线程包括哪些状态,状态之间是如何变化的?线程中的 wait …

若依前端分离版中使用二维码功能

一、安装 在前端项目工程目录,远端执行如下命令 // npm npm install vue-qr --save // yarn yarn add vue-qr 二、引入组件 在main.js文件中增加如下的内容 // vue2.x import VueQr from vue-qr //注册组件 Vue.component(VueQr, VueQr)// vue3.x import vueQr f…

代码随想录算法训练营第四十二天|01背包问题、416. 分割等和子集

动态规划 文章目录 一、01背包问题二、分割等和子集总结 一、01背包问题 1.在有限的背包内放入最高价值的东西 2.二维数据和一维数据都可以解决 3.二维数据,递推公式为dp[i][j] max(dp[i-1][j], dp[i-1][j-weight[i]]value[i]),分为两个状态&#xff0…

Towards Street-Level Client-Independent IP Geolocation(2011年)(第一部分)

被引次数:306 Wang Y, Burgener D, Flores M, et al. Towards {Street-Level}{Client-Independent}{IP} Geolocation[C]//8th USENIX Symposium on Networked Systems Design and Implementation (NSDI 11). 2011. Abstract 一个高度精确的客户端独立的地理定位服务将是互联…

箭头函数有哪些不适用场景

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

hyperf 二十九 修改器 二

教程:Hyperf 属性类型转换 Hyperf\Database\Model\Concerns\HasAttributes::casts被HasAttributes::setAttribute()、HasAttributes::getAttribute()调用,执行类型转换。 HasAttributes::casts为数组类型可设置基本类型或类的实例。默认设置主键id为int…

元类的执行

class MetaB(type):def __new__(cls, name, bases, attrs):print(f"使用元类 {cls.__name__} 创建{name}类 ")return super().__new__(cls, name, bases, attrs)class A(metaclassMetaB):passclass C(A):pass元类MetaB的__new__方法应该只会在创建类A时被调用一次, 因…

数据类型(基本数据类型和引用数据类型)

数据类型分为两种:基本数据类型和引用数据类型。 基本数据类型 有哪些:byte,short,int,long,float,double,char,boolean 整数类型:byte,short&a…

单例模式五种写法

单例模式五种写法 单例模式有五种写法:饿汉、懒汉、双重检验锁、静态内部类、枚举. 单例模式属于设计模式中的创建型模式 一、单例模式应用场景 windows的task manager(任务管理器)就是很典型的单例模式; windows的recycle bin(回收站)也是典型的单例应用&#…

Composer是什么?

Composer是PHP的一个依赖管理工具,它允许开发者声明项目所依赖的代码库,并在项目中自动安装这些依赖。它使用composer.json文件来定义项目的依赖关系,并使用composer.lock文件来锁定依赖的版本,以确保项目的稳定性和可重复性。 Co…

物联网的核心价值是什么?——青创智通

工业物联网解决方案-工业IOT-青创智通 物联网,这个词汇在当今的科技领域已经变得耳熟能详。但当我们深入探索物联网的核心价值时,我们会发现它远不止是一个简单的技术概念,而是一种能够彻底改变我们生活方式和工作方式的革命性力量。 物联网…

debian12.5国内镜像源配置清单

Debian 12.5在中国国内的镜像源清单,以及如何配置/etc/apt/sources.list文件的详细步骤: 1. 清华大学开源软件镜像站: - 替换/etc/apt/sources.list文件中的Debian默认源地址为清华大学的镜像地址。例如: deb https://mirrors.tu…

力扣周赛392复盘

3105. 最长的严格递增或递减子数组 题目 给你一个整数数组 nums 。 返回数组 nums 中 严格递增 或 严格递减 的最长非空子数组的长度。 思考: 返回什么:返回最长非空子数组的长度。return max(decs_len,incs_len); 但实际上我们只需要用一个变量ans就…

unity socket udp 连接

使用此方法有助于udp在局域网内稳定的连接运行,已经过验证,为了保持彻底的稳定,可以考虑加入ping-pang进行网络处理,如果为了安全,请使用加密TCP 如果您要在大规,大项目的游戏中使用网络技术,建…

[leetcode] max-area-of-island

. - 力扣(LeetCode) 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水&…

Java | Leetcode Java题解之第22题括号生成

题目&#xff1a; 题解&#xff1a; class Solution {static List<String> res new ArrayList<String>(); //记录答案 public List<String> generateParenthesis(int n) {res.clear();dfs(n, 0, 0, "");return res;}public void dfs(int n ,int…

牛客网刷题 | BC51 及格分数

描述 KiKi想知道他的考试分数是否通过&#xff0c;请帮他判断。从键盘任意输入一个整数表示的分数&#xff0c;编程判断该分数是否在及格范围内&#xff0c;如果及格&#xff0c;即&#xff1a;分数大于等于60分&#xff0c;是输出“Pass”&#xff0c;否则&#xff0c;输出“…

2024.4.13 蓝桥杯软件类C++B组山东省赛 小记

大三老狗了 &#xff0c; 还是把精力放在考研上了 &#xff0c;所以只是蓝桥杯的前一晚上把常用算法翻了翻。 其实还做了一场小模拟&#xff0c;两个题分值200分我狂砍了17分&#xff0c;bfs写半小时写不明白&#xff0c;所以晚上已经是心如死灰了&#xff0c;所以就早早睡觉了…