【内部类】

news2024/11/23 23:18:01

目录

  • 1.什么是内部类
  • 2.内部类分类
    • 2.1静态内部类
    • 2.非静态内部类
    • 2.3 局部内部类(几乎不用,大家了解)
  • 3.匿名内部类

1.什么是内部类

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

class Outclass{//外部类

    //静态内部类
    static class InnerClass
    {
       
     }
}

注意:
1.定义在class类名{}外面的,即使在一个文件中,也不是内部类

class Animal{
    
}
class Dog
{
    
}

这只是两个毫无相关的两个类,并不是内部类。

2.内部类和外部类共用同一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件。
在这里插入图片描述

2.内部类分类

2.1静态内部类

静态内部类就是在一个类中,定义一个由static修饰的类

注意:
1.当我们在内部类中定义了一个方法输出这些变量的时候,外部类的非静态成员变量需要先实例化这个类,在通过这个类对象引用,获得结果。
在这里插入图片描述

2.当我们在外部类定义了一个方法,想要输出这些结果,需要先实例化内部类,在通过内部类对象的引用来获取这个变量值。
在这里插入图片描述

class Outclass{//外部类

    public int data1=1;
    private int data2=2;

    public static int data5=5;
    //静态内部类
    static class InnerClass
    {
        public int data3=1;
        private int data4=2;
        public static int data6=5;
        public void func()
        {
            Outclass outclass=new Outclass();
            System.out.println("==============");
            System.out.println(outclass.data1);
            System.out.println(outclass.data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);

        }
    }

    public void fun()
    {
        System.out.println("==============");
        InnerClass innerClass=new InnerClass();
        System.out.println(data1);
        System.out.println(data2);
        System.out.println(innerClass.data3);
        System.out.println(innerClass.data4);
        System.out.println(data5);
        System.out.println(innerClass.data6);
    }
}
public class Test {
    public static void main(String[] args) {
        Outclass.InnerClass innerClass=new Outclass.InnerClass();
        innerClass.func();
        Outclass outclass=new Outclass();
        outclass.fun();
    }
}

在这里插入图片描述

2.非静态内部类

非静态内部类就是在一个类的内部,定义一个普通类,不需要static修饰的。

注意:
1.当我们在非静态内部类中,定义了一个方法,想要输出这些变量的话,我们不需要任何的添加,直接就可以输出,但是当我们在内部类中,把外部类的变量值修改了,那么我们输出的就是我们修改过得,内部类的值。
如果我们想要得到,外部类的值,那我们就需要先实例化外部类,通过外部类对象的(Outclass2.this.data1)
这个方法了。
在这里插入图片描述

2.当我们在外部类定义了一个方法,想要输出这些结果,需要先实例化内部类,在通过内部类对象的引用来获取这个变量值。
在这里插入图片描述

class Outclass2{//外部类

    public int data1=1;
    private int data2=2;

    public static int data5=5;
    //非静态内部类
    class InnerClass2
    {
        public int data1=11111;
        public int data3=1;
        private int data4=2;
        public static final  int data6=5;
        public void func()
        {
            Outclass outclass=new Outclass();
            System.out.println("==============");
            System.out.println(data1);
            System.out.println(Outclass2.this.data1);
            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);

        }
    }

    public void fun()
    {
        System.out.println("==============");
        InnerClass2 innerClass2=new InnerClass2();
        System.out.println(data1);
        System.out.println(data2);
        System.out.println(innerClass2.data3);
        System.out.println(innerClass2.data4);
        System.out.println(data5);
        System.out.println(innerClass2.data6);
    }
}
public class Test2 {
    public static void main(String[] args) {
        Outclass2 outclass2=new Outclass2();
        Outclass2.InnerClass2 innerClass2=outclass2.new InnerClass2();
        innerClass2.func();
        outclass2.fun();
    }
}

  1. 外部类中的任何成员都可以在实例内部类方法中直接访问
  2. 实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束
  3. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名
    称.this.同名成员 来访问
  4. 实例内部类对象必须在先有外部类对象前提下才能创建
  5. 实例内部类的非静态方法中包含了一个指向外部类对象的引用
  6. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。

2.3 局部内部类(几乎不用,大家了解)

就是在一个类中,定义一个方法,然后在这个方法中,定义一个普通类。

class Outclass3{

    public int a=10;
    public void func()
    {
        //局部内部类
        class Innerclass
        {
            public void test()
            {
                System.out.println("hello!");
            }
        }
        Innerclass innerclass=new Innerclass();
        innerclass.test();
    }
}
public class Test3 {
    public static void main(String[] args) {
        Outclass3 outclass3=new Outclass3();
        outclass3.func();
    }
}

注意:
局部内部类的使用,只能在这个方法中使用,就是说只能在这个方法中进行实例化,然后调用内部类中的属性。

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

3.匿名内部类

匿名内部类

匿名内部类,就是没有名字的一种嵌套类。它是Java对类的定义方式之一。

为什么要使用匿名内部类?

在实际开发中,我们常常遇到这样的情况:一个接口的方法的某个实现方式在程序中只会执行一次,但为了使用它,我们需要创建它的实现类/子类去实现/重写。此时可以使用匿名内部类的方式,可以无需创建新的类,减少代码冗余。

interface IA
{
    void func();
}
public class Test4 {
    public static void main(String[] args) {
        //匿名内部类
        new IA(){

            @Override
            public void func() {
                System.out.println("hello!!!");
            }
        }.func();
    }
}

我们为了实现某一个方法,就需要先实现一个接口,但是如果我们想使用这个方法的话就需要去实例化一个对象,太麻烦,所以我们就通过new 接口(){ };这样的格式,去定义一个匿名内部类,最后调用这个方法就可以了。
这个就是匿名内部类的格式了。
在这里插入图片描述

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

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

相关文章

JAVA打印Hello World的底层实现

任何一个学过JAVA的人应该都对这段代码非常熟悉。空闲时间翻了下代码,看看它的底层是怎么实现的 public class HelloWorld {public static void main(String[] args) {System.out.print("Hello, World!");} }首先点开out,发现它是System类中的…

JAVA微服务_网关

服务网关 什么是服务网关/API网关 API Gateway(APIGW / API 网关),顾名思义,是系统对外的唯一入口。API网关封装了系统内部架构,为每个客户端提供定制的API。 近几年来移动应用与企业间互联需求的兴起。从以前单一的…

数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)

目录 问题分类 无权图单源最短路径算法 思路 伪代码 时间复杂度 代码实现(C语言) 有权图单源最短路径算法 Dijkstra(迪杰斯特拉)算法 伪代码 时间复杂度 代码实现(C语言) 多源最短路径算法 …

《Apollo 智能驾驶进阶课程》四、感知

1. 感知概貌 2. 传感器和标定 激光雷达:主动式,发射功率限制 Camera: 被动式,受到光照影响大 Radar : 多普勒效率 相对速度 超声波: 感知距离有限,倒车时使用。 … 最后设备还在研发过程中。 PnP问题,解决标定。 IC…

chatgpt赋能python:Python实现字符串匹配的SEO优化

Python实现字符串匹配的SEO优化 在现代网络中,SEO(搜索引擎优化)已成为一项必不可少的技能。它涉及到网站的排名、用户的流量和营销策略等方面。关键字匹配是一种常见的SEO技术,它可以帮助你的网站在搜索引擎中排名更高。 本篇文…

Java 实现判定顺序表中是否包含某个元素的方法

一、思路 1.定义一个toFind变量来传入要查找的元素 2.遍历整个顺序表并判定当前下标的元素等不等于toFind 3.如果等于就返回一个true,否则返回false。 二、图解 首先调用以下的方法求出顺序表的长度,再使用 for 循环遍历每一个元素。 // 求顺序表的长…

《嵌入式系统》知识总结9:使用STM32固件库操纵GPIO

STM32固件库(函数库) “STM32 标准函数库”它是由 ST 公司针对 STM32 提供的函数接口,即 API (Application Program Interface),开发者可调用这些函数接口来配置 STM32的寄存器,使开发人员得以脱离最底层的寄存器操作&…

《阿里大数据之路》研读笔记(1)

首先先看到OLAP和OLTP的区别: OLTP(Online transaction processing):在线/联机事务处理。典型的OLTP类操作都比较简单,主要是对数据库中的数据进行增删改查,操作主体一般是产品的用户或者是操作人员。 OLAP(Online analytical processing):…

libVLC 抓取视频帧并渲染(QGraphicsView)

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在《libVLC 抓取视频帧并渲染(QWidget)》介绍完 QWidget 对视频帧的渲染之后,是时候介绍第二种方式了 - QGraphicsView/QGraphicsScene/QGraphicsItem 图形视图框架。 基本步骤:自定义一个 QGraphicsIte…

RK3588平台开发系列讲解(驱动基础篇)等待队列

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、等待队列二、等待队列头三、等待队列项四、添加/删除队列五、等待唤醒六、等待事件沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Linux 内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧…

KeepChatGPT: chatGPT增强插件,解决报错、保持活跃,让AI更丝滑

KeepChatGPT: chatGPT增强插件,解决报错、保持活跃,让AI更丝滑 这是一个ChatGPT的畅聊与增强插件。开源免费。不仅能解决所有报错不再刷新,还有保持活跃、取消审计、克隆对话、净化首页、展示大屏、展示全屏、言无不尽、拦截跟踪…

周赛348(模拟、反向思维、数位DP)

文章目录 [6462. 最小化字符串长度](https://leetcode.cn/problems/minimize-string-length/)阅读理解 [6424. 半有序排列](https://leetcode.cn/problems/semi-ordered-permutation/)模拟 [6472. 查询后矩阵的和](https://leetcode.cn/problems/sum-of-matrix-after-queries/)…

java并发编程:volatile关键字详解

文章目录 内存可见性禁止重排序什么是重排序?重排序的类型有哪些呢? 内存屏障volatile的用途 在Java中,volatile关键字有特殊的内存语义。volatile主要有以下两个功能: 保证变量的内存可见性禁止volatile变量与普通变量重排序 内存可见性 …

RK3588平台开发系列讲解(驱动基础篇)中断下文之 tasklet

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、中断下文之 tasklet二、tasklet相关函数介绍三、tasklet使用示例四、中断视频介绍沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 介绍中断下文之 tasklet 的基础理论知识。 一、中断下文之 tasklet 中断…

C C++ 的内存管理(C++)

目录 C / C 的内存分布 C / C 程序内存区域划分:​ C语言内存管理 C中动态内存管理方式: C内存管理 C内存管理的方式: new / delete 操作内置类型 new 和 delete 操作自定义类型 new 和 delete 与 malloc 和 free 的区别: operato…

基于Springboot的漫画之家系统设计实现

💞文末获取源码联系🙉 👇🏻 精选专栏推荐收藏订阅👇🏻 🎀Java项目精选实战案例《600套》😘 https://blog.csdn.net/rucoding/category_12319634.html 文章目录 1、演示视频2、课题背…

QSS盒子模型入门指南:了解和应用基础知识

目录 1. QSS盒子模型的组成部分2. QSS盒子模型的属性3. QSS盒子模型的布局4. QSS盒子模型的调试工具结论 #概述 QSS(Qt Style Sheets)是一种用于美化和定制化Qt应用程序的样式表语言。了解和掌握QSS盒子模型的基本概念对于创建漂亮的用户界面布局至关重要…

javascript基础二十七:说说 JavaScript 数字精度丢失的问题,解决方案?

一、场景复现 一个经典的面试题 0.1 0.2 0.3 // false 为什么是false呢? 先看下面这个比喻 比如一个数 130.33333333… 这是一个除不尽的运算,3会一直无限循环,数学可以表示,但是计算机要存储,方便下次再使用,但…

IMX6ULL裸机篇之I2C实验-硬件原理图

一. I2C 实验简介 I2C实验,我们就来学习如何使用 I.MX6U 的 I2C 接口来驱动 AP3216C,读取 AP3216C 的传感器数据。 AP3216C是一个三合一的环境光传感器,ALSPSIRLED,ALS是环境光,PS是接近传感器,IR是红外L…

2023 华为 Datacom-HCIE 真题题库 12/12(完结)--含解析

单项选择题 1.[试题编号:190728] (单选题)以下哪种工具不能用来匹配BGP路由条目? A、基本ACL B、高级ACL C、IP PREFIX LIST D、Community Filter 答案:B 解析:高级ACL是一种用于过滤IPv4报文的ACL&#…