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年中已经取得了显著的进展,但进一步改进这些现有的算法路线的有效性对人类科学家和计算方法…

Prometheus PromQL数据查询语言

PromQL 简介 PromQL(Prometheus Query Language)是 Prometheus 内置的数据查询语言。支持用户进行实时的数据查询及聚合操作。 Prometheus 基于指标名称(metrics name)以及附属的标签集(labelset)唯一定义一…

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) 客户端可以调用的接…

svg图片代码data:image/svg+xml转png图片方法

把代码保存为html格式的文件中,用浏览器访问,即可右键保存 从AI软件或其它网站得到svg图片代码后,把他复制到下面源码上 注意:src""图片地址中,一些参数的含义 d‘这里是图片代码数据’ viewBox是图片显示区域,宽,高等 fill%23000000’这里表示颜色 ,后面6位0表示黑色…

Vercel.json配置路由重定向(重写)【vue项目】

在项目根目录创建vercel.json {"rewrites": [{"source": "/(.*)","destination": "/"}] } vue-router 路由模式改为 history(vue2版本) createWebHistory(vue3版本)

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✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

FLASK中的鉴权的插件Flask-HTTPAuth

在 Web 应用中,我们经常需要保护我们的 api,以避免非法访问。比如,只允许登录成功的用户发表评论等。Flask-HTTPAuth 扩展可以很好地对 HTTP 的请求进行认证,不依赖于 Cookie 和 Session。本文主要介绍两种认证的方式:…

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

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

点云从入门到精通技术详解100篇-基于点云语义分割的电力线提取及聚类研究(下)

目录 3.4.3 MSIDA-Net 与主成分分析法对比 基于簇最低点聚类算法的电力线聚类及重建

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进行发包,…

51单片机 串口通信

UART.h #ifndef __UART_H__ #define __UART_H__void UART_Init(); void UART_SendByte(unsigned char Byte);#endifUART.H #include <REGX52.H>/*** brief 串口初始化&#xff0c;4800bps12.000MHz* param 无* retval 无*/ void UART_Init() {SCON0x40;PCON | 0x80;T…