【JavaSE篇】——内部类

2024-02-01 09:36
文章标签 java se 内部

本文主要是介绍【JavaSE篇】——内部类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

🎓内部类

🎈内部类的分类

🚩实例内部类

一.如何实例内部类对象

二.实例内部类中为什么不能有静态成员变量 (用final解决)

三.在实例内部类对象时,如何访问外部类当中相同的成员变量?

✅实例内部类总结 

🚩静态内部类

一.如何获取静态内部类对象

二.静态内部类中不能访问外部类非静态成员变量,如何访问呢?

✅实例内部类总结  

🚩局部内部类

✅局部内部类总结  

🚩匿名内部类

🎓对象的打印



🎓内部类

当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么这个内部的完整结构最好使用内部类。
我们看上面的定义来描述内部类,我们并不明白,这个只有到学习了后面的知识我们才知道内部类的真正用处在哪里,我们这章的话,我们需要掌握内部类的基本语法。
在 Java 中, 可以将一个类定义在另一个类或者一个方法的内部, 前者称为内部类,后者称为外部类 。内部类也是封装的一种体现。
public class OutClass {class InnerClass{}
}
OutClass是外部类   InnerClass是内部类
【注意事项:】
1. 定义在 class 类名 {} 花括号外部的,即使是在一个文件里,都不能称为内部类
2. 内部类和外部类共用同一个 java 源文件,但是经过编译之后,内部类会形成单独的字节码文件

🎈内部类的分类

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

🚩实例内部类

class OutClass {public int date1=10;public static int date2=11;int date3=12;class InnerClass{public int date4=13;// public static int date5=14;//error后面会讲述为什么错误int date6=15;public void func(){System.out.println("innerclass");}}public void func1(){System.out.println("outclass");}
}

我们在外部类和内部类都声明了成员方法和成员变量。我们该如何去实例内部类的对象呢?


一.如何实例内部类对象

大家可能第一想法就是:毕竟InnerClass是一个类嘛,然后我们直接new实例化对象,但是这是个内部类,不是普通的类,我们可以给这个内部类当作一个成员变量,当我们想要访问a,需要外部对象来访问a(对象.成员变量),那么我们想要访问内部对象,那么我们也需要通过外部对象引用去对象实例化。

俩种方法可以来对内部类进行实例化对象


 首先实例化外部类对象,然后通过外部类的实例化对象的引用或者匿名对象的引用。


二.实例内部类中为什么不能有静态成员变量 (用final解决)

我们上一篇讲述了static是在实例化对象之前加载内存的时候就进行了,所以static时机肯定快于创建类对象的时机。

在内部类中  内部类就和里面的定义的成员变量和成员方法一样都是OutClass类的成员,static修饰就相当于在成员中定义,上一篇我们也讲了(看下图),我们可以在成员方法里定义static变量嘛?是不行的,static修饰成员变量和成员方法,但是不能修饰成员方法里面的变量(统称类变量)

而下面的内部类就相当于OutClass中的方法,我们在方法中定义static,这不是相当于static修饰类变量吗?这是不可以的。static不能修饰成员中再嵌套里面的变量和方法的包括内部类。


那么如何再内部类中定义一个static修饰的变量呢?——引入final(final加以修饰的意思是相当于c语言中的const,是不能修改的称为常量) 

我们在这里修饰了,编译器再编译的时候是不能修改的了,date5的值是15那就是15,是不可以更改的。


我们现在会了如何实例化对象,我们就可以打印出来(内部类就在外部类里面同一个类中不受任何访问限定符限制,所以不管是private,public还是默认的default,proceted都是可以打印的。


三.在实例内部类对象时,如何访问外部类当中相同的成员变量?

这里在内部类不管是用this.date还是this.this.date都是不行,因为this.date是自己所属的就近原则和哪个类挨得近就访问哪个成员变量即使是变量名称相同。

方法一:在内部类成员方法中实例化外部类对象,然后对象.访问date1,即可打印10

方法二:我们可以利用this.date1来打印到内部类的成员变量的值,那我们可以调用外部类的this访问date1的值。

this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型,当前是在内部类的成员方法中调用,那么我们就会内部类对象的引用类型。

我们可以调用外部类的this就可以间接的访问到了外部类的成员变量。


✅实例内部类总结 
注意事项
1. 外部类中的任何成员都可以在实例内部类方法中直接访问(上面已解释(因为都在一个类中)
2. 实例内部类所处的位置与外部类成员位置相同,因此也受 public private 等访问限定符的约束(如果将类设置private那么外部类和内部类都是不可以访问的)
3. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this.同名成员 来访问(上面第三个问题)
4. 实例内部类对象必须在先有外部类对象前提下才能创建(上面第一个问题)
5. 实例内部类的非静态方法中包含了一个指向外部类对象this的引用 (上面第三个问题)
6. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。
(我们上面都说了内部类访问外部类中的成员,外部类如何访问内部类中的成员呢?)

  • 外部类——内部类  先创建内部类对象,然后访问
  • 内部类——外部类  直接访问

🚩静态内部类

static 修饰的内部成员类称为静态内部类。

一.如何获取静态内部类对象

static 修饰的内部类,称为静态内部类 ,静态内部类和静态成员变量最大的特性: 不属于某个具体的对象,是所有对象所共享的 。 直接用类名.访问。

二.静态内部类中不能访问外部类非静态成员变量,如何访问呢?

这就相当于静态成员方法(变量)不能访问非静态成员方法(变量)

外部类的非静态成员,需要外部类的对象引用才能访问。


✅实例内部类总结  
注意事项
  • 1. 在静态内部类中只能访问外部类中的静态成员 如果确实想访问,我们该如何做?

外部类的非静态成员,需要外部类的对象引用才能访问。(上面第二问)

  • 2. 创建静态内部类对象时,不需要先创建外部类对象

 不属于某个具体的对象,是所有对象所共享的 。 直接用类名.访问。


🚩局部内部类

定义在 外部类的方法体或者{}中 ,该种内部类只能在其定义的位置使用,一般使用的非常少,此处简单了解下语法 格式。

✅局部内部类总结  
注意事项
  • 1. 局部内部类只能在所定义的方法体内部使用
  • 2. 不能被publicstatic等修饰符修饰
  • 3. 编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class
  • 4. 几乎不会使用

🚩匿名内部类

new Person();

当我们访问成员变量的时候,匿名内部类它每次访问都是new,所以只能用一次。

 


🎓对象的打印

我们每次再类里定义成员变量的时候,我们发现每次都是System.out.println(name+" '"+age+" ")....,如果我们有100个成员变量呢?我们还是这样一直敲下去吗?显然不现实。

我们分析一下这下面打印的:

我们知道底层的这个地址如何实现,那么我们最终的目的还是需要对对象的成员变量打印。步骤如下:

注意:上面的@Override,java中的注解有很多,我们不能给上面的public String toString更改,不然就不符合。


生命是一颗长满可能的树。

这篇关于【JavaSE篇】——内部类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/666840

相关文章

Spring Security常见问题及解决方案

《SpringSecurity常见问题及解决方案》SpringSecurity是Spring生态的安全框架,提供认证、授权及攻击防护,支持JWT、OAuth2集成,适用于保护Spring应用,需配置... 目录Spring Security 简介Spring Security 核心概念1. ​Securit

SpringBoot+EasyPOI轻松实现Excel和Word导出PDF

《SpringBoot+EasyPOI轻松实现Excel和Word导出PDF》在企业级开发中,将Excel和Word文档导出为PDF是常见需求,本文将结合​​EasyPOI和​​Aspose系列工具实... 目录一、环境准备与依赖配置1.1 方案选型1.2 依赖配置(商业库方案)二、Excel 导出 PDF

SpringBoot改造MCP服务器的详细说明(StreamableHTTP 类型)

《SpringBoot改造MCP服务器的详细说明(StreamableHTTP类型)》本文介绍了SpringBoot如何实现MCPStreamableHTTP服务器,并且使用CherryStudio... 目录SpringBoot改造MCP服务器(StreamableHTTP)1 项目说明2 使用说明2.1

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Java中Arrays类和Collections类常用方法示例详解

《Java中Arrays类和Collections类常用方法示例详解》本文总结了Java中Arrays和Collections类的常用方法,涵盖数组填充、排序、搜索、复制、列表转换等操作,帮助开发者高... 目录Arrays.fill()相关用法Arrays.toString()Arrays.sort()A

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

Java堆转储文件之1.6G大文件处理完整指南

《Java堆转储文件之1.6G大文件处理完整指南》堆转储文件是优化、分析内存消耗的重要工具,:本文主要介绍Java堆转储文件之1.6G大文件处理的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言文件为什么这么大?如何处理这个文件?分析文件内容(推荐)删除文件(如果不需要)查看错误来源如何避