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

article/2025/10/12 1:21:10

内部类是什么?

字面意思,在类的内部编写的类就叫内部类!即一个类的内部又完整的嵌套了另一个类结构,被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。

内部类是类的第五大成员→【提示:类的五大成员是哪些?[属性、方法、构造器、代码块、内部类]】

内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。

官方给的内部类优点如下:
1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整;
2.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏;
3.方便编写事件驱动程序;
4.方便编写线程代码。

注意:内部类是学习的难点,同时也是重点,后面看底层源码时,有大量的内部类。

一、成员内部类:(在类的内部方法的外部编写的类就是成员内部类)

成员内部类特点:

1.成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员);

2.同名的属性名/方法名访问外部类时 → 外部类.this.成员名

Outer.this.name

成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象。所以在外部类访问内部类的时候必须先实例化外部类对象

		Outer outer= new outer();Inner inner = outer.new Inner();//或者如下一句代码:Outer.Inner inner = new Outer().new Inner();

注意:

1.成员内部类可以使用四种权限修饰符进行修饰(四种权限修饰符:public(公有的) >protected(受保护的) > (default)(缺省/默认的) > private(私有的));
2.成员内部类中不能书写静态变量和方法。

详见案例演示:

public class Outer {String name = "外部类的类名";static String type = "外部类的type属性";private int item = 1;public static void show() {System.out.println("掉用外部类中的show方法");}public void print() {System.out.println("调用外部类中的打印方法");}//成员内部类 可以使用权限修饰符进行修饰public class Inner{//static double weight = 1.8;  //成员内部类中不能使用static修饰变量和方法String name = "内部类的类名";public void innerShow(){//成员内部类可以直接访问外部类的属性和方法show();print();System.out.println(type);System.out.println(item);System.out.println("我是:" + name);//进行特指访问时 使用类名.this.变量名进行访问System.out.println("我是:" + Outer.this.name);}}public static void main(String[] args) {//成员内部类对象的创建步骤//1.第一步需要实例化外部类对象//2.第二步正常实例化内部类对象 但是new关键字要改成 外部类对象名.new/*Outer outer = new Outer();Inner inner = outer.new Inner();*///或者这样创建Outer.Inner inner = new Outer().new Inner();inner.innerShow();}
}

二、局部内部类 (编写在方法的内部的类称之为局部内部类,也可以称为方法内部类)

局部内部类的特点

1.局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内;
2.局部内部类不可使用权限修饰符 静态(static)修饰符进行修饰 同局部变量相同;
3.局部内部类可以直接访问方法中的属性;
4.局部内部类 可以直接访问方法外部类中属性和方法;
5.局部内部类 创建对象 要在方法内部 局部内部类的外部声明。

详见案例演示:

public class Partial {String name = "外部类的类名";String type = "外部类的type属性";private int item = 1;public static void show() {System.out.println("掉用外部类中的show方法");}public void print() {System.out.println("调用外部类中的打印方法");}public void demo(){String name = "外部类方法deme()内部的方法名";String type = "外部类方法deme()内部的type属性";/*编写在方法的内部的类称之为局部内部类局部内部类不可使用权限修饰符 静态修饰符进行修饰 同局部变量相同局部内部类与局部变量使用范围一样 在此方法内部局部内部类可以直接访问方法中的属性 重名时使用参数传递完成访问*/class Inner{//局部内部类 可以访问方法外部类中属性和方法String name = "局部类的类名";public void showInner(String name){show();print();System.out.println("我是:"+ type);System.out.println("我是:"+ Partial.this.type);System.out.println(item);System.out.println("我是:" + this.name);System.out.println("我是:" + name);System.out.println("我是:" + Partial.this.name);}}//局部内部类 创建对象 要在方法内部 局部内部类的外部声明Inner inner = new Inner();inner.showInner(name);}public static void main(String[] args) {Partial partial = new Partial();partial.demo();}
}

三、匿名内部类(注意:匿名内部类只是没有类名,其他的都是具备的)

匿名内部类特点

匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

详见案例演示:

 // 实现关系下的匿名内部类:
interface Dao {void show();
}public class AnonymousDemo {//编写回调方法 :callInnerpublic void callInner(){// 接口关系下的匿名内部类new Dao(){//实现子类 但是没有名字 所以叫匿名内部类@Overridepublic void show() {System.out.println("接口方法...");}}.show();}
}
// 测试:
public class Demo {public static void main(String[] args) {AnonymousDemo anonymousDemo = new AnonymousDemo();anonymousDemo.callInner();}
}

匿名内部类可用于给方法传递实参,演示如下:

interface Dao {void show();
}public class AnonymousDemo {//编写回调方法:callInner 参数类型为接口Daoprivate static void callInner(Dao d) {d.show();}public static void main(String[] args) {callInner(new Dao() {//接口回调//实现子类 但是没有名字 所以叫匿名内部类@Overridepublic void show() {System.out.println("匿名内部类用于给方法传递实参");}});}}

或许有些难以理解,其实过程并不复杂。
说明:首先有一个接口,然后在使用的类中编写了一个方法(参数类型是接口对象),并使用接口中未实现的方法。
我们调用此方法直接构造一个接口对象传入,此时会自动生成一个此接口的子类(匿名内部类)实现接口中的方法。本质传入的类便是此时的匿名内部类。

四、静态内部类(在类中编写的以static修饰的类称为静态内部类)

静态内部类特点

1.静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static;
2.静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法;
3.静态内部类中即能声明静态成员也可以声明非静态成员。

详见案例演示:

public class Static {static String name = "外部类的类名";//静态内部类中不能访问外部类非静态成员String type = "外部类的type属性";public static class Inner{//四种权限修饰符可以修饰静态内部类public String name = "静态内部类的类名";static double weight = 1.8;String type = "静态内部类的type属性";public void show(){System.out.println("我是:" + weight);System.out.println("我是:" + type);System.out.println("我是:" + name);//System.out.println("我是:" + Static.type);//静态内部类中不能访问外部类非静态成员System.out.println("我是:" + Static.name);}}public static void main(String[] args) {//静态内部类可以直接实例化 不需要依附于外部类Inner inner = new Inner();inner.show();}
}

有问题大家一起提出,我们共同学习、共同成长!!!
欢迎评论区留言*** 


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

相关文章

分享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…

JS 开发工具库

JS 开发工具库 前言一、开发环境准备1、安装 Node2、创建项目 二、工具函数的封装1、Ajax 的封装2、datePicker3、文件导出功能的实现3-1 导出 Word 三、项目打包1、打包前准备1.1 初始化项目1.2 下载依赖1.3 配置 Webpack1.4 配置打包命令1.5 项目打包1.6 测试 2、暴露工具函数…

JavaScript 开发者的 5 款必备工具

工欲善其事,必先利其器,一款优秀的开发工具能够极大提高程序开发效率与体验。在Web前端开发中,常用的开发工具有Visual Studio Code、Sublime Text、HBuilder等,下面我们就来介绍这些开发工具的特点。 1.Visual Studio Code Vis…

学javascript需要用到哪些开发工具?分享这几款

学习web前端技术,辅助工具是在学习过程中必须要用到的,包括后面的工作中,辅助工具可以更快的提高我们的工作效率,下面小编就为大家整理了学javascript需要用到的开发工具。 学javascript有哪些开发工具: 1.HBuilder …

SQLLDR 简介

1. SQLLDR导入 1.1 简介 SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件(数据)迁移到ORACLE数据库中。SQL*LOADER是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL&…

uchar 和 uchar3的疑惑

一直没有注意过,之前写代码都是用别的库,一直会遇到uchar或者uchar3,以为它在stl中的内置的类型,后面发现不是,其实它是别的库私下定义的(类似int3),详见opencv。 uchar它们在其中已…

安装另外一个版本keil5之后,出现许许多多的uchar未定义

新换了一台电脑。 结果就出现了很多很多问题,就是uchar突然不行。 一直在写宏定义, #define uchar unsigned char #define uint unsigned int #define ulong unsigned long 不成功,反倒错误越来越多,说是宏定义与之前的冲突。 后…