「JavaSE」类和对象4

类和对象4

  • 🍉内部类
    • 🍌实例内部类
    • 🍌静态内部类
    • 🍌局部内部类
    • 🍌匿名内部类
  • 🍉总结

🍉内部类

在 Java 中,我们可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。内部类也是封装的一种体现

注意:内部类和外部类共用同一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件

根据内部类定义的位置,可以分为两种形式:

  1. 成员内部类:实例内部类、静态内部类
  2. 局部内部类、匿名内部类

🍌实例内部类

成员位置定义,并且没有被static修饰

  • 通过外部类引用来实例化实例内部类的对象
    必须先有外部类对象,然后才能创建实例内部类对象
public class Main {
    Out out = new Out();
    Out.InnerClass innerClass = out.new InnerClass();
}
  • 除非被final修饰成为常量,否则实例内部类不能有静态字段
    这很好理解,因为实例内部类的对象需要通过外部类对象产生,而静态字段不依赖对象而存在,所以这两者会产生冲突

而一个静态字段如果被final修饰,那就意味着它是一个常量,它在编译阶段就会被确定,因此它不依赖于外部类的实例
然后还需要注意,即使采用就地初始化也还是不行,因为静态字段是在类加载的时候初始化,在编译阶段仍然不能确定它的值

class InnerClass{
	public static int data2 = 20;  //编译报错
	public static final int data2 = 20;
}
  • 在实例内部类中可以访问外部类的任意成员
public class Out {
    public int data1 = 1;
    public static int data2 = 2;
    private int data3 = 3;
    
    class InnerClass{
    	public void Test() {
        	Out out = new Out();
        	System.out.println(out.data1);
        	System.out.println(data2);
        	System.out.println(out.data3);
    	}
    }
}
  • 如果外部类和实例内部类中具有相同名称成员时,优先访问的是内部类的
    如果要访问外部类同名成员,需要按照“外部类名称.this.同名成员名字”的格式访问

    (这就类似父类和子类有同名的成员,如果不使用super进行访问,就会优先访问子类的)
public class Out {
    public int data1 = 1;
    public static int data2 = 2;
    private int data3 = 3;

    class InnerClass{
        public int data1 = 10;
        public static final int data2 = 20;
        public int data3 = 30;

        void method() {
            System.out.println(data1);
            System.out.println(data2);
        }
    }
}

    public static void main(String[] args) {
        Out out = new Out();
        Out.InnerClass innerClass = out.new InnerClass();
        innerClass.method();
    }

在这里插入图片描述
实例内部类的非静态方法中包含了一个指向外部类对象的引用。所以实例内部类相当于有两个this:一个是内部类的this;另一个是访问外部类成员的Out.this

  • 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象
public class Out {
    public int data1 = 1;
     
    public void test() {
        InnerClass innerClass = new InnerClass();
        System.out.println(innerClass.data2);
    }

    class InnerClass{
        public int data2 = 10;
    }
}

🍌静态内部类

顾名思义,就是用static修饰的内部类,它不依托外部类的对象存在,所以:

  1. 它不可以访问外部类的普通字段、方法(可以访问静态字段和静态方法)

在这里插入图片描述
2. 创建静态内部类对象时,无需创建外部类对象

public static void main(String[] args) {
	// 静态内部类对象创建 & 成员访问
	Out.InnerClass innerClass = new Out.InnerClass();
	innerClass.methodInner();
}

🍌局部内部类

定义在方法内部的类,只可以在方法内部使用(这种内部类很少用)

public class Out {
    public int data1 = 1;
    public static int data2 = 2;
    private int data3 = 3;
    
    public void func() {
    //类A只能在func里面使用
        class A {
            private int data4 = 4;
        }
        A aa = new A();
        System.out.println("data4" + aa.data4);
    }
}

🍌匿名内部类

就是没有名字的内部类,通常可用于实现接口

public interface IA {
    void test();
}

public static void main(String[] args) {
    new IA(){
    	@Override
    	public void test() {
        	System.out.println("重写接口中的方法");
    	}
    };
}

从IA( )到大括号结束,就是匿名内部类,它实现了IA接口,然后前面使用new创建这个匿名内部类的对象
如果要调用它的test方法,有两种办法:

//第一种:直接在匿名内部类后面调用
new IA(){
	@Override
	public void test() {
        System.out.println("重写接口中的方法");
            }
    }.test();

//第二种:定义一个接口类型的引用指向这个对象,然后通过这个引用来调用方法
IA a = new IA(){
	@Override
    public void test() {
    	System.out.println("重写接口中的方法");
    }
};
a.test();

🍉总结

  1. 根据定义的位置,内部类可以分为两种形式,一共有四种内部类
  2. 对于实例内部类,如果要访问外部类的成员,需要使用“外部类.this.外部类成员”访问
    外部类不能直接访问实例内部类中的成员,必须先创建内部类的对象
  3. 匿名内部类在开发过程经常使用,很重要

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IS-IS:04 DIS

IS-IS 协议只支持两种网络类型,即广播网络和点到点网络。与 OSPF 协议相同, IS-IS 协议在广播网络中会将网络视为一个伪节点 ( Pesudonde,简称 PSN),并选举出一台DIS (Designated IS&#xff09…

探索Pyecharts之美-绘制多彩旭日图的艺术与技巧【第37篇—python:旭日图】

文章目录 引言准备工作绘制基本旭日图调整颜色和样式添加交互功能定制标签和标签格式嵌套层级数据高级样式与自定义进阶主题:动态旭日图数据源扩展:外部JSON文件总结 引言 数据可视化在现代编程中扮演着重要的角色,而Pyecharts是Python中一个…

Tomcat怎么优化

目录 性能方面的优化: 安全方面的优化: 引言:面试官问到的Tomcat怎么优化,这两个方面直接得到他认可!! 性能方面的优化: 内存优化:-Xms java虚拟机初始化时的最小内存、-Xmx java虚…

操作系统的引入

操作系统 【1】什么是操作系统 操作系统是一种管理的计算机硬件的软件资源的程序。它充当了计算机系统和应用程序之间的接口。使得计算机用户能够地使用计算机系统来完成各种任务。操作系统是负责管理和分配计算机的处理器、内存、硬盘等等硬件资源,同时也提供一些…

Vue3在css中使用v-bind绑定js/ts变量,也可以在scss和less中使用方式

主要介绍Vue3中的新增的v-bind()的常用使用方式,主要包括在css,less,scss中的使用,可以参考官方文档查看:Vue3官方文档 特别提醒 如果你想在scss中或者less中使用,可能会报各种乱七八糟的错误,最快最好用的方式就是单…

Android P 背光机制流程分析

在android 9.0中,相比android 8.1而言,背光部分逻辑有较大的调整,这里就对android P背光机制进行完整的分析。 1.手动调节亮度 1.1.在SystemUI、Settings中手动调节 在界面(SystemUI)和Settings中拖动进度条调节亮度时,调节入口…

[docker] Docker的私有仓库部署——Harbor

一、Docker原生私有仓库—— Registry 1.1 Registry的简单了解 关于Docker的仓库分为私有库和公有仓库,共有仓库只要在官方注册用户,登录即可使用。但对于仓库的使用,企业还是会有自己的专属镜像,所以私有库的搭建也是很有必要的…

那些年与指针的爱恨情仇(一)---- 指针本质及其相关性质用法

关注小庄 顿顿解馋 (≧∇≦) 引言: 小伙伴们在学习c语言过程中是否因为指针而困扰,指针简直就像是小说女主,它逃咱追,我们插翅难飞…本篇文章让博主为你打理打理指针这个傲娇鬼吧~ 本节我们将认识到指针本质,何为指针和…

将Html页面转换为Wordpress页面

问题:我们经常会从html源码下载网站上获得我们想要的网站内容框架,以及部分诸如联系我们,About 等内页,但是在文章的发布上,则远不如Wordpress简便。而Wordpress尽管有各种模板,但修改又比较麻烦。解决方法…

day34WEB 攻防-通用漏洞文件上传黑白盒审计逻辑中间件外部引用

目录 一,白盒审计-Finecms-代码常规-处理逻辑 黑盒思路:寻找上传点抓包修改突破获取状态码及地址 审计流程:功能点-代码文件-代码块-抓包调试-验证测试 二,白盒审计-CuppaCms-中间件-.htaccess 三,白盒审计-Metin…

CVE-2024-23897 Jenkins 任意文件读取漏洞

项目介绍 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。Jenkins是开源CI&CD软件领导者, 提供超过1000个插…

guhub访问

问题 访问不了guhub 解决过程 可以正常访问了 总结 此方法参考微软官方的方法,修改dns服务器网址,由原本的自动分配改为指定微软dns服务器网址

深度强化学习(王树森)笔记02

深度强化学习(DRL) 本文是学习笔记,如有侵权,请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接:https://github.com/wangshusen/DRL 源代码链接:https://github.c…

苹果手机突然无服务了,这是怎么回事?

苹果手机无疑是一款备受青睐的智能设备,但有时候我们可能会面临一个令人困扰的情况——苹果手机突然无服务。这种情况可能会在任何时候发生,无论是在使用手机时,刚刚升级系统,或者是突然发现在本应有信号的区域却无法连接到运营商…

Linux——常用命令

1、命令的基本格式 对服务器来讲,图形界面会占用更多的系统资源,而且会安装更多的服务、开放更多的端口,这对服务器的稳定性和安全性都有负面影响。其实,服务器是一个连显示器都没有的家伙,要图形界面干什么&#xff…

Nodejs基础4之fs模块的批量重命名练习、path模块、HTTP协议

Nodejs基础 fs模块fs练习-批量重命名fs练习-批量排序重命名 path模块resolve 解决sep 分隔符parse 方法其他的几个方法 HTTP协议http报文安装fiddler软件配置fiddler使用fiddler 请求报文结构整体请求行请求方法URLHTTP版本号 请求头请求体 响应报文结构整体响应行响应状态码响…

用甘特图有效管理多个项目进度

当公司或组织同时承担多个项目时,合理规划各项目的时间节点与资源分配对确保高效完成至关重要。采用甘特图可以直观地展示多个项目的时间进程、关键里程碑以及资源分配情况,便于从宏观层面全面把控各项目的动态。 在线甘特图软件 zz-plan.com 提供了非常强大的时间轴规划功能,支…

14、Kafka ------ kafka 核心API 之 流API(就是把一个主题的消息 导流 到另一个主题里面去)

目录 kafka 核心API 之 流APIKafka流API的作用:流API的核心API:使用流API编程的大致步骤如下:代码演示 流API 用法MessageStream 流API 代码演示消息从 test1主题 导流到 test2主题演示使用匿名内部类对消息进行处理Topology 拓扑结构 讲解 代…

程序员该懂的一些测试(二)单元测试与集成测试

集成测试才是目的 单元测试只是对每个小模块进行的测试,可以理解成每次提交的一个小功能。 最终系统的良好运行依赖于这些小模块之间良好协作。所以需要有集成测试 集成测试回滚数据,保证测试的可重复性 我们可以把 ApplicationContext 理解成 DI 容器…

Transformer and Pretrain Language Models3-6

Pretrain Language Models预训练语言模型 content: language modeling(语言模型知识) pre-trained langue models(PLMs)(预训练的模型整体的一个分类) fine-tuning approaches GPT and BERT(…