Java之内部类
目录
一.内部类
1.什么是内部类
2.内部类存在的原因
3. 内部类的分类
4.内部类的作用
二.成员内部类
1.基本概念
2.成员内部类的注意点
1.成员内部类可以用private方法进行修饰
2.成员内部类可以直接访问外部类的私有属性
3.外部类可以通过对象访问内部类的私有属性
4.成员内部类中不可以定义static属性和方法
3.产生内部类的对象
1.在外部类的内部产生内部类的对象
2.在外部类的外部产生内部类的对象
三.静态内部类
1.基本概念
2.静态内部类的注意点
1.静态内部类可以通过对象访问内部类的私有属性
2.静态内部类可以直接访问外部类的静态属性和方法
3.外部类通过对象访问静态内部类中的私有属性和方法
4.静态内部类中可以定义静态变量也可以定义成员变量
3.产生静态内部类的对象
1.在外部类的内部产生静态内部类
2.在外部类的外部产生静态内部类
四.成员内部类和静态内部类的对比
1.实际案例
2.两者差异
3.内部类的作用
4.编译后的class文件
五.方法内部类
1.基本概念
2.方法内部类的注意点
1.方法内部类不能使用任何的访问修饰符
2.方法内部类的声明周期只在方法调用的过程中存在
3.方法内部类中的访问范围
4.方法内部类形参不可改变
六.匿名内部类
1.基本概念
2.匿名内部类的示例
3.匿名内部类的使用 ----参数使用匿名内部类
一.内部类
1.什么是内部类
内部类:一个类嵌套在另一个类的内部,称这个嵌套类为内部类.
public class Outter {//内部类class Inner{}
}
2.内部类存在的原因
内部类是封装的一种体现,
人类和心脏类的关系就是一种内部类和外部类的关系
汽车发动机和汽车关系也是一种内部类和外部类的关系
3. 内部类的分类
根据定义的位置和使用的关键字的不同,可以分为以下四种内部类
- 成员内部类
- 静态内部类
- 方法内部类
- 匿名内部类
4.内部类的作用
- 内外部类可以更方便的访问彼此的私有属性
- 可以打破单继承的局限
具体的表现在下面慢慢的具体分析
二.成员内部类
1.基本概念
成员内部类:直接定义在类中,不加static定义的内部类就称为成员内部类
2.成员内部类的注意点
提示:可以把成员内部类类比为类中的成员方法
1.成员内部类可以用private方法进行修饰
我们都知道我们平常使用的类是不可以使用private关键字进行修饰的,因为这样在外部就无法访问到这个私有的类了,定义显得没有必要了.
但是成员内部类是可以用private关键字修饰的,表示在外部无法直接创建私有的成员内部类
public class Outter {private String name;//私有的内部类private class Inner {}}
2.成员内部类可以直接访问外部类的私有属性
在内部类Inner中,我们直接可以访问外部类的私有属性和私有方法,直接调用,不需要创建对象,类比为成员方法直接调用类中的私有属性和私有方法
直接调用的name相当于Outter.this.name
直接调用的fun()相当于Outter.this.fun()
public class Outter {private String name;//内部类private class Inner {private int num;private void test() {//直接在成员内部类直接访问外部类的私有属性System.out.println(name);fun();System.out.println("inner的test方法");}}private void fun() {System.out.println("外部类的fun方法");}}
3.外部类可以通过对象访问内部类的私有属性
外部类中是不可以直接访问内部类的属性和方法的,但是我们可以通过创建内部类的对象来访问内部类的私有属性和方法.
如果是一个普通的类,内部定义了私有的属性和方法,我们即使创建了对象,也不可以访问内部的私有属性和方法,但是外部类中定义了内部类的对象,我们是确实可以访问到内部类的私有属性和方法的
public class Outter {private String name;//内部类private class Inner {private int num;private void test() {//直接在成员内部类直接访问外部类的私有属性System.out.println(name);System.out.println("inner的test方法");}}private void fun() {//产生内部类的对象Inner inner = new Inner();//外部类中访问内部类的属性System.out.println(inner.num);inner.test();System.out.println("外部类的fun方法");}public static void main(String[] args) {Outter outter = new Outter();outter.fun();}
}
main方法的输出
0
null
inner的test方法
外部类的fun方法
4.成员内部类中不可以定义static属性和方法
类比于成员方法,在成员方法中是不可以定义static的属性的,因为方法的调用需要对象来调用,而static的变量是不需要对象调用的,这显然是矛盾的
3.产生内部类的对象
1.在外部类的内部产生内部类的对象
直接new出来内部类的对象即可
类名称 引用名称=new 类名称();
Inner inner = new Inner();
2.在外部类的外部产生内部类的对象
注意:如果成员内部类私有(private),无法在内部类的外部产生内部类的对象
外部类名称.内部类名称 内部类引用=new 外部类名称().new 内部类名称();
public class Test {public static void main(String[] args) {//在外部类的外部产生内部类的对象Outter.Inner inner = new Outter().new Inner();}
}
类比于成员方法:成员方法必须通过类的对象调用
同理:要产生内部类的对象,首先要产生外部类的对象
三.静态内部类
1.基本概念
静态内部类:直接定义在类的内部,使用staic关键字修饰,就成为静态内部类
2.静态内部类的注意点
注意:可以把静态内部类类比于静态方法
1.静态内部类可以通过对象访问内部类的私有属性
直接new外部类的对象,然后便可以访问其私有的属性和方法
因为静态内部类不需要依赖外部类的对象产生而产生,因此静态内部类中不能直接访问外部类的方法和属性,必须通过外部类的对象来访问,但是可以直接访问外部类的静态属性和方法
public class StaticOutter {private String name;static class inner {private int num;public void test() {//通过外部类的对象访问其私有属性和方法StaticOutter staticOutter = new StaticOutter();staticOutter.fun();System.out.println(staticOutter.name);}}private void fun() {System.out.println("外部类的fun方法");}
}
2.静态内部类可以直接访问外部类的静态属性和方法
public class StaticOutter {private String name;static int age;static class inner {private int num;public void test() {//直接访问外部类的静态属性和方法System.out.println(age);method();//通过外部类的对象访问其私有属性和方法StaticOutter staticOutter = new StaticOutter();staticOutter.fun();System.out.println(staticOutter.name);}}public static void method() {System.out.println("外部类的method方法");}private void fun() {System.out.println("外部类的fun方法");}
}
3.外部类通过对象访问静态内部类中的私有属性和方法
和成员内部类中的外部类访问内部类一样
public class StaticOutter {private String name;static int age;static class Inner {private int num;public void test() {//直接访问外部类的静态属性和方法System.out.println(age);method();//通过外部类的对象访问其私有属性和方法StaticOutter staticOutter = new StaticOutter();staticOutter.fun();System.out.println(staticOutter.name);}}public static void method() {System.out.println("外部类的method方法");}private void fun() {//外部类通过对象访问静态内部类中的私有属性和方法 Inner inner = new Inner();System.out.println(inner.num);System.out.println("外部类的fun方法");}
}
4.静态内部类中可以定义静态变量也可以定义成员变量
静态内部类可以看做相当于一个普通的类,只不过嵌套在了外部类的里面了而已
public class StaticOutter {private String name;static class Inner {private int num;static String address;public static void method(){System.out.println("静态内部类的静态方法method");}public void test() {//通过外部类的对象访问其私有属性和方法StaticOutter staticOutter = new StaticOutter();staticOutter.fun();System.out.println(staticOutter.name);}}private void fun() {//外部类通过对象访问静态内部类中的私有属性和方法Inner inner = new Inner();System.out.println(inner.num);System.out.println("外部类的fun方法");}
}
3.产生静态内部类的对象
1.在外部类的内部产生静态内部类
和成员内部类一样
类名称 引用名称=new 类名称();
Inner inner = new Inner();
2.在外部类的外部产生静态内部类
外部类名称.内部类名称 内部类引用=new 外部类名称.内部类名称();
静态内部类不需要外部类的对象,因此不需要创建外部类的对象
public class Test {public static void main(String[] args) {//在外部类的外部产生静态内部类的对象StaticOutter.Inner inner = new StaticOutter.Inner();}
}
四.成员内部类和静态内部类的对比
1.实际案例
成员内部类和外部类相当于人类和心脏,心脏的产生不能离开人的产生
而静态内部类和外部类相当于车和发动机,发动机可以立刻车独立存在
2.两者差异
成员内部类中包含了外部类的对象,能直接访问外部类的成员属性,不能定义静态属性
静态内部类中没有包含外部类的对象,不能直接访问外部类的成员属性,能定义静态属性和成员属性
3.内部类的作用
1.经过以上的分析,我们可以总结出内部类的一大作用就是可以直接访问外部类的私有属性和方法
2.我们知道一个子类只能继承一个父类,我们如果使用内部类,便可以写出类似多继承的子类,规避单继承的局限性,此时外部类中就包含了A和B的所有属性和方法
class A {}class B {}public class InnerClassExtends {class InnerA extends A {}class InnerB extends B {}}
4.编译后的class文件
Outter是外部类,Inner是内部类,中间用$符分隔开
五.方法内部类
1.基本概念
方法内部类:直接定义在方法中的类
2.方法内部类的注意点
注意:方法内部类可以类似于参数
1.方法内部类不能使用任何的访问修饰符
public class MethodInner {private String name;public void fun() {//在方法中定义的类技术就是方法内部类class Inner {}}
}
2.方法内部类的声明周期只在方法调用的过程中存在
方法调用结束之后自动销毁,方法内部类对方法外部完全隐藏
public class MethodInner {private String name;public static void fun() {//在方法中定义的类技术就是方法内部类class Inner {private int num;private void test() {//可以访问到外部类的私有System.out.println(new MethodInner().name);}}//可以通过对象访问到方法内部类的私有属性和方法//在这个方法之外无法new Inner对象Inner inner = new Inner();inner.test();System.out.println(inner.num);}
}
3.方法内部类中的访问范围
方法内部类中的方法是否需要new外部类取决于外部方法是static还是普通的
public class MethodInner {private String name;public void fun() {//在方法中定义的类技术就是方法内部类class Inner {private int num;public void test() {//可以访问到外部类的私有System.out.println(name);}}}
}
public class MethodInner {private String name;public static void fun() {//在方法中定义的类技术就是方法内部类class Inner {private int num;public void test() {//可以访问到外部类的私有System.out.println(new MethodInner().name);}}}
}
4.方法内部类形参不可改变
若方法内部类使用方法的形参,这个参数必须为形式上的参数(不能在类中修改该参数的值,JDK8之后),JDK8之前必须显式的定义为final
在方法内部类中调用了方法的形参,在方法内也不能改变其值;我们可以思考一下为什么.因为如果我们在方法内部类中调用了方法的形参,而此时我们在方法中修改了形参的值,无法确定调用的形参的值是原始的,还是修改过后的形参的值
总结:在方法内部类中只能访问方法内的参数,不能修改其值
方法形参是否有final取决于方法形参中是否使用了形参
六.匿名内部类
1.基本概念
匿名内部类:定义在方法之中,主要是在方法的形参上使用,这个类没有名字,一般默认继承一个类或者一个接口
2.匿名内部类的示例
interface IMessage {void print();
}public class NonNameMethod {public void fun() {new IMessage() {@Overridepublic void print() {}};}
}
上边的结构相当于这样进行转换的
3.匿名内部类的使用 ----参数使用匿名内部类
public static void main(String[] args) {compare(new Comparator() {@Overridepublic int compare(Object o1, Object o2) {return 0;}});}public static void compare(Comparator c) {System.out.println("compare方法");}
上面的compare方法需要传入一个接口对象,这个时候我们需要传入一个接口的实现类,实现向上转型,这个时候我们就需要使用匿名实现类了
相关文章:

Java之内部类
目录 一.内部类 1.什么是内部类 2.内部类存在的原因 3. 内部类的分类 4.内部类的作用 二.成员内部类 1.基本概念 2.成员内部类的注意点 1.成员内部类可以用private方法进行修饰 2.成员内部类可以直接访问外部类的私有属性 3.外部类可以通过对象访问内部类的私有属性 …...

【MyBatis】篇二.MyBatis查询与特殊SQL
文章目录1、MyBatis获取参数值case1-单个字面量类型的参数case2-多个字面量类型的参数case3-map集合类型的参数case4-实体类类型的参数case5-使用Param注解命名参数总结2、MyBatis的各种查询功能case1-查询结果是一个实体类对象case2-查询结果是一个List集合case3-查询单个数据…...
CE认证机构和CE证书的分类
目前,CE认证已普遍被应用在很多行业的商品中,也是企业商品进入欧洲市场的必备安全合格认证。在船舶海工行业中,也同样普遍应用,很多时候,对于规范中没有明确认证要求的设备或材料,而船舶将来还会去欧洲水域…...

Lesson 8.2 CART 分类树的建模流程与 sklearn 评估器参数详解
文章目录一、CART 决策树的分类流程1. CART 树的基本生长过程1.1 规则评估指标选取与设置1.2 决策树备选规则创建方法1.3 挑选最佳分类规则划分数据集1.4 决策树的生长过程2. CART 树的剪枝二、CART 分类树的 Scikit-Learn 快速实现方法与评估器参数详解1. CART 分类树的 sklea…...

【Unity】程序集Assembly模块化开发
笔者按:使用Unity版本为2021.3LTS,与其他版本或有异同。请仅做参考 一、简述。 本文是笔者在学习使用Unity引擎的过程中,产学研的一个笔记。由笔者根据官方文档Unity User Manual 2021.3 (LTS)/脚本/Unity 架构/脚本编译/程序集定义相关部分结…...
马尔可夫决策过程
1. 马尔可夫决策过程 马尔可夫决策过程不过是引入"决策"的马氏过程. Pij(a)P{Xn1j∣X0,a0,X1,a1,...,Xni,an1}P{Xnn1j∣Xni,ana}\begin{split} P_{ij}(a) & P\{X_{n1} j|X_0, a_0, X_1, a_1, ..., X_n i, a_n 1\} \\ &P\{X_n{n1} j|X_n i, a_n a\} \e…...

win11下载配置CIC Flowmeter环境并提取流量特征
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、下载CIC Flowmeter二、安装java、maven、gradle和IDEA1.java 1.82.maven3.gradle4.IDEA三、CICFlowMeter-master使用四、流量特征1.含义2.获取前言 配了一整…...

JDK如何判断自己是什么公司的
0x00 前言 因为一些事情,遇到了这样一个问题,JDK如何判断自己是什么公司编译的。因为不同的公司编译出来,涉及到是否商用收费的问题。 平时自己使用的时候,是不会考虑到JDK的编译公司是哪一个,都是直接拿起来用&#…...

大数据技术之HBase(二)HBase原理简介
一、HBase定义1.1 HBase定义HBase 是一种分布式、可扩展、支持海量数据存储的 NoSQL 数据库非结构化数据存储的数据库,基于列的模式存储。利用Hadoop HDFS作为其文件存储系统,写入性能很强,读取性能较差。利用Hadoop MapReduce来处理HBase中的…...

垒骰子(爆搜/DP)
动态规划方格取数垒骰子方格取数 题目描述 设有 NNN \times NNN 的方格图 (N≤9)(N \le 9)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 000。如下图所示(见样例): A0 0 0 0 0 0 0 00 0 13 0 …...

Telink之标准SDK的介绍_1
前提:常见的项目架构:应用层----》驱动层----》硬件层 1、软件组织架构 顶层⽂件夹( 8 个): algorithm,application,boot,common,drivers,proj_lib,stack,v…...

JNI内两种方式从C/C++中传递一维、二维、三维数组数据至Java层详细梳理
目录 0 前言 1 准备工作介绍 2 一维数组 2.1 return形式 2.2 参数形式 3 二维数组 3.1 return形式 3.2 参数形式 4 三维数组 4.1 return形式 4.2 参数形式 5 测试代码 6 结果说明 0 前言 就如之前我写过的一篇文章【JNI内形参从C代码中获取返回值并返回到Java层使…...
快递计费系统--课后程序(Python程序开发案例教程-黑马程序员编著-第3章-课后作业)
实例5:快递计费系统 快递行业高速发展,我们邮寄物品变得方便快捷。某快递点提供华东地区、华南地区、华北地区的寄件服务,其中华东地区编号为01、华南地区编号为02、华北地区编号为03,该快递点寄件价目表具体如表1所示。 表1 寄…...
JS - 自定义一周的开始和结束,计算日期所在月的周数、所在月第几周、所在周的日期范围
自定义一周的开始和结束,计算日期所在月的周数、所在月第几周、所在周的日期范围一. 方法使用二. 实现案例一. 方法使用 根据月开始日期星期几、月结束日期星期几,计算始周、末周占月的天数(每周周期段:上周六 —— 本周五&#x…...

Linux :理解编译的四个阶段
目录一、了解编译二、认识编译的四个阶段(一)预处理(二)编译(三)汇编(四)链接1.静态链接2.动态链接三、分步编译(一)创建.c文件(二)预…...

197.Spark(四):Spark 案例实操,MVC方式代码编程
一、Spark 案例实操 1.数据准备 电商网站的用户行为数据,主要包含用户的 4 种行为:搜索,点击,下单,支付 样例类: 2. Top10 热门品类 先按照点击数排名,靠前的就排名高;如果点击数相同,再比较下单数;下单数再相同,就比较支付数。 我们有多种写法,越往后性能越…...

Vue 项目如何迁移小程序
最近我们看到有开发者在社群里提出新的疑惑「我手头已经有一个成熟的 HTML5 项目了,这种项目可以转为小程序在 FinClip 环境中运行吗?」。 经过工作人员的沟通了解,开发者其实是想将已有的 Vue 项目转为小程序,在集成了 FinClip …...
unit1-问候以及介绍
unit1-问候以及介绍 重点表达 1、问好 使用hello 和 hi 来打招呼。hello可以使用在正式和非正式的场合。hi是非正式的。但是hello 和 hi 都可以在一天的任何时段使用。 Hello. 你好。 Hi! 嗨! 介绍你的姓名 使用 I’m 和 My name is 告诉别人你的名字。 I’m Pau…...

杂记——19.git上传时出现the remote end hung up unexpectedly错误
git是大家常用的项目版本控制工具,熟练地使用git可以提高开发效率,但是有时在使用git推送代码时,会提示“the remote end hung up unexpectedly”的问题,那么git推送代码提示“the remote end hung up unexpectedly”怎么解决呢&a…...
python123平台题目
作业二 1. 2的n次方描述输入格式输出格式输入输出实例代码解析2. 输出最大值描述输入格式输出格式输入输出示例代码解析3. 字符串输出描述输入格式输出格式输入输出示例代码解析4. 字符串长度描述输入格式输出格式输入输出示例代码解析...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...