当前位置: 首页 > news >正文

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. 内部类的分类

根据定义的位置和使用的关键字的不同,可以分为以下四种内部类

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

4.内部类的作用

  1. 内外部类可以更方便的访问彼此的私有属性
  2. 可以打破单继承的局限

具体的表现在下面慢慢的具体分析

二.成员内部类

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. 字符串长度描述输入格式输出格式输入输出示例代码解析...

ROS学习笔记(六):TF坐标变换

ROS学习笔记(六):TF坐标变换TF的基本知识TF工具tf_monitortf_echostatic_transform_publisherview_frames创建TF广播器创建TF监听器TF的基本知识 TF是一个让用户随时间跟踪多个坐标系的功能包,它使用树形数据结构,根据…...

【python】为你绘制玫瑰一束,爱意永存

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 若是有真情,爱意如溪水, 若是有真爱,爱意如阳光, 若是两情相悦,又岂在朝朝暮暮, 女子淡淡的情愫,深深地想念, 浓浓的爱意&a…...

智能家居创意产品一Homkit智能通断器

智能通断器,也叫开关模块,可以非常方便地接入家中原有开关、插座、灯具、电器的线路中,通过手机App或者语音即可控制电路通断,轻松实现原有家居设备的智能化改造。 随着智能家居概念的普及,越来越多的人想将自己的家改…...

【数据库】MySQL表的增删改查(基础命令详解)

写在前面 : 语法中大写字母是关键字,用[]括这的是可以省略的内容。文中截图是相对应命令执行完得到的结果截图。1.CRUD 注释:在SQL中可以使用“--空格描述”来表示注释说明.CRUD:即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首…...

2023年全国最新保安员精选真题及答案15

百分百题库提供保安员考试试题、保安职业资格考试预测题、保安员考试真题、保安职业资格证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 151.该图所要表达的是()消防器材。 A:地上消防栓 B:灭火器 …...

KPN对任意形状文本检测

文章目录一、研究背景二、方法流程1. 特征提取2. 核建议3. 实例无关特征图4. 轮廓生成5. 其余部分内容三、不足一、研究背景 相比起基于 FCN 网络的文本边缘检测网络,KPN网络可以更好地处理文本之间的间隔。 二、方法流程 1. 特征提取 FCN 和 FPN FCN(全卷积神经…...

同城外卖跑腿系统源码分析

外卖订餐已经成为很多“社畜”日常不可分割的一部分,足不出户,只需要一部电子设备即可在线订餐,并且可提供的选择非常多样化,与传统的电话订餐外卖模式相比也更便捷的多。 因此,同城外卖跑腿系统源码得以爆火&#xff…...

SCL_PFENET跑通填坑

1.数据准备:VOC2012数据集,initmodel文件夹(预训练模型),SegmentationClassAug数据2.训练部分:训练部分没什么需要改动的,也就改一下选择的配置文件。在config文件夹里有关于coco和voc数据的配置…...

Redis 做延迟消息队列

背景 看到消息队列,我们肯定会想到各种MQ,比如:RabbitMQ,acivityMQ、RocketMQ、Kafka等。 但是,当我们需要使用消息中间件的时候,并非每次都需要非常专业的消息中间件,假如我们只有一个消息队…...

刚果金FERI证书模板

FERI办理流程介(一)申请资料1:FERI APPLICATION FORM申请表格;2:草本海运提单(DRAFT B/L COPY);三:已盖章的商业发飘和箱单扫描件 (Commercial Invoice&Packing list&#xff09…...

网站跳转qq链接怎么做的/怎么推广

Python第三天 序列 5种数据类型 数值 字符串 列表 元组 字典 各种数据类型的的xx重写xx表达式 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Python第二天 变量 运算符与表达式 input()与raw_input()区别 字符编码 python转义…...

网站关键词优化报价/怎么开展网络营销推广

1、mongodb安装好后第一次进入是不需要密码的,也没有任何用户,通过shell命令可直接进入,cd到mongodb目录下的bin文件夹,执行命令./mongo即可运行如下:[rootnamenode mongodb]# ./bin/mongo MongoDB shell version: 1.8…...

深圳 网站 设计/推广网页

在某一次面试中,面试官问了我一个问题,他说,String str “1234”;如何在不使用 JDK自带方法的情况下,转换成 int i “123”。当时想法思路都有了,但是没写出来...... 本篇将讲述一下 String 与 int 两者之…...

wordpress支付宝/360推广登录入口

最近研究基于 GeoServer 的开源 GIS 框架,其中构建 GIS database 需要使用 PostgreSQL PostGIS 插件。花了些时间学习,这里记录一下。如有错误,感谢不吝指正~~本文地址:https://segmentfault.com/a/1190000…...

用什么做网站/陕西新站seo

MSQ是一种统计学方法,用于评估调查问卷的信度和效度。信度指的是调查问卷在不同时间或者不同环境下的一致性,效度指的是调查问卷对于衡量目标变量的准确性和有效性。 通常,在使用MSQ之前,需要设计问卷,并收集一定数量的…...

模板网站建设公司电话/网站建设需要多少钱

前言:最近因项目需求,需要打包linux-qt程序给客户先用一下子。百度一大堆终于找了几个靠谱的来综合一下,留为备用吧。由于是先遣版所以仅制作为免安装程序的格式。正文:博主的qt是5.9.2的,程序名称为ocs,下…...