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…

【数据库设计和SQL基础语法】--数据库设计基础--数据规范化和反规范化

一、 数据规范化 1.1 数据规范化的概念 定义 数据规范化是数据库设计中的一种方法,通过组织表结构,减少数据冗余,提高数据一致性和降低更新异常的过程。这一过程确保数据库中的数据结构遵循一定的标准和规范,使得数据存储更加高…

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

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

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

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

c++ 多态案例 析构函数案例 组装电脑(cpu gpu ram)

#include <iostream>// CPU基类 class CPU { public:virtual ~CPU() {}virtual void process() 0; };// GPU基类 class GPU { public:virtual ~GPU() {}virtual void render() 0; };// RAM基类 class RAM { public:virtual ~RAM() {}virtual void storage() 0; };// 英…

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

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

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

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

在 Linux 中重命名文件和目录

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

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

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

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

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

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

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

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

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

Drools 7 Modify 和对象直接赋值差异

modify代表修改fact&#xff0c;会再次触发符合条件的rule对象直接修改只是java 操作&#xff0c;不会会再次触发符合条件的rule 以下为测试代码-drl部分 package org.drools.learnimport org.drools.learn.ModifyTest.Message;global java.util.List listrule "Stateles…

Nacos安装使用

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

【微软技术栈】与其他异步模式和类型互操作

本文内容 任务和异步编程模型 (APM)任务和基于事件的异步模式 (EAP)任务和等待句柄 .NET 中异步模式的简短历史记录&#xff1a; .NET Framework 1.0 引进了 IAsyncResult 模式&#xff0c;也称为异步编程模型 (APM) 或 Begin/End 模式。.NET Framework 2.0 增加了基于事件的…

等待多个请求(请求并发执行)都完成后结束Loading框

等待多个请求&#xff08;请求并发执行&#xff09;都完成后结束Loading框 // 这里用vue进行示范&#xff0c;react使用useEffect是一样的 onMounted(() > initializeApp(initSwiper(),initNoticeText(),initCardTypes(),initCards() ));/*** 传入多个promise对象&#xff…

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

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

CH01_适应设计模式

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