Java 内部类的四种实现方式

article/2025/10/11 23:56:23

Java 内部类的四种实现方式


前言

今天的话我将为大家介绍Java的四种内部类,他们分别是普通内部类,静态内部类,局部内部类,匿名内部类。


提示:以下是本篇文章正文内容,下面案例可供参考

一、内部类是什么?

  • 当一个类的定义出现在另外一个类的类体中时,那么这个类叫做内部类(Inner),而这个内部类所在的类叫做外部类(Outer)。

  • 当一个类存在的价值仅仅是为某一个类单独服务时,那么就可以将这个类定义为所服务类中的内部类,这样可以隐藏该类的实现细节并且可以方便的访问外部类的私有成员而不再需要提供公有的get和set方法。

二、内部类的分类

2.1 普通内部类

普通内部类-直接将一个类的定义放在另外一个类的类体中。(对象层级)

这种内部类的写法其实和外部类也基本是一致的。

普通内部类的特点:

  • 普通内部类可以使用的关键字为:public,private,protected,final,abstract
  • 普通内部类和普通类一样可以定义成员变量、成员方法以及构造方法等。
  • 普通内部类需要使用外部类对象来创建对象。
  • 如果内部类访问外部类中与本类内部同名的成员变量或方法时,需要使用this关键字。
    语法格式:
访问修饰符 class 外部类的类名{访问修饰符 class 内部类的类名{内部类的类体;}
} 

案例:

package com.lagou.task03.generalClass;/*** @author 云梦归遥* @date 2021/11/22 16:18* @description*/
public class GeneralClass {private int cnt;public GeneralClass() {}public GeneralClass(int cnt) {setCnt(cnt);}public int getCnt() {return cnt;}public void setCnt(int cnt) {this.cnt = cnt;}public void show() {System.out.println("Outer class: " + getCnt());}// 创建第一种内部类:普通内部类public class InnerClass {private int cnt;public InnerClass() {}public InnerClass(int cnt) {setCnt(cnt);}public int getCnt() {return cnt;}public void setCnt(int cnt) {this.cnt = cnt;}public void show() {// 当内部类和外部类成员变量名相同时// 上面三种都是获取 内部类 成员变量的方法// 最后一种是获取 外部类 成员变量的方法System.out.println("Inner class: " + getCnt());System.out.println("Inner class: " + this.getCnt());System.out.println("Inner class: " + InnerClass.this.getCnt());System.out.println("Outer class: " + GeneralClass.this.getCnt()); // 使用 this 关键字}}
}

对应的测试类:

package com.lagou.task03.generalClass;/*** @author 云梦归遥* @date 2021/11/22 16:33* @description*/
public class GeneralClassTest {public static void main(String[] args) {GeneralClass generalClass = new GeneralClass(3);// 使用外部类对象 实例化 内部类对象GeneralClass.InnerClass innerClass = generalClass.new InnerClass(33);generalClass.show(); // Outer class: 3innerClass.show();// Inner class: 33//Inner class: 33//Inner class: 33//Outer class: 3}
}

运行结果:
在这里插入图片描述

2.2 静态内部类

静态内部类-使用static关键字修饰的内部类,隶属于类层级。(类层级)
语法格式:

访问修饰符 class 外部类的类名{访问修饰符 static class 内部类的类名{内部类的类体;}
} 

静态内部类的特点:

  • 静态内部类不能直接访问外部类的非静态成员。
  • 静态内部类可以直接创建对象。
  • 如果静态内部类访问外部类中与本类内同名的成员变量或方法时,需要使用类名.的方式访问。

静态内部类调用外部类中的成员变量:

  • 第一种方式可以将静态外部类的类型写为static,然后在静态内部列使用 类名. 的形式引用
  • 第二种方式可以在静态内部类中 new 对象,然后进行引用

案例:

package com.lagou.task03.staticClass;/*** @author 云梦归遥* @date 2021/11/22 16:41* @description*/
public class StaticClass {private static int cnt;private int cnt2;public StaticClass() {}public StaticClass(int cnt) {setCnt(cnt);}public static int getCnt() {return cnt;}public void setCnt(int cnt) {this.cnt = cnt;}public int getCnt2() {return cnt2;}public void setCnt2(int cnt2) {this.cnt2 = cnt2;}public void show() {System.out.println("Outer class: " + getCnt());}// 创建第二种内部类:静态内部类public static class InnerClass {private int cnt;public InnerClass() {}public InnerClass(int cnt) {setCnt(cnt);}public int getCnt() {return cnt;}public void setCnt(int cnt) {this.cnt = cnt;}public void show() {// 当内部类和外部类成员变量名相同时// 上面三种都是获取 内部类 成员变量的方法System.out.println("Inner class: " + getCnt());System.out.println("Inner class: " + this.getCnt());System.out.println("Inner class: " + InnerClass.this.getCnt());// 最后一种是获取 外部类 成员变量的方法,// 1.静态内部类中调用外部的变量必须也是静态的才行System.out.println("Outer class: 静态成员变量 " + StaticClass.getCnt());// 2.在静态内部类中 new 外部类的对象,然后进行引用StaticClass staticClass = new StaticClass();staticClass.setCnt2(555);System.out.println("Outer class: 非静态成员变量 " + staticClass.getCnt2());}}
}

对应的测试代码:

package com.lagou.task03.staticClass;/*** @author 云梦归遥* @date 2021/11/22 16:49* @description*/
public class StaticClassTest {public static void main(String[] args) {StaticClass staticClass = new StaticClass(5);StaticClass.InnerClass innerClass = new StaticClass.InnerClass(55);staticClass.show(); // Outer class: 5innerClass.show();// Inner class: 55//Inner class: 55//Inner class: 55//Outer class: 静态成员变量 5//Outer class: 非静态成员变量 555}
}

运行结果:
在这里插入图片描述

2.3 局部内部类

局部内部类-直接将一个类的定义放在方法体的内部时。(方法块层级)
语法格式:

访问修饰符 class 外部类的类名{访问修饰符 返回值类型 成员方法名(形参列表){class 内部类的类名{内部类的类体;}} 
} 

局部内部类的特点:

  • 局部内部类只能在该方法的内部可以使用。
  • 局部内部类可以在方法体内部直接创建对象。
  • 局部内部类不能使用访问控制符和static关键字修饰符
  • 局部内部类可以使用外部方法的局部变量,但是必须是final的。由局部内部类和局部变量的声明周期不同所致。

案例:

package com.lagou.task03.areaClass;/*** @author 云梦归遥* @date 2021/11/22 16:58* @description*/
public class AreaClass {private int cnt;public AreaClass(int cnt) {setCnt(cnt);}public int getCnt() {return cnt;}public void setCnt(int cnt) {this.cnt = cnt;}public void show() {System.out.println("Outer class: " + getCnt());// 如果 内部类要使用 局部变量,为了保证数据的一致性,将局部变量设置为 final// 添加的原因:局部变量比局部内部类的作用范围更大,当局部内部类在使用时,会在底层从局部变量复制一份到局部内部类// 如果不使用final,当在局部内部类的外部修改这个变量的值以后,就会造成数据的不一致性final int snt = 6666;// 局部内部类不需要,也不能使用 访问控制符 和 static 进行修饰class InnerClass {private int cnt;public InnerClass() {}public InnerClass(int cnt) {this.cnt = cnt;}public int getCnt() {return cnt;}public void setCnt(int cnt) {this.cnt = cnt;}public void show() {System.out.println("Inner class: " + getCnt());System.out.println("snt : " + snt);}}InnerClass innerClass = new InnerClass(666);innerClass.show();}
}

对应的测试类:

package com.lagou.task03.areaClass;/*** @author 云梦归遥* @date 2021/11/22 17:06* @description*/
public class AreaClassTest {public static void main(String[] args) {AreaClass areaClass = new AreaClass(66);areaClass.show();// Outer class: 66//Inner class: 666//snt : 6666}
}

运行结果:
在这里插入图片描述

2.4 匿名内部类(最常用)

匿名内部类-就是指没有名字的内部类。
语法格式:

  • 常规写法:
接口/父类类型 引用变量名= new 接口/父类类型() { 方法的重写};
  • lambda写法(Java8之后的特性)
(参数列表) -> (方法体)

案例:

package com.lagou.task03.anonymousClass;/*** @author 云梦归遥* @date 2021/11/22 17:39* @description*/
public interface AnonymousInterface {public void show();
}

对应的测试类:

package com.lagou.task03.anonymousClass;/*** @author 云梦归遥* @date 2021/11/22 17:42* @description*/
public class AnonymousInterfaceTest {public static void main(String[] args) {// 第一种:匿名内部类,常规写法AnonymousInterface anonymousInterface = new AnonymousInterface() {@Overridepublic void show() {System.out.println("这是 匿名内部类 常规写法");}};anonymousInterface.show(); // 这是 匿名内部类 常规写法// 第二种:匿名内部类,lambda写法,更加简单(Java8)AnonymousInterface anonymousInterface1 = () -> System.out.println("这是 匿名内部类 lambda写法");anonymousInterface1.show(); // 这是 匿名内部类 lambda写法}
}

在这里插入图片描述

三,总结

以上就是Java的四种内部类的实现方式,相对来说,匿名内部类会更常用一些,而且匿名内部类如果使用lambda写法会更加的简洁。

好了,本期内容就到这里,谢谢大家。



http://chatgpt.dhexx.cn/article/CeWuPlIK.shtml

相关文章

Java内部类

Java内部类 内部类成员内部类局部内部类匿名内部类静态内部类常规面试案例内部类实例化对象重名变量的引用 内部类 是什么? 字面意思,在类的内部编写的类就叫内部类! 为了方便区分、学习、理解我们一般将内部类分为以下几种! 内部…

java内部类赋值_详解 Java 内部类

内部类在 Java 里面算是非常常见的一个功能了,在日常开发中我们肯定多多少少都用过,这里总结一下关于 Java 中内部类的相关知识点和一些使用内部类时需要注意的点。 从种类上说,内部类可以分为四类:普通内部类、静态内部类、匿名内部类、局部内部类。我们来一个个看: 普通…

java new 一个内部类_java内部类

java内部类的几种类型:成员内部类,静态内部类,方法内部类,匿名内部类。 成员内部类:成员内部类是类内部的非静态类。成员内部类不能定义静态方法和变量(final修饰的除外)。这是因为成员内部类是非静态的,类初始化的时候先初始化静态成员,如果允许成员内部类定义静态变量…

java中的内部类

java中的内部类主要分为两类四种: 第一类:定义在外部类局部位置上,分为局部内部类( 有 类名)、匿名内部类(没有类名)。 第二类:定义在外部类的成员位置上,分为成员内部类(没有static修饰)、静态内部类(使用static修饰…

java内部类最全详解

1、成员内部类 内部类与外部类的关系 a.成员内部类的创建需要依赖于外部类对象-(成员方法必须通过对象调用),在没有外部类实例之前无法创建成员内部类对象 b.内部类与外部类相对独立,不是is a 的关系(发动机-汽车&am…

Java内部类详解(含:成员内部类、局部内部类、匿名内部类、静态内部类)

内部类是什么? 字面意思,在类的内部编写的类就叫内部类!即一个类的内部又完整的嵌套了另一个类结构,被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。 内部类是类的第五大成员→【提示:类的五大成员…

分享15款很棒的 JavaScript 开发工具javascript

在开发中,借助得力的工具可以事半功倍。今天,这篇文章向大家分享最新收集的15款非常有用的 javascript 开发工具。 testswarm: continious & distributed js testing testswarm是mozilla实验室推出的一个开源项目,它旨在为开发者提供在多个浏览器版本上快速轻松测试自己j…

27 个面向开发人员的最佳 Vue.js 开发工具

英文 | https://javascript.plainenglish.io/best-27-vuejs-development-tools-for-developers-bd972bb5f573 01、BootstrapVue 地址:https://bootstrap-vue.org/ 一个用于 Vue.js 构建引导接口的开源库。 02、Vuex 地址:https://vuex.vuejs.org/ Vue.js…

15 款非常有用的 JavaScript 开发工具

开发者有个趁手的工具将事半功倍。今天这篇文章分享给大家最新的15款非常有用的JavaScript 开发工具。 列表如下: TestSwarm: Continious & Distributed JS Testing TestSwarm提供分布式的JavaScript持续集成测试。最初它的创造者John Resig只是将它作为…

03【WebStorm开发工具】

上一篇:02【HTML快速入门】 下一篇:04【】 目录:【HTML5系列教程】 文章目录 三、WebStorm开发工具3.1 WebStorm简介3.2 WebStorm安装3.3 WebStorm基本使用3.3.1 创建项目3.3.2 调整字体大小3.3.3 代码自动补全3.3.4 WebStorm常用快捷键 三…

web开发者工具 js

作为Web开发人员,我为什么喜欢Google Chrome浏览器 【原文地址:http://www.cnblogs.com/QLeelulu/archive/2011/08/28/2156402.html 】 在Google Chrome浏览器出来之前,我一直使用FireFox,因为FireFox的插件非常丰富,更…

JavaScript 专用开发工具

下载地址:http://soooh.com/3/jsedit.rar javaScript专用编辑工具,免费绿色版,需要.net2.0才能运行。 特色:左侧能列出javascript的函数列表,适合修改很大的js文件。

顶级 Vue.js 开发工具

Vue.js已成为当前最热门的JavaScript前端框架。Vue 是构建有用应用程序和网站的完美选择,无论你是经验丰富的开发人员,正希望切换到 Vue 上,还是刚刚开始工作的新人——选择正确的工具都是非常重要的。在合适的工具帮助下,你就能快…

JavaScript开发工具大全

译文:https://blog.fundebug.com/2017/06/19/javascript-tool-list/ 原文:https://da-14.com/blog/ultimate-list-javascript-tools \简介 2017年1月,Stack Overflow年度开发者调研一共访问了64000个程序员,发现JavaScript已经连续…

前端(HTML css JS)开发工具及常用插件推荐

前端编程工具有很多,例如Visual Studio Code(简称VS code),hbuilder,sublime text3,notepad,webstorm等等,今天给大家推荐的是VS code VS code是一个完全免费的软件,页面…

十款最新的JavaScript开发工具

JavaScript 自推出后就大受开发者的青睐,基于 JavaScript 的开发工具不计其数,开发者们可以灵活选择,轻松构建应用。本文分享了十款最新的 JavaScript 开发工具,喜欢的话就赶紧 mark! 1. Kreate 这款工具有助于对 jQu…

9个最好用的JavaScript开发工具和代码编辑器

Web设计和开发是现今越来越流行的职业方向之一。工欲善其事,必先利其器,如果你想在这个领域出类拔萃,那么你就必须具备一些优秀的技能,例如能操作不同的平台、IDE和其他各种各样的工具。 谈到平台和IDE,现在已经不是以…

js基础篇-开发工具

一. Javascript的开发工具主要包括浏览器和代码编辑器 浏览器:用于执行,调试js代码。 代码编辑器:用于编写代码。 1. 常见的浏览器 开发商浏览器特点MicrosoftInternet Explorerwindows操作系统的内置浏览器,用户数量较多Micros…

推荐15款很棒的 JavaScript 开发工具

在开发中,借助得力的工具可以事半功倍。今天这篇文章与大家分享最近发现的一些有用的 JavaScript 和 jQuery 的开发工具,库和插件。希望这些工具在你你即将到来的项目中能用得上。 01、TestSwarm: Continious & Distributed JS Testing 地址&#xf…

分享 27 个面向开发人员的最佳 Vue.js 开发工具

英文 | https://javascript.plainenglish.io/best-27-vuejs-development-tools-for-developers-bd972bb5f573 01、BootstrapVue 地址:https://bootstrap-vue.org/ 一个用于 Vue.js 构建引导接口的开源库。 02、Vuex 地址:https://vuex.vuejs.org/ Vue.js…