Java:就是要让你学会内部类

ubuntu18.04美化主题(完整版) 和网上的美化一样,但是我当初跟着博客美化的时候遇到一些问题,按博客的做法无法解决。 所以我自己也写一篇关于ubuntu18.04美化主题的博客。 第一步:安装主题工具:GNOME Tweaks sudo apt-get update sudo apt-get install gnome-tweak-tool 然后安装完成后我们打开Tweaks(截图如下): 第二步,修改窗口按钮位... 阅读详情

看了很多源码,都有用到内部类,但是自己以前在生产环境上,用的确实少,也有用过但是很少,所以今天就打算好好的把它从头到尾的过一遍。

定义

可以将一个类的定义放在里另一个类的内部,这就是内部类,所谓的内部类的概念只是出现在编译阶段,对于jvm层是没有内部类这个概念的。我们可以利用内部类来解决

  • 类的单继承问题,外部类不能再继承的类可以交给内部类继承

  • 我们可以通过定义内部类来实现一个类私属于一个类,实现更好的封装性

  • 代码优化:它需要更少的代码

分类

内部类可以分为:

  • 静态内部类。

  • 非静态内部类。

非静态内部类又可以分为:

  • 成员内部类。

  • 方法内部类。

  • 匿名内部类。

静态内部类

我感觉这个是用的最多的,你比如说Redis的key的设计, 因为我们要中间拼接:号,所以用静态内部类去组成不同的key是非常好的,这样可以让相同类型的key在同一个文件目录下

静态内部类的定义和普通的静态变量或者静态方法的定义方法是一样的,使用static关键字,只不过这次static是修饰在class上的,一般而言,只有静态内部类才允许使用static关键字修饰,普通类的定义是不能用static关键字修饰的,这一点需要注意一下。

下面定义一个静态内部类:

public class Out {
    private static String name;
    private int age;

    public static class In{
        private int age;
        public void sayHello(){

            System.out.println("my name is : "+name);
            //--编译报错---
            //System.out.println("my age is :"+ age);
        }
    }
}

在上述代码中,In这个类就是一个静态内部类。我们说内部类是可以访问外部类的私有字段和私有方法的,对于静态内部类,它遵循一致的原则,只能访问外部类的静态成员。

上述代码中,外部类的非静态私有字段age在静态内部类中是不允许访问的,而静态字段name则是可访问的。下面我们看,如何创建一个静态内部类的实例对象。

public static void main(String [] args){
    Out.In innerClass = new Out.In();
    innerClass.sayHello();
}

使用场景,一般来说,对于和外部类联系紧密但是并不依赖于外部类实例的情况下,可以考虑定义成静态内部类。下面我们看稍显复杂的成员内部类。

成员内部类

我们说了,四种不同类型的内部类都各自有各自的使用场景,静态内部类适合于那种和外部类关系密切但是并不依赖外部类实例的情况。但是对于需要和外部类实例相关联的情况下,可以选择将内部类定义成成员内部类。

以下代码定义了一个简单的成员内部类:

public class Out {
    private String name;

    public void showName(){
        System.out.println("my name is : "+name);
    }

    public class In{
        public void sayHello(){
            System.out.println(name);
            Out.this.showName();
        }
    }
}

以上定义了一个简单的内部类In,我们的成员内部类可以直接访问外部类的成员字段和成员方法,因为它是关联着一个外部类实例的。下面我们看看在外部是如何创建该内部类实例的。

public static void main(String [] args){
    Out out = new Out();
    out.setName("六脉神剑")
    Out.In in = out.new In();
    in.sayHello();
}

因为成员内部类是关联着一个具体的外部类实例的,所以它的实例创建必然是由外部类实例来创建的。

对于实例的创建,我们只需要记住即可,成员内部类的实例创建需要关联外部类实例对象,静态内部类实例创建相对简单。下面我们主要看看在编译阶段编译器是如何保持内部类对外部类成员信息可访问的。

使用场景,对于那种要高度依赖外部类实例的情况下,定义一个成员内部类则会显的更加明智。

方法内部类

方法内部类,顾名思义,定义在一个方法内部的类。方法内部类相对而言要复杂一些,下面定义一个方法内部类:

public class Out {
    private String name;

    public void sayHello(){
        class In{
            public void showName(){
                System.out.println("my name is : "+name);
            }
        }

        In in = new In();
        in.showName();
    }
}

我们定义了一个类,在该类中又定义了一个方法sayHello,然而在该方法中我们定义了一个内部类,类In就是一个方法内部类。我们的方法内部类的生命周期不超过包含它的方法的生命周期,也就是说,方法内部类只能在方法中使用。所以在声明的时候,任何的访问修饰符都是没有意义的,于是Java干脆不允许使用任何的访问修饰符修饰方法内部类。

其中还需要注意一点的是,定义和使用时两回事,别看那一大串定义类的代码,你实际想要使用该类,就必须new对象,而对于方法内部类而言,只能在方法内部new对象。这就是方法内部类的简单介绍,下面我们看看其实现原理。

有关方法内部类的实现原理其实是和成员内部类差不太多的,也是在内部类初始化的时候为其传入一个外部类实例,区别在哪呢?就在于方法内部类是定义在具体方法的内部的,所以该类除了可以通过传入的外部实例访问外部类中的字段和方法,对于包含它的方法中被传入的参数也会随着外部类实例一起初始化给内部类。

毋庸置疑的是,方法内部类的封装性比之前介绍的两种都要完善。所以一般只有在需要高度封装的时候才会将类定义成方法内部类。

匿名内部类

可能内部类的所有分类中,匿名内部类的名号是最大的,也是我们最常用到的,多见于函数式编程,lambda表达式等。下面我们重点看看这个匿名内部类。

匿名内部类就是没有名字的内部类,在定义完成同时,实例也创建好了,常常和new关键字紧密结合。当然,它也不局限于类,也可以是接口,可以出现在任何位置。

下面我们定义一个匿名内部类:

如果您必须重写类或接口的方法,则应该使用它。可以通过两种方式创建Java匿名内部类

//首先定义一个普通类
public class Out {
    private String name;

    public void sayHello(){
        System.out.println("my name is :" + name);
    }
}

~

//定义和使用一个匿名内部类
public static void main(String [] args){
    Out out = new Out(){
        @Override
        public void sayHello(){
            System.out.println("my name is cyy");
        }
        public void showName(){
            System.out.println("hello single");
        }
    };
    out.sayHello();
}

从上述代码中可以很显然的让我们看出来,我们的匿名内部类必定是要依托一个父类的,因为它是没有名字的,无法用一个具体的类型来表示。所以匿名内部类往往都是通过继承一个父类,重写或者重新声明一些成员来实现一个匿名内部类的定义。实际上还是利用了里式转换原理。

其实在看了上述三种内部类的原理之后,反而觉得匿名内部类的实现较为简单了。主要思路还是将内部类抽离出来,通过初始化传入外部类的实例以达到对外部类所有成员的访问。只是在匿名内部类中,被依托的父类不是他的外部类。

匿名内部类的主要特点在于,没有名字,对象只能被使用一次,可以出现在任意位置。所以它的使用场景也是呼之欲出,对于一些对代码简洁度有所要求的情况下,可首选匿名内部类。

总结

以上完成了对四种内部类的简单介绍,对于他们各自实现的原理也都已经介绍过了。其实大致相同,由于jvm对每个类都要求一个单独的源码文件,所以编译阶段就完成了分离的操作,但是在分离的过程中又要保持内部类和外部类之间的这种联系,于是编译器添加了一些接口保持这种信息共享的结构。

使用内部类可以大大增加程序的封装性,使得代码整体简洁度较高。

讲完这个后面的函数式接口 引用就好讲一点了

结尾

内部类就讲那么多,希望大家以后看源码会轻松点,哈哈,欢迎各路大佬点评

python基础:工作会用到的95%的基础python代码都在这了(万字详解!) 本文是一份Python编程语言的快速参考备忘单,涵盖了Python基础语法和常用数据类型。主要内容包括:Python入门指南(打印、变量声明)、内置数据类型(字符串、数值、列表、元组、集合、字典等)、控制结构(判断、循环)、函数定义、文件处理操作以及字符串操作方法(切片、循环遍历等)。这个备忘单特别适合初学者快速查阅Python基础语法,同时也提供了数据类型转换、f-string格式化字符串等实用技巧。通过简洁的代码示例展示了Python的基本语法规则和典型用法。 阅读详情

相关推荐

OCC WebGL案例编译实战:从FreeType配置到静态库生成

本文详细记录了将OCC(Open CASCADE Technology)3D图形库编译为WebAssembly(Wasm)并在浏览器中通过WebGL渲染的实战过程。重点解决了FreeType库的交叉编译配置、OCC核心库的裁剪与静态库生成,以及WebGL样例项目的CMake改造等关键步骤,为开发者提供了从环境搭建到最终集成的完整指南。

weixin_28831461的博客 317

Java面试:关于内部类有哪些必须掌握的知识

类的成员变量包括:属性,方法,构造器,内部类,代码块 内部类: 当一个事务的内部,还有一个部分需要完整的结构进行描述,而这个内部的完整结构又只为外部提高服务那么这个这个内部的完整结构就称为内部类 在java中,允许一个类定义位于另一个类的内部,前者称为内部类,后者称为外部类 内部类一般用于定义在类中或语句块之内,在外部引用时必须给出完整的名称,内部类的名字不能与其他外部类的名称相同 内部类的分类: 成员内部类 (static 成员的内部类和非static 的内部类) 局部内部类 (不谈修饰符)(

weixin_46351306的博客 270

CentOS 7下glibc升级到2.28的保姆级避坑指南(含GCC 7.3.1编译配置)

本文详细介绍了在CentOS 7系统中将glibc升级到2.28版本的完整流程,包括GCC 7.3.1的编译配置、环境变量设置、glibc编译的细节处理以及生产环境验证。文章特别强调了风险控制和避坑技巧,适用于需要提升系统兼容性的企业级用户。

weixin_29611239的博客 409

Java内部类学习

前言 由于Java语言不支持多继承,而在实际开发中可能会面临多重继承的场景的,内部类便可派上用场了。 内部类 java内部类分为: 成员内部类、静态内部类、方法内部类、匿名内部类 。 成员内部类 顾名思义,成员内部类作为类的成员,存在于某个类的内部。成员内部类可以调用外部类的所有成员,但只有在创建了外部类的对象后,才能调用外部的成员。 public class OutClass...

懋懋之为 224

51单片机定时器的原理、应用与编程实现

本文系统介绍了51单片机定时器的基本原理与应用。首先阐述了定时器的工作原理,包括定时模式和计数模式的区别。然后详细讲解了定时器的四种工作模式(方式0-方式3)及其适用场景,并分析了相关寄存器(TMOD、TCON、THx/TLx)的功能设置。文章还给出了定时器编程的具体步骤,包括初始化、计数初值计算和示例代码。最后通过LED闪烁、PWM波形产生、脉冲计数等实际应用案例,展示了定时器的多样化应用。掌握这些知识对嵌入式系统开发具有重要意义。

2501_91227323的博客 1524

Aveva Marine C# 二次开发入门001

1# 引用 C:\AVEVA\Marine\OH12.1.SP4\Aveva.ApplicationFramework.dll C:\AVEVA\Marine\OH12.1.SP4\Aveva.ApplicationFramework.Presentation.dll 2# 引用命名空间, using Aveva.ApplicationFramework.Presentation;usi...

weixin_30245867的博客 1911

java基础之-内部类

1、内部类定义 定义:内部类(inner class)其实听名字好理解:就是定义在一个类中的类 看功能:(具体看后面的举栗) 内部类可以对同一个包中的其他类隐藏 内部类方法可以访问定义这个类的作用域中的数据,包括原本私有的数据 2、来看看吧,热身运动 (1)来个例子 我相信大家都用过,但是你可能不知道它底层是这样通过内部类来实现的。先康康如下代码吧! 既然能通过ArrayList的实例去调用一个Iterator的实例,说明它内部肯定有实现,点进去看一下。 点到了这里:这个AbstractLis

热爱编写程序的药学在读书 340

基于TL431与MOSFET的高效过压保护电路设计详解

本文详细解析了基于TL431与MOSFET的高效过压保护电路设计。通过TL431精准监测电压,驱动MOSFET作为主开关,实现快速可靠的电源保护。文章涵盖电路原理、参数计算、性能优化及实战调试要点,为电子设备提供了一套经典且成本低廉的过压保护解决方案。

weixin_29215391的博客 783

fegin需要实现类_Java:就是要让你学会内部类

作者:六脉神剑juejin.im/post/5df0a84fe51d4557f544f7ac看了很多源码,都有用到内部类,但是自己以前在生产环境上,用的确实少,也有用过但是很少,所以今天就打算好好的把它从头到尾的过一遍。定义可以将一个类的定义放在里另一个类的内部,这就是内部类,所谓的内部类的概念只是出现在编译阶段,对于jvm层是没有内部类这个概念的。我们可以利用内部类来解决类的单继承问题,外部类不...

weixin_39559333的博客 93

2025.05.29【Network】多组学分析:网络互作图绘制

本文介绍了使用R语言进行网络图绘制的方法与技巧。重点讲解了三个核心R包的使用:igraph用于网络图数据准备与基础绘制,ggraph基于图形语法实现高级可视化,networkD3则为网络图添加交互功能。文章涵盖了从基本概念、包安装、创建网络图对象,到自定义样式布局、添加交互性等完整流程,并提供了度分布、聚类系数等网络分析指标的计算方法。通过清晰的代码示例,帮助读者掌握生物信息学数据可视化的关键技能,为复杂数据的直观展示和分析提供实用工具。

228

【小白CV教程】YOLOv5+Deepsort实现车辆行人的检测、追踪和计数

【小白CV教程】YOLOv5+Deepsort实现车辆行人的检测、追踪和计数本文禁止转载!项目简介:YOLOv5检测器:DeepSort追踪器:运行demo:训练自己的模型:调用接口:创建检测器:调用检测接口: 本文禁止转载! 项目简介: 使用YOLOv5+Deepsort实现车辆行人追踪和计数,代码封装成一个Detector类,更容易嵌入到自己的项目中。 代码地址(欢迎star): https://github.com/Sharpiless/Yolov5-deepsort-inference 最终效果:

梁瑛平的博客 5万+

30天学会Java-08:接口与内部类

Java接口(Interface)是一种特殊的抽象类型,定义行为规范但不提供具体实现,支持多重继承和系统解耦。接口可包含常量、抽象方法(Java8前)、默认方法(Java8)、静态方法(Java8)和私有方法(Java9)。类通过implements实现接口,必须重写所有抽象方法。接口与抽象类的主要区别在于:接口支持多实现而非单继承、不能有构造方法、成员变量必须是常量、方法默认公开等。接口还能实现多态,接口类型的引用可指向任何实现类的对象。此外,Java还提供内部类机制,允许在一个类内部定义另一个类,增强封

smileKH的博客 919

RK3568平台YOLO11模型部署实战:从环境搭建、模型转换到板端性能优化全解析

摘要: 本文详细介绍了在RK3568平台上从零部署YOLO11模型的完整流程。主要内容包括:1) 基于Conda搭建Python 3.8开发环境并安装RKNN-Toolkit2工具链;2) 使用LabelImg工具标注数据并构建YOLO格式数据集;3) 基于Ultralytics框架进行YOLO11模型训练及参数优化;4) 实现PyTorch→ONNX→RKNN的完整模型转换链。文章特别针对RK3568平台的NPU特性提供了关键参数配置建议,并分享了实际开发中的经验总结,最终可达到30FPS的稳定推理性能。

LXY_LOVE36的博客 282

pythong将一个类的实例传入另一个类_Java:就是要让你学会内部类

点击上方“Java知音”,选择“置顶公众号”技术文章第一时间送达!作者:六脉神剑juejin.im/post/5df0a84fe51d4557f544f7ac看了很多源码,都有用到内部类,但是自己以前在生产环境上,用的确实少,也有用过但是很少,所以今天就打算好好的把它从头到尾的过一遍。定义可以将一个类的定义放在里另一个类的内部,这就是内部类,所谓的内部类的概念只是出现在编译阶段,对于jv...

weixin_39638309的博客 175

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java:就是要让你学会内部类,java从入门到精通第五版电子书下载微盘

内部类可以分为: 静态内部类。 非静态内部类。 非静态内部类又可以分为: 成员内部类。 方法内部类。 匿名内部类。 静态内部类 我感觉这 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》 【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享 个是用的最多的,你比如说Redis的key的设计, 因为我们要中间拼接:号,所以用静态内部类去组成不同的key是非常好的,这样可以让相同类型的key在同一个文件目录

m0_64384202的博客 564

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

21天学会Java之(Java SE第六篇):抽象方法和抽象类、接口、内部类

文章目录抽象方法和抽象类抽象方法抽象类抽象类的概念以及使用为什么需要抽象类接口接口的概念接口的使用接口与抽象类的区别使用一个人的例子更直观的了解下接口:内部类内部类的概念内部类的作用内部类的分类成员内部类非静态内部类静态内部类匿名内部类局部内部类 抽象方法和抽象类 抽象方法 使用abstract修饰的方法,没有方法体,只有声明。定义的是一种规范,就是告诉子类必须要给抽象方法提供具体的实现(子类也可...

小志Coding笔记 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

静态内部类实现单例_Java语言:单例模式的六种实现方法,你学会了吗?

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。懒汉式当第一次调用的时候才会创建对象,合理占用资源。/** * 懒汉式(线程安全) */public class Singleton01 {...

weixin_39799646的博客 416

【韩老师零基础30天学会Java 06】单例9种实现:双重检查锁,红绿灯防反射,CAS。模板设计模式,接口,四大内部类:局部,匿名,成员,静态

单例9种实现:双重检查锁,红绿灯防反射,CAS。模板设计模式,接口,四大内部类:局部,匿名,成员,静态

qq120631157的博客 182

Java—— 一篇文章学会所有内部类

包含内部类所有内容:什么是内部类。什么时候用内部类。内部类的访问特点。内部类的分类。成员内部类,编写成员内部类注意点,获取成员内部类对象的两种方式,成员内部类如何调用外部类的成员变量。静态内部类,注意事项,创建静态内部类对象的格式,如何调用静态内部类中的方法。局部内部类,注意事项,代码演示。匿名内部类,什么是匿名内部类,匿名内部类的格式,格式的细节,使用场景。

zjy_ccccc的博客 2260

3分钟学会java内部类

成员内部类 public class Outer { public int number; /* * 1.成员内部类 * a.创建成员内部类的对象必须依赖与外部类对象 * b.成员内部类中不能有static成员 * c.访问外类的属性和方法可以通过外部类.this.xxxx * d.外部类不能直接访问内部的成员,必须通过类部类的对象 */ public class MemberInner{ public int number; public void fun() {

m0_46565121的博客 150

一个月学会Java 第14天 内部类

一个月学会Java 第14天 内部类

XingZaiUnrivaled的博客 686

java内部类的作用分析

提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比。内部类从表面上看,就是在类中又定义了一个类(下文会看到,内部类可以在很多地方定义),而实际上并没有那么简单,乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了解,你会发现Jav

6万+

java内部类有什么好处?为什么需要内部类?

提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比。内部类从表面上看,就是在类中又定义了一个类(下文会看到,内部类可以在很多地方定义),而实际上并没有那么简单,乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了解,你会发现Java的

一个执着的程序员 1万+

学会使用静态内部类

示例代码demo: import java.math.BigDecimal; /** * 使用静态内部类提高封装性,车类 */ public class Car { //车名 private String name; //售价 private BigDecimal price; public String getName() { return name; } public void setName(String name) {

硅脂味咖啡的博客 998
上一篇: Java 类中可以覆盖静态方法吗?
下一篇: Java基础知识总结
Java奥利给
博客等级 码龄6年 150粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值