关于 内部类 你懂多少?

目录

1. 什么是内部类?

2. 内部类的分类 

3. 内部类

3.1 实例内部类

3.2 静态内部类 

4. 局部内部类 

5. 匿名内部类

 6.对象的打印


       “不积跬步无以至千里,不积小流无以成江海。”每天坚持学习,哪怕是一点点!!!

1. 什么是内部类?

在Java中,内部类是定义在其他类内部的类。它们的存在是为了提供更加灵活和功能强大的方式来组织和管理代码,从而使代码更加清晰和易于维护。当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么这个内部的完整结构最好使用内部类。在 Java 中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。内部类也是封装的一种体现。

public class OutClass {
    class InClass{

    }
} 

// OutClass是外部类
// InClass是内部类

 【注意事项】
 1. 定义在class 类名{}花括号外部的,即使是在一个文件里,都不能称为内部类

public class A{

}

class B{

}

// A 和 B是两个独立的类,彼此之前没有关系

 2. 内部类和外部类共用同一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件

2. 内部类的分类 

先来看下,内部类都可以在一个类的哪些位置进行定义

public class OutClass {
    // 成员位置定义:未被static修饰 --->实例内部类
    public class InnerClass1{
    }


     // 成员位置定义:被static修饰 ---> 静态内部类
    static class InnerClass2{
    }


    public void method(){
    // 方法中也可以定义内部类 ---> 局部内部类:几乎不用
        class InnerClass5{
        }
    }
}

根据内部类定义的位置不同,一般可以分为以下几种形式:
      1. 成员内部类(普通内部类:未被static修饰的成员内部类 和 静态内部类:被static修饰的成员内部类)
      2. 局部内部类(不谈修饰符)、匿名内部类
注意:内部类其实日常开发中使用并不是非常多,大家在看一些库中的代码时候可能会遇到的比较多,日常开始中使用最多的是匿名内部类

3. 内部类

在外部类中,内部类定义位置与外部类成员所处的位置相同,因此称为成员内部类

3.1 实例内部类

即未被static修饰的成员内部类。

public class OutClass {
    private int a;
    static int b;
    int c;

    public void methodA(){
        a = 10;
        System.out.println(a);
    }

    public static void methodB(){
        System.out.println(b);
    }

    // 实例内部类:未被static修饰
    class InnerClass{
        int c;
        public void methodInner(){

            // 在实例内部类中可以直接访问外部类中:任意访问限定符修饰的成员
            a = 100;
            b =200;
            methodA();
            methodB();

            // 如果外部类和实例内部类中具有相同名称成员时,优先访问的是内部类自己的
            c = 300;
            System.out.println(c);

            // 如果要访问外部类同名成员时候,必须:外部类名称.this.同名成员名字
            OutClass.this.c = 400;
            System.out.println(OutClass.this.c);
        }
    }
    public static void main(String[] args) {
        // 外部类:对象创建 以及 成员访问
        OutClass outClass = new OutClass();
        System.out.println(outClass.a);
        System.out.println(OutClass.b);
        System.out.println(outClass.c);
        outClass.methodA();
        outClass.methodB();
        System.out.println("=============实例内部类的访问=============");
        // 要访问实例内部类中成员,必须要创建实例内部类的对象
        // 而普通内部类定义与外部类成员定义位置相同,因此创建实例内部类对象时必须借助外部类
        // 创建实例内部类对象
        OutClass.InnerClass innerClass1 = new OutClass().new InnerClass();
        // 上述语法比较怪异,也可以先将外部类对象先创建出来,然后再创建实例内部类对象
        OutClass.InnerClass innerClass2 = outClass.new InnerClass();
        innerClass2.methodInner();
    }
}

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

3.2 静态内部类 

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

public class OutClass {
    private int a;
    static int b;
    public void methodA(){
    a = 10;
    System.out.println(a);
}

public static void methodB(){
    System.out.println(b);
} 

// 静态内部类:被static修饰的成员内部类
static class InnerClass{
    public void methodInner(){
        // 在内部类中只能访问外部类的静态成员
        // a = 100; // 编译失败,因为a不是类成员变量
        b =200;
        // methodA(); // 编译失败,因为methodB()不是类成员方法
        methodB();
    }
}

public static void main(String[] args) {
    // 静态内部类对象创建 & 成员访问
    OutClass.InnerClass innerClass = new OutClass.InnerClass();
    innerClass.methodInner();
    }
}

 【注意事项】
1. 在静态内部类中只能访问外部类中的静态成员
2. 创建静态内部类对象时,不需要先创建外部类对象

4. 局部内部类 

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

public class OutClass {
    int a = 10;
    public void method(){
        int b = 10;
        // 局部内部类:定义在方法体内部
        // 不能被public、static等访问限定符修饰
        class InnerClass{
            public void methodInnerClass(){
                System.out.println(a);
                System.out.println(b);
            }
        } 
        // 只能在该方法体内部使用,其他位置都不能用
        InnerClass innerClass = new InnerClass();
        innerClass.methodInnerClass();
    }

    public static void main(String[] args) {
        // OutClass.InnerClass innerClass = null; 编译失败
    }
}

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

5. 匿名内部类

匿名内部类是指没有类名的内部类,通常在创建接口实例或继承抽象类时使用。它的语法结构如下:

new 父类构造器/接口() { 
    // 匿名内部类的类体,可以是成员变量、方法等
};

其中,父类构造器是指要继承的父类的构造方法,接口是指要实现的接口。在匿名内部类的类体中,可以定义成员变量、方法等,但不能有构造方法。

以下是一个示例,创建了一个实现了Runnable接口的匿名内部类:

Thread t = new Thread(new Runnable() {
    public void run() {
        System.out.println("Hello, World!");
    }
});
t.start();

在这个示例中,我们创建了一个Thread对象,并向它的构造方法中传入了一个实现了Runnable接口的匿名内部类。该匿名内部类实现了run方法,当线程启动后就会执行该方法,输出“Hello, World!”的信息。

 

 6.对象的打印

public class Person {
    String name;
    String gender;
    int age;

    public Person(String name, String gender, int age) {
        this.name = name;
        this.gender = gender;
        this.age = age;
    }

    public static void main(String[] args) {
        Person person = new Person("Jim","男", 18);
        System.out.println(person);
    }

} 
// 打印结果:day20210829.Person@1b6d3586

 如果想要默认打印对象中的属性该如何处理呢?答案:重写toString方法即可。

public class Person {
    String name;
    String gender;
    int age;

    public Person(String name, String gender, int age) {
        this.name = name;
        this.gender = gender;
        this.age = age;
    }

    @Override
    public String toString() {
        return "[" + name + "," + gender + "," + age + "]";
    }

    public static void main(String[] args) {
        Person person = new Person("A小码","男", 18);
        System.out.println(person);
    }
}

//输出结果:[A小码,男,18]

 

( 注:图片来自网络,如有侵权,请联系删除 )  

希望对大家有所帮助,感谢观看!!!

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

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

相关文章

【MATLAB源码-第79期】基于蚯蚓优化算法(EOA)的栅格路径规划,输出做短路径图和适应度曲线。

操作环境: MATLAB 2022a 1、算法描述 蚯蚓优化算法(Earthworm Optimisation Algorithm, EOA)是一种启发式算法,灵感来源于蚯蚓在自然界中的行为模式。蚯蚓优化算法主要模仿了蚯蚓在寻找食物和逃避天敌时的行为策略。以下是蚯蚓…

桂院校园导航 | 云上高校导航 云开发项目 二次开发教程 1.3

Gitee代码仓库:桂院校园导航小程序 GitHub代码仓库:GLU-Campus-Guide 演示视频 中国大学生计算机设计大赛-移动应用与开发-云上高校导航 升级日志 1.3 优化了小程序的数据存储方式,对部分页面进行了调整,调整了功能和代码。 引…

C语言再学习 -- 编程规范

C语言编程规范这部分一直想总结一下。现在终于付诸行动了。 其实之前讲过一些面试题,参看:嵌入式面试知识点总结 – C语言篇 里面已经有包含一部分了,比如《高质量C C编程指南》.林锐着.pdf。 此次主要参考 华为技术有限公司c语言编程规范 …

交换机如何配置BGP协议

环境: 华为交换机 华三交换机 问题描述: 交换机如何配置BGP协议 解决方案: 华三交换机上配置案例 1.配置BGP协议,可以按照以下步骤进行: 登录交换机:使用SSH、Telnet或控制台等方式登录到华三交换…

本地开发环境和服务器传输数据的几种方法

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

听GPT 讲Rust源代码--library/core/src(8)

题图来自 Hello, crustaceans. File: rust/library/core/src/future/ready.rs 在Rust源代码中,rust/library/core/src/future/ready.rs文件的作用是定义了一个名为Ready的Future类型。Ready是一个简单的Future实现,它立即返回一个给定的值。 Ready 是一个…

新晋“学霸”夸克大模型拿下C-Eval和CMMLU双榜第一

11月16日,根据最新成绩,千亿级参数的夸克大模型登顶C-Eval和CMMLU两大权威评测榜单,多项性能优于GPT-4。在国内大模型赛道火热的当下,夸克自研大模型凭借过硬的研发能力及数据、行业、平台等优势成为新晋“学霸”。 作为国内最权…

智能家居小程序

1、设备 系统板:STM32F103C8T6 温湿度传感器:DHT11 光照度传感器: BH1750 WIFI模块:ESP8266-015 蜂鸣器: 立创EDC画板子,然后微立创下单

小型企业如何选择非管理型交换机?

网络的一个关键要素都是交换机,它在连接设备和确保无缝数据流动方面发挥着关键作用。特别是非管理型交换机,为希望提升网络能力的小型企业提供了一种经济高效的解决方案。在本文中,我们将探讨非管理型交换机在小型企业网络中的广泛应用以及小…

十、http客户端Feign

目录 一、使用Feign客户端 1、修改pom文件 2、在启动类OrderApplication中加入注释 3、创建客户端接口 4、装配UserClient,并且进行远程调用 5、发送请求,查看服务调用情况 二、定义Feigin的配置 方式一:配置文件方式 (1&…

selenium 网页自动化-在访问一个网页时弹出的浏览器窗口,我该如何处理?

前言 相信大家在使用selenium做网页自动化时,会遇到如下这样的一个场景: 在你使用get访问某一个网址时,会在页面中弹出如上图所示的弹出框。 首先想到是利用Alert类来处理它。 然而,很不幸,Alert类处理的结果就是没…

蓝桥杯第三周算法竞赛D题E题

发现更多计算机知识,欢迎访问Cr不是铬的个人网站 D迷宫逃脱 拿到题目一眼应该就能看出是可以用动态规划来解决。但是怎么定义dp呢? 这个题增加难度的点就在当所在位置与下一个要去的位置互质的时候,会消耗一把钥匙。当没有钥匙的时候就不能移动了。想…

基础课5——垂直领域对话系统架构

垂直领域对话系统是指针对特定领域或行业的需求而构建的对话系统。这种系统通常需要具备高度的专业知识和对特定领域的知识库进行深入的学习和训练,以便能够提供准确、高效、实用的服务。 垂直领域对话系统的构建通常包括以下步骤: 确定目标领域或行业…

广州华锐互动VRAR:VR教学楼地震模拟体验增强学生防震减灾意识

在当今社会,地震作为一种自然灾害,给人们的生活带来了巨大的威胁。特别是在学校这样的集体场所,一旦发生地震,后果将不堪设想。因此,加强校园安全教育,提高师生的防震减灾意识和能力,已经成为了…

目标检测—YOLO系列(一)(YOLOv1/2/v3/4/5/x/6/7/8)

目标检测概述 什么是目标检测? 滑动窗口(Sliding Window) 滑动窗口的效率问题和改进 滑动窗口的效率问题:计算成本很大 改进思路 1:使用启发式算法替换暴力遍历 例如 R-CNN,Fast R-CNN 中使用 Selectiv…

使用yolov8的一些错误

出现这个报错的时候: AutoInstall will run now for ultralytics.nn.modules.conv but this feature will be removed in the future. Recommend fixes are to train a new model using the latest ultralytics package or to run a command with an official YOLO…

java代码审计(入门级)—基础漏洞合集

目录 (一)前言 (二)经典漏洞的代码审计 1、SQL注入 漏洞原理: 连接数据库的方式: 代码审计 2、XXE(XML外部实体注入) 漏洞原理 代码审计: 3、xss 漏洞原理 X…

P1941 飞扬的小鸟

P1941 飞扬的小鸟 Description Flappy Bird 是一款风靡一时的休闲手机游戏。玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙。如果小鸟一不小心撞到了水管或者掉在地上的话,便宣告失败。 为了简化问题&am…

集群搭建(redis7)

一、主从复制(replica)(不推荐) 介绍 主从复制 mmaster以写为主,slave以读为主当master数据变化时,自动将新的数据异步同步到其他slave数据库 读写分离down机恢复数据备份水平扩容支撑高并发 基本操作 配从不配主 权限细节 maste…

【Git企业开发】第八节.企业级开发模型和企业级项目管理实战

文章目录 前言一、企业级开发模型 1.1 系统开发环境 1.2 Git分支设计规范二、企业级项目管理实战 2.1 DevOps研发平台 2.2 开发场景-基于git flow模型的实践 2.3 环境bug修复总结 前言 一、企业级开发模型 我们知道,一个软件从零开始到最终…