JAVA篇05 —— 内部类(Local、Anonymous、Member、Static)

 欢迎来到我的主页:【一只认真写代码的程序猿

本篇文章收录于专栏【小小爪哇

如果这篇文章对你有帮助,希望点赞收藏加关注啦~

目录

1 内部类Inner Class

1.1 局部内部类

1.2 匿名内部类(※※)

 1.3 匿名类最佳实践(当成实参传)

1.4 成员内部类

1.5 静态内部类


1 内部类Inner Class

一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类(inner class);嵌套其他类的类称为外部类(outer class)。是我们类的第五大成员。

【类的五大成员是哪些?1属性 2方法 3构造器 4代码块 5内部类]】

内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系。

class OuterClass{//外部类class InnerClass{//内部类}
}
class OuterOtherClass{//其他内部类}

1.1 局部内部类

/*** 演示局部内部类的使用*/
public class LocalInnerClass {public static void main(String[] args) {Outer02 outer02 = new Outer02();outer02.m1();System.out.println("outer02 的 hashcode=" + outer02);}
}class Outer02 {//外部类private int n1 = 100;private void m2() {System.out.println("Outer02 m2()");}public void m1() {//方法//1.局部内部类是定义在外部类的局部位置,通常在方法//3.不能添加访问修饰符,但是可以使用 final 修饰//4.作用域 : 仅仅在定义它的方法或代码块中final class Inner02 {//局部内部类(本质仍然是一个类)//2.可以直接访问外部类的所有成员, 包含私有的private int n1 = 800;public void f1() {5. 局部内部类可以直接访问外部类的成员, 比如下面 外部类 n1 和 m2()7. 如果外部类和局部内部类的成员重名时, 默认遵循就近原则, 如果想访问外部类的成员,使用 外部类名.this.成员) 去访问老韩解读 Outer02.this 本质就是外部类的对象, 即哪个对象调用了 m1, Outer02.this 就是哪个对象System.out.println("n1=" + n1 + " 外部类的 n1=" + Outer02.this.n1);System.out.println("Outer02.this hashcode=" + Outer02.this);m2();}}//6. 外部类在方法中, 可以创建 Inner02 对象, 然后调用方法即可Inner02 inner02 = new Inner02();inner02.f1();}
}

1.2 匿名内部类(※※)

特点:本质上还是类,内部类,没有名字的类,同时还是个对象。

参考官方文档:oracle英文文档

Anonymous classes enable you to make your code more concise. They enable you to declare and instantiate a class at the same time. They are like local classes except that they do not have a name. Use them if you need to use a local class only once.

以下是官方代码,注释由GPT生成。

public class HelloWorldAnonymousClasses {// 定义一个 HelloWorld 接口,包含两个方法:greet() 和 greetSomeone(String someone)interface HelloWorld {public void greet();public void greetSomeone(String someone);}public void sayHello() {// 定义一个 EnglishGreeting 类,实现 HelloWorld 接口class EnglishGreeting implements HelloWorld {String name = "world"; // 默认问候对象为 "world"public void greet() {greetSomeone("world"); // 调用 greetSomeone 方法,传入默认问候对象}public void greetSomeone(String someone) {name = someone; // 更新问候对象System.out.println("Hello " + name); // 打印问候信息}}// 创建 EnglishGreeting 的实例,并调用 greet 方法HelloWorld englishGreeting = new EnglishGreeting();// 使用匿名内部类创建一个 HelloWorld 的实例,实现法语问候HelloWorld frenchGreeting = new HelloWorld() {String name = "tout le monde"; // 默认问候对象为 "tout le monde"public void greet() {greetSomeone("tout le monde"); // 调用 greetSomeone 方法,传入默认问候对象}public void greetSomeone(String someone) {name = someone; // 更新问候对象System.out.println("Salut " + name); // 打印问候信息}};// 使用匿名内部类创建一个 HelloWorld 的实例,实现西班牙语问候HelloWorld spanishGreeting = new HelloWorld() {String name = "mundo"; // 默认问候对象为 "mundo"public void greet() {greetSomeone("mundo"); // 调用 greetSomeone 方法,传入默认问候对象}public void greetSomeone(String someone) {name = someone; // 更新问候对象System.out.println("Hola, " + name); // 打印问候信息}};// 执行英语问候englishGreeting.greet();// 执行法语问候,传入特定对象 "Fred"frenchGreeting.greetSomeone("Fred");// 执行西班牙语问候spanishGreeting.greet();}public static void main(String... args) {HelloWorldAnonymousClasses myApp = // 创建 HelloWorldAnonymousClasses 类的实例new HelloWorldAnonymousClasses();myApp.sayHello(); // 调用 sayHello 方法,展示不同语言的问候}            
}

上述代码中分别用局部类来初始化变量英语,用匿名类来初始化变量法语和西班牙,两种实现之间有明显的区别:

1)局部类English实现接口后,有自己的类名,定义完成之后要再new一下

2)french和spanish在定义的时候就实例化,定义完了就可以直接使用

3)匿名类是表达式,最后用分号结尾

 1.3 匿名类最佳实践(当成实参传)

/*** @ClassName InnerClassTest* @Description 匿名内部类当做实参传递小demo* @Date 2024/11/27 17:13* @Version V1.0*/
public class InnerClassTest {public static void main(String[] args) {//当做实参直接传递, 简洁高效f1(new IL() {@Overridepublic void show() {System.out.println("匿名类的show方法");}});//传统方法f1(new Picture());}//静态方法,形参是接口类型public static void f1(IL il) {il.show();}
}
//接口
interface IL {void show();
} //类->实现 IL => 编程领域 (硬编码)
class Picture implements IL {@Overridepublic void show() {System.out.println("调用Picture的show方法");}
}

一个匿名类的小练习:

package day111;/*** @ClassName BellTest* @Description 匿名内部类的小练习* 1、一个铃声接口Bell,里面有ring方法。* 2、一个手机类cellphone,有闹钟功能alarmClock,参数是Bell类型* 3、测试手机的闹钟功能,分别打印:A起床了;B起床了* @Author 聂宇旋* @Date 2024/11/27 17:25* @Version V1.0*/
public class BellTest {public static void main(String[] args) {CellPhone cellPhone = new CellPhone();cellPhone.alarmClock(new Bell() {@Overridepublic void ring() {System.out.println("A起床了");}});cellPhone.alarmClock(new Bell() {@Overridepublic void ring() {System.out.println("B起床了");}});}
}
interface Bell{void ring();
}
class CellPhone{public void alarmClock(Bell bell){System.out.println(bell.getClass());bell.ring();}
}

1.4 成员内部类

成员内部类是定义在外部类的成员位置,没有static修饰。

  1. 可以直接访问外部类的所有成员(包含private)
  2. 可以任意添加访问修饰符(因为他就是一个成员)
  3. 可以在外部类中写一个getInner方法来获得内部类对象
  4. 如果内部类和外部类成员重名,就近原则。
/*** @ClassName MemberInnerClass* @Description 成员内部类学习* @Date 2024/11/27 19:21* @Version V1.0*/
public class MemberInnerClass {public static void main(String[] args) {Outer outer = new Outer();outer.t1();Outer.Inner inner = outer.new Inner();inner.hi();Outer.Inner inner1 = outer.getInner();inner1.hi();}}
class Outer{//外部类private int n1=10;public String name = "外部类";public void hi(){System.out.println("外部类hello");}//1.注意: 成员内部类, 是定义在外部内的成员位置上//2.可以添加任意访问修饰符(public、 protected 、 默认、 private),因为它的地位就是一个成员public class Inner{public int n1=11;private int n2 = 20;public void hi(){//可以直接访问外部类的所有成员, 包含私有的//如果成员内部类的成员和外部类的成员重名, 会遵守就近原则.,可以通过 外部类名.this.属性 来访问外部类的成员System.out.println("内部类hello;"+hashCode()+";n1 = "+n1+" ;外部类n1="+Outer.this.n1);}}//可以写一个get内部类的方法public Inner getInner(){return new Inner();}public void t1(){//使用成员内部类,创建对象,用相关方法Inner inner = new Inner();inner.hi();System.out.println("n2="+inner.n2);}
}

1.5 静态内部类

静态内部类是定义在外部类的成员位置,并且有static修饰

  1. 可以直接访问外部类的所有静态成员,包含private,但不能直接访问非静态成员。
  2. 可以添加任意访问修饰符,因为它的地位就是一个成员。
  3. 作用域:同其他的成员,为整个类体。
  4. 和前面的成员内部类类似了,只是静态内部类可以通过Outer.Inner oi = new Outer.Inner();而成员内部类需要先new出来一个outer,再Outer.Inner oi = outer.newInner();当然也可以写get方法。
package day111;/*** @ClassName MemberInnerClass* @Description 成员内部类学习* @Author 聂宇旋* @Date 2024/11/27 19:21* @Version V1.0*/
public class MemberInnerClass {public static void main(String[] args) {Outer outer = new Outer();outer.t1();Outer.Inner inner = outer.new Inner();inner.hi();Outer.Inner inner1 = outer.getInner();inner1.hi();Outer.StaticInner staticInner = new Outer.StaticInner();staticInner.hiStatic();}}
class Outer{//外部类private int n1=10;public String name = "外部类";public void hi(){System.out.println("外部类hello");}//1.注意: 成员内部类, 是定义在外部内的成员位置上//2.可以添加任意访问修饰符(public、 protected 、 默认、 private),因为它的地位就是一个成员public class Inner{public int n1=11;private int n2 = 20;public void hi(){//可以直接访问外部类的所有成员, 包含私有的//如果成员内部类的成员和外部类的成员重名, 会遵守就近原则.,可以通过 外部类名.this.属性 来访问外部类的成员System.out.println("内部类hello;"+hashCode()+";n1 = "+n1+" ;外部类n1="+Outer.this.n1);}}public static class StaticInner{private static int nStatic = 22;public void hiStatic(){System.out.println("静态内部类的hello");}}//可以写一个get内部类的方法public Inner getInner(){return new Inner();}public void t1(){//使用成员内部类,创建对象,用相关方法Inner inner = new Inner();inner.hi();System.out.println("n2="+inner.n2);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/479588.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 与 Spring Cloud Alibaba 版本兼容对照

版本选择要点 Spring Boot 3.x 与 Spring Cloud Alibaba 2022.0.x Spring Boot 3.x 基于 Jakarta EE,javax.* 更换为 jakarta.*。 需要使用 Spring Cloud 2022.0.x 和 Spring Cloud Alibaba 2022.0.x。 Alibaba 2022.0.x 对 Spring Boot 3.x 的支持在其发行说明中…

jsp的pageContext对象

jsp的pageContext对象 是页面的上下文对象,表示当前页面运行环境,用于获取当前页面jsp页面信息,作用范围为当前的jsp页面 pageContext对象可以访问当前页面的所有jsp内置对象 jsp的四种内置对象 4中作用域:pagecontext,request…

网络安全在数字时代保护库存数据中的作用

如今,通过软件管理库存已成为一种标准做法。企业使用数字工具来跟踪库存水平、管理供应链和规划财务。 然而,技术的便利性也带来了网络威胁的风险。黑客将库存数据视为有价值的目标。保护这些数据不仅重要,而且必不可少。 了解网络安全及其…

Python图像处理:打造平滑液化效果动画

液化动画中的强度变化是通过在每一帧中逐渐调整液化效果的强度参数来实现的。在提供的代码示例中,强度变化是通过一个简单的线性插值方法来控制的,即随着动画帧数的增加,液化效果的强度也逐渐增加。 def liquify_image(image, center, radius…

day2全局注册

全局注册代码: //文件核心作用:导入App.vue,基于App.vue创建结构渲染index.htmlimport Vue from vue import App from ./App.vue //编写导入的代码,往代码的顶部编写(规范) import HmButton from ./components/Hm-But…

wireshark基础

免责声明: 笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 泷羽sec官网:https://longyusec.com/ 泷羽sec B站地址:https:/…

学习笔记037——Java中【Synchronized锁】

文章目录 1、修饰方法1.1、静态方法,锁定的是类1.2、非静态方法,锁定的是方法的调用者(对象) 2、修饰代码块,锁定的是传入的对象2.1、没有锁之前:2.2、有锁后: 实现线程同步,让多个线…

⭐️ GitHub Star 数量前十的工作流项目

文章开始前,我们先做个小调查:在日常工作中,你会使用自动化工作流工具吗?🙋 事实上,工作流工具已经变成了提升效率的关键。其实在此之前我们已经写过一篇博客,跟大家分享五个好用的工作流工具。…

智能桥梁安全运行监测系统守护桥梁安全卫士

一、方案背景 桥梁作为交通基础设施中不可或缺的重要组成部分,其安全稳定的运行直接关联到广大人民群众的生命财产安全以及整个社会的稳定与和谐。桥梁不仅是连接两地的通道,更是经济发展和社会进步的重要纽带。为了确保桥梁的安全运行,桥梁安…

[创业之路-155] :《领先的密码-BLM方法论全面解读与应用指南》- 综合管理框架

目录 一、BLM(业务领先模型)综合管理框架 1、BLM模型的起源与发展 2、BLM模型的核心组成 3、BLM模型的战略规划与执行流程 4、BLM模型的应用价值 二、BLM(业务领先模型)实施案例 1. 华为的实施案例 2. 某知名企业A的实施案…

用Java爬虫“搜刮”工厂数据:一场数据的寻宝之旅

引言:数据的宝藏 在这个数字化的时代,数据就像是隐藏在数字丛林中的宝藏,等待着勇敢的探险家去发掘。而我们,就是那些手持Java魔杖的现代海盗,准备用我们的爬虫船去征服那些数据的海洋。今天,我们将一起踏…

redis 底层数据结构

概述 Redis 6 和 Redis 7 之间对比&#xff1a; Redis6 和 Redis7 最大的区别就在于 Redis7 已经用 listpack 替代了 ziplist. 以下是基于 Redis 7基础分析。 RedisObject Redis是⼀个<k,v>型的数据库&#xff0c;其中key通常都是string类型的字符串对象&#xff0c;⽽…

UE5 实现组合键触发事件的方法

因为工作原因。 需要用大括号{和}来触发事件 但是在蓝图中搜了一下&#xff0c;发现键盘事件里根本就没有{}这两个键。 花费了一下午&#xff0c;终于找到解决的方法了&#xff0c;也就是增强输入的弦操作 首先创建一个项目 纯蓝图或者C都可行 进入到内容浏览器的默认页面 …

使用Github Action将Docker镜像转存到阿里云私有仓库,供国内服务器使用,免费易用

文章目录 一、前言二、 工具准备&#xff1a;三、最终效果示例四、具体步骤第一大部分是配置阿里云1. 首先登录阿里云容器镜像服务 [服务地址](https://cr.console.aliyun.com/cn-hangzhou/instances)2. 选择个人版本3. 创建 命名空间4. 进入访问凭证来查看&#xff0c;用户名字…

用两个栈实现队列 剑指offer

题目描述 用两个栈实现一个队列。队列声明如下图&#xff0c;请实现它的两个函数appendTail和deleteHead,分别完成在队尾插入节点和队头删除节点的功能。 代码实现 测试用例 相关题目

本地推流,服务器拉流全流程

本地推流&#xff0c;服务器拉流全流程 环境准备&#xff1a;准备一台服务器&#xff0c;其中openssl最好为1.1.1版本&#xff08;可以直接使用ubuntu20.04操作系统&#xff09; 服务器拉流 1、 安装环境依赖 sudo apt-get update sudo apt-get install unzip sudo apt-get…

打开windows 的字符映射表

快捷键 win R 打开资源管理器 输入: charmap 点击确定

Elasticsearch对于大数据量(上亿量级)的聚合如何实现?

大家好&#xff0c;我是锋哥。今天分享关于【Elasticsearch对于大数据量&#xff08;上亿量级&#xff09;的聚合如何实现&#xff1f;】面试题。希望对大家有帮助&#xff1b; Elasticsearch对于大数据量&#xff08;上亿量级&#xff09;的聚合如何实现&#xff1f; 1000道 …

解决首次加载数据空指针异常

起初效果&#xff1a; 使用async...await异步加载数据 最终效果&#xff1a; 代码&#xff1a; <template><div class"user-list-container"><!-- 加载状态 --><div v-if"loading" class"loading">正在加载用户数据..…

RTR Chaptor10 上

局部光照 面光源光泽材质一般光源形状 环境光照球面函数和半球函数简单表格形式球面基底球面径向基函数球面高斯函数球谐函数其他球面表示 半球基底AHD 基底辐射法向映射/《半条命2 》基底半球谐波 / H-Basis 在第9章中&#xff0c;我们讨论了基于物理的材质的相关理论&#xf…