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() {
            @Override
            public void func() {
                System.out.println("func()");
            }
        };
        a.func();
        System.out.println("============");
        new InterFaceA() {
            @Override
            public 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();
    }
}

在这里插入图片描述

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

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

相关文章

【计算机网络笔记】多路访问控制(MAC)协议——随机访问MAC协议

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

[环境配置]vscode免密ssh的设置流程

测试环境: windows 11 ubuntu16.04 vmware 第一步:生成密钥 cmd打开输入:ssh-keygen -t rsa 一路回车后可以在C:\Users\用户名\.ssh路径看到id_rsa.pub,我们打开这个文件,用记事本打开即可,然后复制里…

代码随想录算法训练营第四十六天【动态规划part08】 | 139.单词拆分、背包总结

139.单词拆分 题目链接: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 求解思路: 单词是物品,字符串s是背包,单词能否组成字符串s,就是问物品能不能把背包装满。 动规五部曲 确定dp数…

VCenter6.7 Web访问提示503 Service Unavailable

PS:本文分享VMware Vcenter在web登录的时候报错:503 Service Unavailable,对于6.7.x版本比较适用,其他版本需自行测试。 简单来讲就是需要重启一下vsphre-client服务,如重启该服务仍无法解决,可以尝试重启一…

从0开始学习JavaScript--JavaScript函数返回值

在JavaScript中,函数是一种强大的工具,不仅能够执行一系列操作,还可以返回值。理解函数返回值的概念对于编写清晰、灵活的代码至关重要。本文将深入探讨JavaScript函数返回值的各种方面,包括基本返回值、多返回值、异步函数的返回…

MySQL MHA高可用架构搭建

快捷查看指令 ctrlf 进行搜索会直接定位到需要的知识点和命令讲解(如有不正确的地方欢迎各位小伙伴在评论区提意见,博主会及时修改) MySQL MHA高可用架构搭建 MHA(Master HA)是一款开源的 MySQL 的高可用程序&#xf…

电磁场信息论及先进MIMO (黄大年茶思屋座谈) 笔记

天线阵的负载动态调控,动态阻抗匹配网络,实时跟着扫描角度的变化而变化,可能突破Hannan极限。 新的天线构架: 周期 —》非周期 每个单元不一样 动态可调,可重构 每个天线多端口或多模式 多层天线 非周期结构天线的增…

#define例题

我们已经学了#define的所有知识,让我们来看这道题,可不要又陷入陷阱 题目要求: #define N 4 #define Y(n) ((N2)*n) int main() {int z 2 * (N Y(5 1));printf("z%d\n", z);return 0; } 求这个z的值是多少? 我们直接…

YOLOv8 训练自己的分割数据集

之前写过一篇 使用YOLOv8训练自己的【目标检测】数据集-【收集数据集】-【标注数据集】-【划分数据集】-【配置训练环境】-【训练模型】-【评估模型】-【导出模型】,里面带大家整个流程走过一遍了, 这篇文章我们来介绍如何使用 YOLOv8 训练分割数据集&a…

旋转框检测项目相关python库知识总结(mmrotate、ppyolo_r、yolov5_obb)

旋转框常用于检测带有角度信息的矩形框,即矩形框的宽和高不再与图像坐标轴平行。相较于水平矩形框,旋转矩形框一般包括更少的背景信息。旋转框检测常用于遥感等场景中,本博文简单的介绍了可应用于旋转框数据训练的开源库,数据结构…

佳易王各行业收银管理系统软件,企业ERP管理软件,企业或个体定制开发软件以及软件教程资源下载总目录,持续更新,可关注收藏查阅

系统简介 1、佳易王软件功能实用、操作简单、软件绿色免安装,解压即可使用,软件已经内置数据库,不需再安装其他数据库文件。 2、佳易王软件,已经形成系列,上百款管理系统软件涵盖多个行业。 3、已为多个企业个体定制…

【c++】——类和对象(下) ——内存管理

作者:chlorine 专栏:c专栏 目录 💻 C/C内存分布 💻C语言中动态内存管理方式:malloc/calloc/realloc/free ​编辑 💻C内存管理方式 👉new/delete操作内置类型 👉new和delete操作自定义类型 &#x1f…

makefile 学习(5)完整的makefile模板

参考自: (1)深度学习部署笔记(二): g, makefile语法,makefile自己的CUDA编程模板(2)https://zhuanlan.zhihu.com/p/396448133(3) 一个挺好的工程模板,(https://github.com/shouxieai/cpp-proj-template) 1. c 编译流…

Linux加强篇004-Vim编辑器与Shell命令脚本

目录 前言 1. Vim文本编辑器 1.1 编写简单文档 1.2 配置主机名称 1.3 配置网卡信息 1.4 配置软件仓库 2. 编写Shell脚本 2.1 编写简单的脚本 2.2 接收用户的参数 2.3 判断用户的参数 3. 流程控制语句 3.1 if条件测试语句 3.2 for条件循环语句 3.3 while条件循环语…

深入浅出 Linux 中的 ARM IOMMU SMMU II

SMMU 驱动中的系统 I/O 设备探测 要使系统 I/O 设备的 DMA 内存访问能通过 IOMMU,需要将系统 I/O 设备和 IOMMU 设备绑定起来,也就是执行 SMMU 驱动中的系统 I/O 设备探测。总线发现系统 I/O 设备并和对应的驱动程序绑定,与 IOMMU 设备驱动程…

死锁是什么?死锁是如何产生的?如何破除死锁?

1. 死锁是什么 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 2. 死锁的三种典型情况 一个线程, 一把锁, 是不可重入锁, 该线程针对这个锁连续加锁两次, 就会出现死锁. 两个线程…

Java多态:多态多态,多么变态

👑专栏内容:Java⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录 一、重写1、重写的规则2、重写与重载的区别 二、多态1、多态的概念2、多态的实现3、向上转移和向下转型Ⅰ、向上转型Ⅱ、向下转…

蓝桥杯官网算法赛(蓝桥小课堂)

问题描述 蓝桥小课堂开课啦! 海伦公式(Herons formula),也称为海伦-秦九韶公式,是用于计算三角形面积的一种公式,它可以通过三条边的长度来确定三角形的面积,而无需知道三角形的高度。 海伦公…

BART 并行成像压缩感知重建:联合重建

本文使用 variavle-density possion-disc 采样的多通道膝盖数据进行并行重建和压缩感知重建。 0 数据欠采样sampling pattern 1 计算ESPIRiT maps % A visualization of k-space dataknee = readcfl(data/knee); ksp_rss = bart(rss 8, knee);ksp_rss = squeeze(ksp_rss); figu…

11 月 25 日 ROS 学习笔记——3D 建模与仿真

文章目录 前言一、在 ROS 中自定义机器人的3D模型1. 在 rviz 里查看3D模型2. xacro 二、Gazebo1. urdf 集成 gazebo2. 综合应用1). 运动控制及里程计2). 雷达仿真3). 摄像头信息仿真4). kinect 深度相机仿真5). 点云 前言 本文为11 月 25 日 ROS 学习笔记——3D 建模与仿真&am…