JAVA入坑之嵌套类

一、嵌套类入门

1.1概述

Java嵌套类是指在一个类中定义另一个类的一种方式,它可以提高代码的可读性、可维护性和封装性。Java嵌套类分为两种类型:静态嵌套类和非静态嵌套类。

静态嵌套类:Static nested classes,即类前面有static修饰符
非静态嵌套类:Non-static nested classes, 又名内部类,Inner classes

  • 普通内部类(亦翻译为:成员内部类)
  • 局部内部类(Local classes)
  • 匿名内部类(Anonymous classes)

1.2嵌套类的分类

静态嵌套类

 普通内部类

局部内部类

匿名内部类

1.3使用原因

  • 不同的访问权限要求,更细粒度的访问控制
  • 简洁,避免过多的类定义
  • 语言设计过于复杂,较难学习和使用

二、匿名内部类和局部内部类

2.1 匿名内部类

匿名内部类是一种没有名字的内部类,它通常用来实现接口或继承抽象类,并且只使用一次。匿名内部类的本质是一个带具体实现的父类或者父接口的匿名的子类对象。匿名内部类可以使你的代码更加简洁,你可以在定义一个类的同时对其进行实例化。

一没有类名的内部类,必须继承一个父类/实现一个父接口
一在实例化以后,迅速转型为父类/父接口
一这种类型的对象,只能new一个对象,之后以对象名字操作
一可在普通语句和成员变量赋值时使用内部类

interface MyInterface {void display();
}class OuterClass {public void test() {// 使用匿名内部类实现接口MyInterface obj = new MyInterface() {@Overridepublic void display() {System.out.println("我是匿名内部类");}};// 调用接口方法obj.display();}
}
package org.example;public class Outer1 {private String name = "abc";//匿名内部类public void fl(){String name = "def"; // 加上 final 修饰符Runnable r = new Runnable() {//匿名内部类不能定义静态变量,除非是常量public final static int a = 1; // 加上 final 修饰符并赋值public void run(){System.out.println("hello " + Outer1.this.name); // 加上 Outer1.this.};};//静态方法不能在匿名内部类定义
//        public void static f2{
//
//        }new Thread(r).start();System.out.println(r.getClass().getName());Runnable r2 = new Runnable() { // 加上 new Runnable()String name = "def";public void run(){System.out.println("hello " + name);};};new Thread(r2).start();System.out.println(r2.getClass().getName());}public static void main(String[] args) {Outer1 obj = new Outer1(); // 创建外部类对象obj.fl(); // 调用外部类方法// 调用r2对象}
}

 2.2局部内部类

package org.example;public class Outer2 {private String name = "abc";// 局部内部类public void fl() {String  name = "def";class Inner2 {final static int a = 1;String name = "ghi";public void f2() {System.out.println(name); // 输出 ghiSystem.out.println(Outer2.this.name);}}Inner2 obj1 = new Inner2();obj1.f2();System.out.println(obj1.getClass().getName()); // 输出 Outer2$1Inner2}public  static void f2() {String name = "def";class Inner2 {public void f2() {System.out.println(name); // 输出 ghi//System.out.println(Outer2.this.name);}}Inner2 obj1 = new Inner2();obj1.f2();System.out.println(obj1.getClass().getName()); // 输出 Outer2$1Inner2}public static void main(String[] args) {Outer2 obj = new Outer2(); // 创建外部类对象obj.fl(); // 调用外部类方法f2(); // 调用外部类静态方法}
}

2.3异同

匿名内部类和局部内部类的相同点是:

  • 匿名内部类和局部内部类都是在方法中定义的内部类,它们都只能在该方法中使用,不能在其他地方访问。
  • 匿名内部类和局部内部类都可以访问外部类的成员,但是如果要访问方法中的局部变量,那么该局部变量必须用final修饰。

匿名内部类和局部内部类的主要区别是:

  • 匿名内部类没有名字,而局部内部类有名字。
  • 匿名内部类只能创建一次对象,而局部内部类可以在方法中创建多个对象。
  • 匿名内部类通常用来实现接口或继承抽象类,并且只使用一次。局部内部类可以继承或实现任意的类或接口。
  • 匿名内部类的语法格式是:new 类名或者接口名(){ 重写方法; }。局部内部类的语法格式是:class 类名{ 成员; }

三·、 普通内部类和静态嵌套类

3.1普通内部类

class OuterClass {private int data = 10;public void test() {System.out.println("我是外部类成员方法");}class InnerClass {// 访问外部类的私有数据成员void getData() {System.out.println("data is " + data);}// 访问外部类的成员方法void getTest() {OuterClass.this.test();}}
}public class Test {public static void main(String[] args) {// 创建外部类对象OuterClass myOuter = new OuterClass();// 创建内部类对象OuterClass.InnerClass myInner = myOuter.new InnerClass();// 调用内部类方法myInner.getData();myInner.getTest();}
}

3.2 静态嵌套类

静态嵌套类有以下几个特点:

  • 静态嵌套类是外部类的静态成员,它可以直接使用外部类名.静态嵌套类名来访问自身
  • 静态嵌套类不能访问外部类的非静态成员,它只能通过对象引用来使用它们。
  • 静态嵌套类可以使用private、public、protected或包私有的访问权限修饰符。
  • 静态嵌套类在行为上就是一个顶级类,只是为了方便打包而放在外部类中
class OuterClass {private static int data = 10;public static void test() {System.out.println("我是外部类静态方法");}static class StaticNestedClass {// 访问外部类的静态数据成员void getData() {System.out.println("data is " + data);}// 访问外部类的静态方法void getTest() {OuterClass.test();}}
}public class Test {public static void main(String[] args) {// 创建静态嵌套类对象OuterClass.StaticNestedClass myNested = new OuterClass.StaticNestedClass();// 调用静态嵌套类方法myNested.getData();myNested.getTest();}
}

 

四、 嵌套类对比 

4.1对比

4.2外部访问规则

4.3变量遮蔽 

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

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

相关文章

【论文解读】Faster sorting algorithm

一、简要介绍 基本的算法,如排序或哈希,在任何一天都被使用数万亿次。随着对计算需求的增长,这些算法的性能变得至关重要。尽管在过去的2年中已经取得了显著的进展,但进一步改进这些现有的算法路线的有效性对人类科学家和计算方法…

2023-09-17 LeetCode每日一题(打家劫舍 II)

2023-09-17每日一题 一、题目编号 213. 打家劫舍 II二、题目链接 点击跳转到题目位置 三、题目描述 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房…

《golang设计模式》第二部分·结构型模式-05-门面模式Facade)

文章目录 1. 概述1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.2 类图 1. 概述 门面(Facade)向客户端提供使用子系统的统一接口,用于简化客户端使用子系统的操作。 1.1 角色 门面角色(Facade) 客户端可以调用的接…

7、DVWA——SQL盲注

文章目录 一、概述二、low2.1 通关思路(布尔盲注)(1)判断是否存在SQL注入漏洞(2)判断属于数字型注入还是字符型注入(3)判断结果集中的字段数(4)猜数据库名长度…

ArcGIS Pro将SHP文件转CAD并保留图层名称

相信大家应该都使用过ArcGIS将SHP文件转CAD格式,转换过后所有的要素都在一个图层内,那么有没有办法将SHP文件某个字段的值作为CAD的图层名字呢,答案是肯定的,这里就为大家介绍一下ArcGIS Pro转CAD文件并且保留图层名称的方法&…

Windows编程dll基本知识点

前言 本篇博客主要是记录windows系统下dll开发的相关基本知识点,并使用相关分析工具分析,有利于初学者学习,更是为开发者查缺补漏; 使用dumpbin查看dll,lib,exe相关信息 VS编译器提供了查看链接库相关的工具,安装后…

【c++GDAL】IHS融合

【c&GDAL】IHS融合 基于IHS变换融合,实现多光谱和全色影像之间的融合。IHS分别指亮度(I)、色度(H)、饱和度(S)。IHS变换融合基于亮度I进行变换,色度和饱和度空间保持不变。 IHS融合步骤: (1)将多光谱RGB影像变换到…

网络安全:保护你的系统

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

地牢大师问题(bfs提高训练 + 免去边界处理的特殊方法)

地牢大师问题 文章目录 地牢大师问题前言题目描述题目分析输入处理移动方式【和二维的对比】边界判断问题的解决 代码总结 前言 在之前的博客里面,我们介绍了bfs 基础算法的模版和应用,这里我们再挑战一下自己,尝试一个更高水平的题目,加深一…

Docker部署单点Elasticsearch与Kibana

一 、 创建网络 因为需要部署kibana容器,因此需要让es和kibana容器互联。这里创建一个网络: docker network create es-net # 创建一个网络名称为:es-net 二 、拉取并加载镜像 方式一 docker pull elasticsearch:7.12.1 版本为elasticsearch的7…

列属性与数据完整性

1.2 数据类型——值类型 1.2.1 整型 类型字节范围tinyint1-128~127smallint2-32768~32767mediumint3-8388608~8388607int4-231~231-1bigint8-263~263-1 1、无符号整数(unsigned):无符号数没有负数,正数部分是有符号的两倍。 例…

Linux驱动之INPUT子系统框架

目录 一、input 子系统简介 二、input 驱动编写流程 1、注册 input_dev 2、上报输入事件 三、input_event 结构体 按键、鼠标、键盘、触摸屏等都属于输入(input)设备, Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设…

Go语言开发环境搭建指南:快速上手构建高效的Go开发环境

Go 官网:https://go.dev/dl/ Go 语言中文网:https://studygolang.com/dl 下载 Go 的语言包 进入官方网站 Go 官网 或 Go 语言中文网: 选择下载对应操作系统的安装包: 等待下载完成: 安装 Go 的语言包 双击运行上…

udp的简单整理

最近思考udp处理的一些细节,根据公开课,反复思考,终于有所理解,做整理备用。 0:简单汇总 1:udp是基于报文传输的,接收方收取数据时要一次性读完。 2:借助udp进行发包,…

C++数据结构 -- 哈希表

目录 一、哈希概念二、 哈希冲突三、 哈希函数四、 减少哈希冲突常用的方法4.1 闭散列4.1.1 闭散列的开放定址法的增容4.1.2 闭散列的开放定址法的哈希结构的实现 4.3 开散列4.3.1 开散列概念4.3.2 插入元素4.3.2 删除元素4.3.3 开散列的哈希桶的增容4.3.4 开散列的哈希桶(拉链…

快速搭建SpringBoot3.x项目

快速搭建SpringBoot3.x项目 写在前面一、创建项目二、配置多环境三、连接数据库查询数据3.1 新建数据库mybatisdemo并且创建sys_user表3.2 创建实体类3.2 创建Mapper接口3.3 添加mybatis.xml文件3.4 新建service 接口及实现类3.5 创建Controller 四、封装统一结果返回4.1 定义 …

Attention is all you need 论文笔记

该论文引入Transformer,主要核心是自注意力机制,自注意力(Self-Attention)机制是一种可以考虑输入序列中所有位置信息的机制。 RNN介绍 引入RNN为了更好的处理序列信息,比如我 吃 苹果,前后的输入之间是有…

【问题记录】解决Git上传文件到GitHub时收到 “GH001: Large files detected” 错误信息!

环境 Windows 11 家庭中文版git version 2.41.0.windows.1GitHub 问题情况 在命令行中使用git上传pdf文件到GitHub服务器时,提示了如下警告信息: 原因是 GitHub 有一个文件大小限制,通常为 100 MB。 如果尝试上传大于此限制的文件&#xff0c…

Long类型雪花算法ID返回前端后三位精度缺失问题解决

目录 一、问题描述二、问题复现1.Maven依赖2.application.yml 配置3.DemoController.java4.snowflakePage.html 页面5.DemoControllerAdvice.java 监听6.问题复现 三、原因分析四、问题解决方案一方案二 一、问题描述 Java 后端使用雪花算法生成 Long 类型的主键 ID&#xff0…

快速学会搭建微信小程序的基础架构

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 基础架构 构建界面 引入 uni-ui 组件库 组件自动引入 配置TS类型 状态管理 持久化 数据交互 请…