【JavaSE篇】——内部类

目录

🎓内部类

🎈内部类的分类

🚩实例内部类

一.如何实例内部类对象

二.实例内部类中为什么不能有静态成员变量 (用final解决)

三.在实例内部类对象时,如何访问外部类当中相同的成员变量?

✅实例内部类总结 

🚩静态内部类

一.如何获取静态内部类对象

二.静态内部类中不能访问外部类非静态成员变量,如何访问呢?

✅实例内部类总结  

🚩局部内部类

✅局部内部类总结  

🚩匿名内部类

🎓对象的打印



🎓内部类

当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么这个内部的完整结构最好使用内部类。
我们看上面的定义来描述内部类,我们并不明白,这个只有到学习了后面的知识我们才知道内部类的真正用处在哪里,我们这章的话,我们需要掌握内部类的基本语法。
在 Java 中, 可以将一个类定义在另一个类或者一个方法的内部, 前者称为内部类,后者称为外部类 。内部类也是封装的一种体现。
public class OutClass {class InnerClass{}
}
OutClass是外部类   InnerClass是内部类
【注意事项:】
1. 定义在 class 类名 {} 花括号外部的,即使是在一个文件里,都不能称为内部类
2. 内部类和外部类共用同一个 java 源文件,但是经过编译之后,内部类会形成单独的字节码文件

🎈内部类的分类

  • 实例内部类
  • 静态内部类
  • 局部内部类
  • 匿名内部类

🚩实例内部类

class OutClass {public int date1=10;public static int date2=11;int date3=12;class InnerClass{public int date4=13;// public static int date5=14;//error后面会讲述为什么错误int date6=15;public void func(){System.out.println("innerclass");}}public void func1(){System.out.println("outclass");}
}

我们在外部类和内部类都声明了成员方法和成员变量。我们该如何去实例内部类的对象呢?


一.如何实例内部类对象

大家可能第一想法就是:毕竟InnerClass是一个类嘛,然后我们直接new实例化对象,但是这是个内部类,不是普通的类,我们可以给这个内部类当作一个成员变量,当我们想要访问a,需要外部对象来访问a(对象.成员变量),那么我们想要访问内部对象,那么我们也需要通过外部对象引用去对象实例化。

俩种方法可以来对内部类进行实例化对象


 首先实例化外部类对象,然后通过外部类的实例化对象的引用或者匿名对象的引用。


二.实例内部类中为什么不能有静态成员变量 (用final解决)

我们上一篇讲述了static是在实例化对象之前加载内存的时候就进行了,所以static时机肯定快于创建类对象的时机。

在内部类中  内部类就和里面的定义的成员变量和成员方法一样都是OutClass类的成员,static修饰就相当于在成员中定义,上一篇我们也讲了(看下图),我们可以在成员方法里定义static变量嘛?是不行的,static修饰成员变量和成员方法,但是不能修饰成员方法里面的变量(统称类变量)

而下面的内部类就相当于OutClass中的方法,我们在方法中定义static,这不是相当于static修饰类变量吗?这是不可以的。static不能修饰成员中再嵌套里面的变量和方法的包括内部类。


那么如何再内部类中定义一个static修饰的变量呢?——引入final(final加以修饰的意思是相当于c语言中的const,是不能修改的称为常量) 

我们在这里修饰了,编译器再编译的时候是不能修改的了,date5的值是15那就是15,是不可以更改的。


我们现在会了如何实例化对象,我们就可以打印出来(内部类就在外部类里面同一个类中不受任何访问限定符限制,所以不管是private,public还是默认的default,proceted都是可以打印的。


三.在实例内部类对象时,如何访问外部类当中相同的成员变量?

这里在内部类不管是用this.date还是this.this.date都是不行,因为this.date是自己所属的就近原则和哪个类挨得近就访问哪个成员变量即使是变量名称相同。

方法一:在内部类成员方法中实例化外部类对象,然后对象.访问date1,即可打印10

方法二:我们可以利用this.date1来打印到内部类的成员变量的值,那我们可以调用外部类的this访问date1的值。

this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型,当前是在内部类的成员方法中调用,那么我们就会内部类对象的引用类型。

我们可以调用外部类的this就可以间接的访问到了外部类的成员变量。


✅实例内部类总结 
注意事项
1. 外部类中的任何成员都可以在实例内部类方法中直接访问(上面已解释(因为都在一个类中)
2. 实例内部类所处的位置与外部类成员位置相同,因此也受 public private 等访问限定符的约束(如果将类设置private那么外部类和内部类都是不可以访问的)
3. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this.同名成员 来访问(上面第三个问题)
4. 实例内部类对象必须在先有外部类对象前提下才能创建(上面第一个问题)
5. 实例内部类的非静态方法中包含了一个指向外部类对象this的引用 (上面第三个问题)
6. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。
(我们上面都说了内部类访问外部类中的成员,外部类如何访问内部类中的成员呢?)

  • 外部类——内部类  先创建内部类对象,然后访问
  • 内部类——外部类  直接访问

🚩静态内部类

static 修饰的内部成员类称为静态内部类。

一.如何获取静态内部类对象

static 修饰的内部类,称为静态内部类 ,静态内部类和静态成员变量最大的特性: 不属于某个具体的对象,是所有对象所共享的 。 直接用类名.访问。

二.静态内部类中不能访问外部类非静态成员变量,如何访问呢?

这就相当于静态成员方法(变量)不能访问非静态成员方法(变量)

外部类的非静态成员,需要外部类的对象引用才能访问。


✅实例内部类总结  
注意事项
  • 1. 在静态内部类中只能访问外部类中的静态成员 如果确实想访问,我们该如何做?

外部类的非静态成员,需要外部类的对象引用才能访问。(上面第二问)

  • 2. 创建静态内部类对象时,不需要先创建外部类对象

 不属于某个具体的对象,是所有对象所共享的 。 直接用类名.访问。


🚩局部内部类

定义在 外部类的方法体或者{}中 ,该种内部类只能在其定义的位置使用,一般使用的非常少,此处简单了解下语法 格式。

✅局部内部类总结  
注意事项
  • 1. 局部内部类只能在所定义的方法体内部使用
  • 2. 不能被publicstatic等修饰符修饰
  • 3. 编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class
  • 4. 几乎不会使用

🚩匿名内部类

new Person();

当我们访问成员变量的时候,匿名内部类它每次访问都是new,所以只能用一次。

 


🎓对象的打印

我们每次再类里定义成员变量的时候,我们发现每次都是System.out.println(name+" '"+age+" ")....,如果我们有100个成员变量呢?我们还是这样一直敲下去吗?显然不现实。

我们分析一下这下面打印的:

我们知道底层的这个地址如何实现,那么我们最终的目的还是需要对对象的成员变量打印。步骤如下:

注意:上面的@Override,java中的注解有很多,我们不能给上面的public String toString更改,不然就不符合。


生命是一颗长满可能的树。

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

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

相关文章

SpringMVC-基本概念

一、引子 我们在上篇文章Spring集成Web中抛出了一个问题:为什么我们一直在自用Java Web阶段使用的Servlet来承接客户端浏览器的请求呢,我们熟知甚至是已经在日常开发中经常使用的Controller又与之有什么关系呢?我们将在本篇文章解答读者的这…

检测CUDA 是否能访问GPU时回应速度慢【笔记】

SUPWEMICRO 418G-Q20X12 维护记录: 两台设备均已安装CUDA与Pytorch,在检测CUDA 是否能访问GPU,执行torch.cuda.is_available()命令时,一台设备速度秒回应True,但另外一台设备回应速度慢(1分钟左右&#xff…

node,node-sass,sass-loader之间的版本关系

前言 安装配置node-sass 以及 sass-loader想必是很多前端的噩梦–一不小心又不成功还得装个半天。 下面说一下这个问题。 当然,你肯定遇到过: Node Sass version 9.0.0 is incompatible with ^4.0.0-这样的问题,这个也是因为三者关系对不上…

【PyQt】02-基本UI

文章目录 前言一、首先了解什么是GUI?二、初学程序1.界面展示代码运行结果 2.控件2.1按钮展示代码运行结果 2.2 纯文本和输入框代码运行结果 3、重新设置大小 -resize4、移动窗口-move()5、设置界面在电脑中央5.1 代码运行结果 6、设置窗口图标代码运行结果 7、布局…

Django模型(二)

一、更新数据库表结构 不管是新增模型,还是修改已有模型后,只需要执行行命令即可: 1.1、创建迁移 在项目根目录的cmd中运行: $ python manage.py makemigrations model_app备注 model_app是子应用的名称,如果不指定,那么就是对所有 INSTALLED_APPS 中的应用都进行预备…

开发数据产品+AI产品通关上岸课程

该课程全面解析数据产品和人工智能产品的开发与设计。学员将学习产品规划、数据分析以及AI技术应用,通过案例实践掌握产品开发流程,致力于帮助他们成功进入数据和人工智能产品领域。 课程大小:9.8G 课程下载:https://download.cs…

Java多线程共享变量控制volatile

1. volatile实现可见性(jdk 1.5后) 1. 可见性 如果一个线程对共享变量值的修改,能够及时的被其他线程看到,叫做共享变量的可见性。如果一个变量同时在多个线程的工作内存中存在副本,那么这个变量就叫共享变量 volati…

如何从零开始开发一个PS5浏览器 | How to develop a PS5 browser

环境:Windows PS5一台 问题:PS5折腾需要使用PKG浏览器访问特定网址,如何自定义网址呢? 解决办法:使用开发套件PS Multi Tools开发一个空应用,利于deeplinkUri 参数访问网页 背景:PS5折腾后&…

dockerpipwork相关测试过程

pipework可以减轻docker实施过程中的工作量,在网上也找了几篇类似的文章,按照相应配置,结果并不相同 如下测试过程记录下: docker run -it --rm --name c1 busybox docker run -it --rm --name c2 busyboxpipework br1 c1 192…

Altium Designer的学习

PCB设计流程 1.新建空白工程: 创建一个新的工程 新建四个文件,并且保存: 每次打开文件时,打开以.PrjPcb结尾的文件 2.元件符号的创建: 在绘制图形的时候设置成10mil,为了在原理图中显得不那么大。 在绘制引脚的时候设…

拦截器,AOP,自定义注解的使用

自定义注解AOP,实现 进入方法打印参数日志 /*** 定义进入方法前打印日志注解* author zy*/ Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface PrintLog {} /*** 定义一个切面,在使用PrintLog注解的方法进…

Hadoop3.x基础(2)- HDFS

来源:B站尚硅谷 目录 HDFS概述HDFS产出背景及定义HDFS优缺点HDFS组成架构HDFS文件块大小(面试重点) HDFS的Shell操作(开发重点)基本语法命令大全常用命令实操准备工作上传下载HDFS直接操作 HDFS的API操作HDFS的API案例…

springboot 怎么设置局域网访问

如何配置Spring Boot应用以实现局域网访问 在开发一个Spring Boot应用时,我们通常会通过localhost来访问和测试我们的应用。但是,当我们想要在局域网中分享我们的应用,供其他设备访问时,仅仅使用localhost是不够的。本文将引导你…

Linux系统卸载重装JDK

CentOS 系统是开发者常用的 Linux 操作系统,安装它时会默认安装自带的旧版本的 OpenJDK,但在开发者平时开发 Java 项目时还是需要完整的 JDK,所以我们部署 CentOS 开发环境时,需要先卸载系统自带的 OpenJDK,再重新安装…

汽车销量可视化分析

目录 一.分析的背景、目的、意义 1、背景 2、目的 3、意义 二.数据来源 三.图表分析 1、汽车品牌销量柱状图 2、中国汽车销量柱状图 3、汽车销量前10排行柱状图 4、汽车厂商销量折线图 ​编辑5、汽车销量词云图 6、汽车车型销量 7、汽车价格分布雷达图 8、汽车分…

免费的ChatGPT网站(7个)

还在为找免费的chatGPT网站或者应用而烦恼吗?博主归纳总结了7个国内非常好用,而且免费的chatGPT网站,AI语言大模型,我们都来接触一下吧。 免费!免费!免费!...,建议收藏保存。 1&…

深入浅出HBase:一文理解HBase基础概念(列存储、时间戳、key-value)、架构特点以及适合的使用场景

文章目录 一. HBase 数据模型1. 行存储与列式存储1.1. 行存储1.2. 列存储 2. HBase 数据模型2.1. 模型概览2.2. 列与列族2.3. 时间戳:定义数据版本2.4. HBase的Key-Value 三. HBase架构1. HBase读写流程简述2. HRegionServer内部内部数据流转:HRegion &l…

Web前端入门 - HTML JavaScript Vue

ps:刚开始学习web前端开发,有什么不正确、不标准的内容,欢迎大家指出~ Web简介 90年代初期,Web1.0,静态页面,不和服务器交互,网页三剑客指Dreamweaver、Fireworks、Flash2000年代中期&#xf…

MySQL事务隔离级别

什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行。 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额…

如何将Mac连接到以太网?这里有详细步骤

在Wi-Fi成为最流行、最简单的互联网连接方式之前,每台Mac和电脑都使用以太网电缆连接。这是Mac可用端口的标准功能。 如何将Mac连接到以太网 如果你的Mac有以太网端口,则需要以太网电缆: 1、将电缆一端接入互联网端口(可以在墙…