Java的内部类

文章目录

  • 静态内部类(被static修饰的成员内部类)--可以实例化!
    • 获取静态内部类对象(把它当成外部类的成员)
    • 静态内部类可以声明普通成员变量和方法,而普通内部类不能声明static成员变量和方法
    • 静态内部类跟静态方法一样,只能访问静态的成员变量和方法,不能直接访问外部类的非静态成员变量,但是普通内部类可以访问任意外部类的成员变量和方法
  • 实例内部类(未被static修饰的成员内部类)
    • 实例化实例内部类(先将外部类实例化)
    • 实例内部类中包含了2个this(一个是外部类,一个是实例内部类自己)
  • 匿名内部类
    • 匿名对象(运用的场景是只使用一次对象)
    • 匿名内部类
  • 局部内部类(定义在方法里面)

  • 当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么这个内部的完整结构最好使用内部类。
  • 在 Java 中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。内部类也是封装的一种体现。
public class OutClass {
class InnerClass{
}
}
// OutClass是外部类
// InnerClass是内部类

静态内部类(被static修饰的成员内部类)–可以实例化!

获取静态内部类对象(把它当成外部类的成员)

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

class Outer {//静态内部类static class InnerClass {}
}public class Test {public static void main(String[] args) {Outer.InnerClass inn = new Outer.InnerClass();}
}
class Outer {//静态内部类static class InnerClass {}InnerClass inn = new InnerClass();
}

静态内部类可以声明普通成员变量和方法,而普通内部类不能声明static成员变量和方法

静态内部类跟静态方法一样,只能访问静态的成员变量和方法,不能直接访问外部类的非静态成员变量,但是普通内部类可以访问任意外部类的成员变量和方法

  • 因为外部类对象的非静态成员,依赖外部类对象
  • 被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问,方便在没有创建对象的情况下进行调用(方法/变量)
class Outer {public int data1 = 1;private int data2 = 2;public static int data3 = 3;//静态内部类static class InnerClass {public int data4 = 4;public static int data5 = 5;public void test() {Outer outer = new Outer();System.out.println(outer.data1);System.out.println(outer.data2);System.out.println(data3);System.out.println(data4);System.out.println(data5);}}
}public class Test {public static void main(String[] args) {Outer.InnerClass inn = new Outer.InnerClass();inn.test();}
}

在这里插入图片描述

class Outer {//静态内部类static class InnerClass {public static int data = 5;public static void test() {System.out.println(data);}}
}public  class Test {public static void main(String[] args) {Outer.InnerClass.test();System.out.println(Outer.InnerClass.data);}
}

在这里插入图片描述

实例内部类(未被static修饰的成员内部类)

一般实例内部类不能有被static修饰的成员变量和方法,但是成员变量加上final后可以变成常量(常量在编译的时候确定)

  1. 外部类中的任何成员都可以在实例内部类方法中直接访问
  2. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象

实例化实例内部类(先将外部类实例化)

实例内部类对象必须在先有外部类对象前提下才能创建

两种方式:

class Outer {class InnerClass {}
}public class Test {public static void main(String[] args) {Outer out = new Outer();Outer.InnerClass innerClass = out.new InnerClass();Outer.InnerClass innerClass2 = new Outer().new InnerClass();}
}

实例内部类中包含了2个this(一个是外部类,一个是实例内部类自己)

class Outer {public int data1 = 1;public static int data2 = 2;class InnerClass {public int data1 = 111;public static final int data3 = 3;public void test() {System.out.println(Outer.this.data1);System.out.println(this.data1);System.out.println(data1);System.out.println(data2);System.out.println(data3);}}public void func() {InnerClass innerClass = new InnerClass();innerClass.test();}
}public class Test {public static void main(String[] args) {Outer.InnerClass innerClass = new Outer().new InnerClass();innerClass.test();}
}

在这里插入图片描述

匿名内部类

匿名对象(运用的场景是只使用一次对象)

public class Test {public void func() {System.out.println("func()");}public static void main(String[] args) {new Test().func();}
}

在这里插入图片描述

匿名内部类

抽象类和接口可以接收具体对象

interface InterFaceA {void func();
}
public class Test {public static void main(String[] args) {InterFaceA a = new InterFaceA() {@Overridepublic void func() {System.out.println("func()");}};a.func();System.out.println("============");new InterFaceA() {@Overridepublic void func() {System.out.println("func()");}}.func();}
}

在这里插入图片描述

局部内部类(定义在方法里面)

只能在方法里面实例化对象.
不能被public、static等访问限定符修饰
局部内部类只能在所定义的方法体内部使用
编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class

public class Test {public void test() {class InnerClass {    public void test() {System.out.println("InnerClass::test()");}}InnerClass innerClass = new InnerClass();innerClass.test();}public static void main(String[] args) {Test test = new Test();test.test();}
}

在这里插入图片描述

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

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

相关文章

【Java基础系列】文件上传功能

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

nodejs微信小程序+python+PHP-健身俱乐部在线管理平台的设计与实现-安卓-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

RNN 网络结构及训练过程简介

本文通过整理李宏毅老师的机器学习教程的内容,介绍 RNN(recurrent neural network)的网络结构。 RNN 网络结构, 李宏毅 RNN RNN 的特点在于存储功能,即可以记忆前面时刻的信息。 最简单的 RNN 结构如下: 当然&a…

最新AI创作系统ChatGPT系统运营源码,支持GPT-4图片对话能力,上传图片并识图理解对话,支持DALL-E3文生图

一、AI创作系统 SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧!本系统使用NestjsVueTypescript框架技术,持续集成AI能力到本系统。支持OpenAI DALL-E3文生图,…

Canvas艺术之旅:探索锚点抠图的无限可能

说在前面 在日常的图片处理中,我们经常会遇到需要抠图的情况,无论是为了美化照片、制作海报,还是进行图片合成。抠图对于我们来说也是一种很常用的功能了,今天就让我们一起来看下怎么使用canvas来实现一个锚点抠图功能。 效果展示…

【数据结构实验】查找(一)基于散列表的查找算法

文章目录 1. 引言2. 实验原理2.1 散列表2.2 线性探测法2.3 冲突解决 3. 实验内容3.1 实验题目(一)输入要求(二)输出要求 3.2 算法实现3.3 代码整合 4. 实验结果 1. 引言 本实验将通过C语言实现基于散列表的查找算法 2. 实验原理 …

Django 通过 Trunc(kind) 和 Extract(lookup_name) 参数进行潜在 SQL 注入 (CVE-2022-34265)

漏洞描述 Django 于 2022 年6月4 日发布了一个安全更新,修复了 Trunc() 和 Extract() 数据库函数中的 SQL 注入漏洞。 参考链接: Django security releases issued: 4.0.6 and 3.2.14 | Weblog | Djang…

在 Linux 中重命名文件和目录

目录 前言 使用 mv 命令重命名文件和目录 通过组合 mv、find 和 exec 命令重命名与某个模式匹配的多个文件 使用 rename 命令轻松重命名多个文件 总结 前言 在这篇基本命令行教程中,你将学习在 Linux 终端重命名文件和目录的各种方法。 如何在 Linux 终端中重命…

Vue框架学习笔记——键盘事件

文章目录 前文提要键盘事件(并不是所有按键都能绑定键盘事件)常用的按键不同的tab和四个按键keyCode绑定键盘事件(不推荐)Vue.config.keyCode.自定义键名 键码 神奇的猜想div标签和click.enterbutton标签和click.enter 前文提要 …

基于卷积优化算法优化概率神经网络PNN的分类预测 - 附代码

基于卷积优化算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于卷积优化算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于卷积优化优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

1.前端--基本概念【2023.11.25】

1.网站与网页 网站是网页集合。 网页是网站中的一“页”,通常是 HTML 格式的文件,它要通过浏览器来阅读。 2.Web的构成 主要包括结构(Structure) 、表现(Presentation)和行为(Behavior&#xff…

『亚马逊云科技产品测评』活动征文|AWS 域名注册、启动与连接 EC2 新实例、端口开放详细教程

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 目录 一、AWS 域名注册 二、AWS 域名解析 三、个人网站 ICP 备案 …

Nacos安装使用

Nacos安装使用 官方下载地址: https://github.com/alibaba/nacos/releases 官方文档地址: https://nacos.io/zh-cn/docs/quick-start.html Nacos介绍 Nacos是阿里巴巴开源的一款支持服务注册与发现,配置管理以及微服务管理的组件。用来取代以前常用的注册中心&a…

第二十章 解读PASCAL VOC2012与MS COCO数据集(工具)

PASCAL VOC2012数据集 Pascal VOC2012官网地址:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/ 官方发表关于介绍数据集的文章 《The PASCALVisual Object Classes Challenge: A Retrospective》:http://host.robots.ox.ac.uk/pascal/VOC/pubs/everi…

CH01_适应设计模式

Iterator模式(迭代器模式) 迭代器模式(Iterator),提供一种方法,顺序访问一个聚合对象中各个元素,而不是暴露该对象的内部表示。 类图结构 说明 Iterator(迭代器) 该角色负责定义按…

深入理解 Django 中的事务管理

概要 在数据库操作中,事务是确保数据完整性和一致性的关键机制。Django 作为一个强大的 Python Web 框架,提供了灵活而强大的事务管理功能。理解和正确使用 Django 中的事务对于开发高质量的 Web 应用至关重要。本文将深入探讨 Django 的事务管理机制&a…

2.多行输入【2023.11.24】

1.问题描述 编写一个Python程序,将字符串 ‘Hello World!’ 存储在变量 str1 中,将字符串 ‘Hello Python!’ 存储在变量 str2 中,然后使用 print 语句分别将它们在不同行打印出来。 2.解决思路 使用print()函数即可 3.代码实现 str1&qu…

1.5 C语言之字符输入输出

1.5 C语言之字符输入输出 一、概述二、字符计数三、行计数四、单词计数五、练习 一、概述 字符文本流,是由多行字符构成的字符序列,而每行字符都由0个或多个字符组成,行末是一个换行符。 标准库提供的输入输出模型,用于读取文本内…

前端vue3——html2canvas给网站截图生成宣传海报

文章目录 ⭐前言⭐选择html2canvas实现网页截图💖 截图 ⭐图片url截图显示不出来问题💖 解决 ⭐最终效果💖 定义海报 ⭐总结⭐结束 ⭐前言 大家好,我是yma16,本文分享关于 前端vue3——html2canvas给网站截图生成宣传…

JVM字节码文件的相关概述解读

Java全能学习面试指南:https://javaxiaobear.cn 1、字节码文件 从下面这个图就可以看出,字节码文件是可以跨平台使用的 想要让一个Java程序正确地运行在JVM中,Java源码就必须要被编译为符合JVM规范的字节码。 https://docs.oracle.com/java…