Java内部类

article/2025/10/12 0:06:10

Java内部类

  • 内部类
  • 成员内部类
  • 局部内部类
  • 匿名内部类
  • 静态内部类
  • 常规面试案例
    • 内部类实例化对象
    • 重名变量的引用

内部类

是什么?
字面意思,在类的内部编写的类就叫内部类!
为了方便区分、学习、理解我们一般将内部类分为以下几种!
内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类
有什么用?
先说个人理解,我开发经验有限,我在个人开发中很少用到内部类。一般写监听时会用(比如Android开发中的点击监听时间就应用了匿名内部类)。
即使用到了也没去了解详实的知识体系。就是没学过也会用!所以对于初学者的个人建议是了解即可,正常的面试如果问到一般就止于内部类对象的创建和数据的引用!
官方点的优点!
❀每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整。
❀方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。
❀方便编写事件驱动程序。
❀方便编写线程代码。

成员内部类

在类的内部方法的外部编写的类就是成员内部类。
成员内部类特点
☄成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
☄同名属性名方法名时访问外部类 外部类.this.成员名。

MemberDemo.this.name

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

		MemberDemo member = new MemberDemo();Inner inner = member.new Inner();

☄成员内部类可以使用四种权限修饰符进行修饰。
☄成员内部类中不能书写静态变量和方法。
演示案例

public class MemberDemo {String name = "王五";static int age = 10;public static void show() {System.out.println("掉用外部类中的show方法");}public void printf() {System.out.println("调用外部类中的打印方法");}//成员内部类 可以使用权限修饰符进行修饰public class Inner{//static double height=1.8;  成员内部类中不能使用static修饰变量和方法String name="张三";//成员内部类可以直接访问外部类的属性和方法public void innerShow() {show();printf();System.out.println(age);System.out.println("我是:"+name);System.out.println("我是:"+MemberDemo.this.name);//进行特指访问时 使用类名.this.变量名进行访问}}public static void main(String[] args) {//成员内部类对象的创建步骤//第一步需要实例化外部类对象//第二步正常实例化内部类对象 但是new关键字要改成 外部类对象名.newMemberDemo member = new MemberDemo();Inner ineer = member.new Inner();ineer.innerShow();} }

在这里插入图片描述

局部内部类

编写在方法的内部的类称之为局部内部类
局部内部类的特点
☄局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
☄局部内部类不可使用权限修饰符 静态修饰符进行修饰 同局部变量相同
☄局部内部类可以直接访问方法中的属性
☄局部内部类 可以直接访问方法外部类中属性和方法
☄局部内部类 创建对象 要在方法内部 局部内部类的外部声明
演示案例

public class PartialDemo {String name = "王五";static int age = 10;public static void show() {System.out.println("掉用外部类中的show方法");}public void printf() {System.out.println("调用外部类中的打印方法");}public void demo() {String name = "张三";double height = 1.8;//编写在方法的内部的类称之为局部内部类//局部内部类不可使用权限修饰符 静态修饰符进行修饰 同局部变量相同//局部内部类与局部变量使用范围一样 在此方法内部//局部内部类可以直接访问方法中的属性 重名时使用参数传递完成访问//局部内部类 可以访问方法外部类中属性和方法  class Inner{String name = "李四";				  public void showInner(String name) {show();printf();System.out.println(age);System.out.println(height); System.out.println("这是:"+PartialDemo.this.name);System.out.println("这是:"+name);System.out.println("这是:"+this.name);}}//局部内部类 创建对象 要在方法内部 局部内部类的外部声明Inner inner=new Inner();inner.showInner(name);}public static void main(String[] args) {PartialDemo partialDemo = new PartialDemo();partialDemo.demo();}}

在这里插入图片描述

匿名内部类

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

interface A{void show();
}public class AnonymousDemo {			//编写回调方法 参数类型为接口Apublic void calllnner(A a) {a.show();}public static void main(String[] args) {AnonymousDemo anonymousDemo = new AnonymousDemo();//匿名内部类 监听事件使用较多anonymousDemo.calllnner(new A() {//接口回调//实现子类 但是没有名字 所以叫匿名内部类@Overridepublic void show() {// TODO Auto-generated method stubSystem.out.println("show");}});}}

在这里插入图片描述

或许有些难以理解 过程其实并不复杂
首先有一个接口,然后在使用的类中编写了一个方法(参数类型是接口对象),并使用接口中未实现的方法。
我们调用此方法直接构造一个接口对象传入,此时会自动生成一个此接口的子类(匿名内部类)实现接口中的方法。本质传入的类便是此时的匿名内部类。
Android实战中的使用
modify是按钮类型的对象 传入接口或者抽象类对象 重写的方法是单机事件后的操作(不要在意干了什么) 子类没什么名字 但实际子类对象却被回调传入了setOnClickListener方法中

        //修改modify.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v) {db=myHelper.getWritableDatabase();//初始化数据库values=new ContentValues();values.put("name",nameTwo.getText().toString());values.put("tels",numberTwo.getText().toString());db.update("information",values,"name=?",new String[]{name});//防止吐司出现应用程序名称提示Toast toast=Toast.makeText(Change.this,"修改成功",Toast.LENGTH_LONG);toast.setText("修改成功");toast.show();db.close();}});

静态内部类

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

演示案例

public  class StaticDemo {static String name="王五";public static class Inner{//四种权限修饰符可以修饰静态内部类//静态内部类中不能访问外部类非静态成员 String name="张三";static int age=18;double height=1.8;public void show() {//重名时 访问外部类的静态变量使用类名.属性名访问System.out.println("这是"+name);System.out.println("这是"+StaticDemo.name);System.out.println(age);System.out.println(height);}}public static void main(String[] args) {//静态内部类可以直接实例化 不需要依附于外部类Inner inner = new Inner();inner.show();}}

在这里插入图片描述

常规面试案例

内部类实例化对象

成员内部类
先声明外部类对象 然后再实例化内部类对象 new关键字要改成 外部类对象名.new
局部内部类
只能在方法内部实例化对象
静态内部类
直接实例化对象

案例
实例化Bean BeanA BeanB BeanC 并打印A B C中的值

class Bean{public void Demo() {class BeanC{String C = "BeanC";}}
}public class InterviewDemo {class BeanA{String A = "BeanA";}static class BeanB{String B = "BeanB";}}

答案(不唯一)

package com.qingsu.test;class Bean{public void Demo() {class BeanC{String C = "BeanC";}//实例化CBeanC	beanC = new BeanC();System.out.println(beanC.C);}
}public class InterviewDemo {class BeanA{String A = "BeanA";}static class BeanB{String B = "BeanB";}//实例化BeanA BeanB BeanC 对象public static void main(String[] args) {//实例化AInterviewDemo interviewDemo =new InterviewDemo();BeanA beanA = interviewDemo.new  BeanA();System.out.println(beanA.A);//实例化BBeanB beanB = new BeanB();System.out.println(beanB.B);//实例化beanBean bean  = new Bean();bean.Demo();}}

在这里插入图片描述

重名变量的引用

以非静态变量为例
外部类.this.属性名 可以访问到外部类属性
this.属性名 可以访问到本类属性
方法中参数传递可以访问到类外部方法中的的属性
静态内部类中对象名.属性名可以访问到外部类中的的静态属性

案例
写出控制台输出的值

public class PartialDemo {static String name = "王五";public void demo() {String name = "张三";			class Inner{String name = "李四";				  public void showInner(String name) {System.out.println("这是外部类变量:"+PartialDemo.this.name);System.out.println("这是外部类变量(静态变量可以):"+PartialDemo.name);System.out.println("这是方法中局部变量变量:"+name);System.out.println("这是局部内部类中的变量:"+this.name);}}Inner inner=new Inner();inner.showInner(name);			 }public static void main(String[] args) {PartialDemo partialDemo = new PartialDemo();partialDemo.demo();			}}

答案
在这里插入图片描述


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

相关文章

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…

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、暴露工具函数…