JAVA内部类

ops/2024/10/19 5:25:20/

内部类 

Java内部类(Inner Class)是定义在另一个类(外部类)内部的一个类。这种嵌套类的定义允许更紧密的代码组织和更高的封装性。内部类可以访问其外部类的所有成员,包括私有成员,反之则不然。内部类可以有不同的修饰符,比如可以是私有的(private),保护的(protected),默认的(包内访问),或者静态的(static)。如果被static修饰,它只能访问外部类中的静态成员。

获取成员内部类对象的两种方式:

java">方式一:外部类编写方法,对外提供内部类对象方式二:直接创建格式:
外部类名.内部类名  对象名 = 外部类对象.内部类对象

内部类可以分为几种不同的类型:

成员内部类(非静态内部类)

这是最常见的内部类形式,它定义在外部类的成员位置。成员内部类对象隐含地持有其外部类对象的引用,因此可以访问外部类的所有成员,包括私有成员。创建成员内部类对象时,需要首先创建外部类对象,然后使用外部类对象来创建内部类对象。

java">public class OuterClass {  private int outerField = 100;  class InnerClass {  void display() {  System.out.println("Outer field value: " + outerField);  }  }  public static void main(String[] args) {  OuterClass outer = new OuterClass();  OuterClass.InnerClass inner = outer.new InnerClass();  inner.display();  }  
}
//在上面的示例中,InnerClass 是 OuterClass 的一个非静态内部类。
//在 main 方法中,我们首先创建了 OuterClass 的一个对象 outer,
//然后使用 outer 来创建 InnerClass 的对象 inner。
//注意我们使用 outer.new InnerClass() 来创建内部类的实例。
静态内部类

静态内部类使用static关键字修饰,它属于外部类本身,而不是外部类的某个对象。静态内部类只能访问外部类的静态成员。创建静态内部类对象时,不需要外部类对象,可以直接通过外部类来创建。

java">public class ABCD {//注意事项://1.静态内部类也是成员内部类的一种//2.静态内部类只能访问外部类中的静态变量和静态方法//如果想要访问非静态的需要创建外部类的对象//创建静态内部类对象的格式//外部类名.内部类名 对象名 = new 外部类名.内部类名();//调用静态方法的格式//外部类名.内部类名.方法名()//创建静态内部类的对象//只要是静态的东西,都可以用类名点直接获取int a=10;static int b=20;static class Inner{public void show1(){ABCD abcd=new ABCD();System.out.println(abcd.a);System.out.println(b);}public static void show2(){ABCD abcd=new ABCD();System.out.println(abcd.a);System.out.println(b);}}
}--------------------------------------------------public class OuterClass {  private static int staticOuterField = 200;  static class StaticInnerClass {  void display() {  System.out.println("Static outer field value: " + staticOuterField);  }  }  public static void main(String[] args) {  OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();  inner.display();  }  
}
//在上面的示例中,StaticInnerClass 是 OuterClass 的一个静态内部类。
//在 main 方法中,我们直接通过 OuterClass.StaticInnerClass 创建了
// StaticInnerClass 的一个对象 inner,而不需要先创建 OuterClass 的对象。

局部内部类

是定义在一个方法或作用域中的内部类。它与局部变量一样,不能使用访问控制修饰符(public、private和protected)和static修饰符修饰。局部内部类只在当前方法或作用域中有效,并且它可以访问外部类的所有成员,但只能访问当前方法中final类型的参数与变量。这种限制是为了确保局部内部类对象的生命周期与方法的执行期一致,防止在方法执行完毕后,局部内部类对象仍然持有对局部变量的引用,导致内存泄漏。外界无法直接使用,需要在方法内部创建对象并使用。该类可以直接访问外部类的成员,也可以访问方法内的局部变量。

匿名内部类

匿名内部类是没有名字的内部类,它通常用于创建某个接口或类的子类或实现类的对象,而无需显式定义这个子类或实现类。匿名内部类在定义时直接实例化,通常用于一次性的对象创建。

小练习:

打印a的值

java">package 内部类;public class Outer {private int a = 10;class Inner {private int a = 20;public void show() {int a = 30;System.out.println(a);//30System.out.println(this.a);//20System.out.println(Outer.this.a);//10}}
}
java">package 内部类;public class Test {public static void main(String[] args) {Outer.Inner oi = new Outer().new Inner();oi.show();}
}

内部类的用途

内部类在Java中有多种用途,包括但不限于:

  • 实现回调(Callback)或事件监听器(Event Listener)
  • 封装“只在一个地方使用”的类
  • 实现多重继承的功能(通过内部类继承其他类)
  • 实现类型安全的枚举(在Java 5之前)
  • 隐藏实现细节,使代码更整洁

http://www.ppmy.cn/ops/24391.html

相关文章

前端实现导入Excel进行数据展示、导出

需求 一个 excel 文档 需要对文档里面的数据进行筛选拆分重组 由于数据量巨大 后端又抽不出来手 于是使用纯前端解决方案 解决思路 前端导入excel 把 excel 的数据解析为 json 格式 对数据进行相应操作后 重新导出为新 excel 虽笨但有效 第一步 导入excel 该方案需引…

Docker(Docker的安装和介绍,常用命令,镜像制作,服务编排,docker私服)

目录 一、简介 1. docker简介 1 什么是docker 2 容器和虚拟机对比 2. 安装docker 1 docker相关概念 2 安装docker 1 安装docker 2 设置注册中心(仓库) 3. 小结 二、常用命令【重点】 1. 服务管理 2. 镜像管理 1 语法说明 2 使用练习 3. 容器管理 1 容器介绍 2…

c++判断一个数是否是2或3的n次方

判断一个数是否是2的n次方: bool fun(int n){return n>0&&(n&(-n))n; } 判断一个数是否是3的n次方: //方法1 如果这个数能被3整除,且最后是1,则一定是3的n次方 bool fun(int n){while(n&&n%30){n/3;}re…

5G工业数采网关的功能有哪些?-天拓四方

随着5G技术的不断发展,其在工业领域的应用日益广泛。5G工业数采网关作为连接工业设备与网络的重要枢纽,具备多种功能,为工业自动化、智能制造和智慧工厂提供了强大的支持。本文将详细解析5G工业数采网关的功能,并探讨其在工业领域…

UNIXRTC

这段代码是将写入的数据显示在OLED屏幕上,并进行读取。起初上电的时候可以发现W:后面为空,R:为0000 0000这是因为还没开始写入。按下按键后发现变换的数据是1235 5679,与我们写入的1234 5678不同,这是因为写入之前执行…

django序列化

path(get2/, views.HelloApiView().get), path(get2/, views.HelloApiView.as_view()) models class Student(models.Model):name models.CharField(max_length100,verbose_name姓名)age models.IntegerField(verbose_name年龄)sex models.BooleanField(default1,verbose_n…

【Jenkins】持续集成与交付 (九):Maven安装和配置、以及构建项目

🟣【Jenkins】持续集成与交付 (九):Maven安装和配置、以及构建项目 一、Maven简介二、持续集成环境安装Maven2.1 Maven软件包上传2.2 配置环境变量2.3 Jenkins配置关联JDK和Maven2.4 添加Jenkins全局变量2.5 修改Maven的settings.xml2.6 全局工具配置--设置自己的setting.…

Rtthread scons STM32外设 Kconfig文件配置

GPIO配置 config BSP_USING_GPIObool "Enable GPIO"select RT_USING_PINdefault y#UART配置 menuconfig BSP_USING_UARTbool "Enable UART"default yselect RT_USING_SERIALif BSP_USING_UARTconfig BSP_USING_UART1bool "Enable UART1"default…