关于 内部类 你了解多少?(详解!!)

news2024/10/7 6:39:48

目录

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]

 

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

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

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

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

相关文章

企业微信获取第三方应用凭证

上一篇介绍了如何配置通用开发参数及通过url回调验证, 本篇将通过服务商后台配置关联小程序应用配置和获取第三方凭证及如何配置企业可信IP。 当然上篇配置的回调设置也不会白费,在下方的指令和数据回调会用到。 第三方应用开发流程 官方企业微信第三方…

来讲解一手事务隔离级别

简介 在数据库管理系统中,事务是一组被视为单一工作单元的操作,这些操作要么全部执行成功,要么全部回滚。为了确保在多用户并发访问数据库时数据的一致性和可靠性,引入了事务隔离级别的概念。事务隔离级别定义了一个事务对于其他…

集群搭建(redis7)

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

CMA认证和CNAS认可的联系和区别?哪个更权威?

一、CMA认证是什么?   CMA认证是指中国计量认证,省级以上的计量行政部门根据中国计量法的规定,对申请CMA测试资质的第三方检测机构进行评估,对检测水平和检测可靠性达到国家标准的实验室授予计量认证合格证书(CMA资质)。 二、CNAS认可是什…

制造业数据标准化的优势分析

之前我们介绍过>>数据驱动工作效率提升的5个层次——以PreMaint设备数字化平台为例,这次我们将深入分析数据标准化在制造业中的优势。 从持续的供应链中断和疯狂的通货膨胀,到日益昂贵和难以采购的原材料,制造企业正面对越来越多的挑战…

rsync远程同步(rsync+inotify)

目录 一、概述 1、关于rsync 2、rsync的特点: 3、备份方式: 4、同步方式: 二、rsync相关命令 1、rsync常用命令的选项: 2、启动和关闭rsync服务: 3、关闭 rsync 服务 三、 免交互: 1、免密同步&a…

Java_实现图书管理系统

目录 前言 框架核心思想 框架的实现 书类和书架类的实现 功能接口实现 功能的声明 父类用户和子类管理员,子类普通用户 Main方法 前言 java图书管理系统的详细解析;从思考到实现,一步步带你学会图书管理系统. 框架核心思想 下图只是一个图书管理系统的初步…

历年国自然标书申请 面上项目614份 2001-2019年 面上标书

这里列举几例 清华任丰原 哈尔滨 杨宝峰 # 关注微信:生信小博士,10元领取 关注微信之后, 点开付费合集即可领取

Strus2 系列漏洞

目录 1、S2-001 2、S2-005 3、S2-007 4、S2-008 5、S2-009 6、S2-012 7、S2-013/S2-014 8、S2-015 9、S2-016 10、S2-019 11、s2-032 12、S2-045 13、S2-048 14、S2-052 15、S2-053 16、S2-057 17、S2-devMode Strusts 中使用 OGNL 为表达式语言。OGNL(Object…

OpenAI 开发者大会2023 解读

概述 宏观上还是分成两点:新的底层模型GPT-4 Turbo、新的应用生态GPTs。其余的名词都是服务于上面两个,很多名词是面向开发者的(非普通用户,主要是在页面上使用)容易导致混淆,比如什么JSON 格式、函数调…

使用uniapp写小程序,真机调试的时候不显示log

项目场景: 当小程序文件太大的情况下使用真机调试,但是真机调试的调试器没有任何反应 问题描述 使用uniapp写小程序,真机调试的时候不显示log 原因分析: 提示:因为真机调试的时候没有压缩文件,所以调试的…

EtherCAT从站EEPROM分类附加信息详解:SM(同步管理器)

0 工具准备 1.EtherCAT从站EEPROM数据(本文使用DE3E-556步进电机驱动器)1 分类附加信息——SM(同步管理器) 1.1 分类附加信息规范 在EEPROM字64开始的区域存储的是分类附加信息,这里存储了包括设备信息、SM配置、FM…

有向无权图的最短路径

在运筹学领域的经典模型中,最大流问题、多商品网络流问题和最短路径问题等都依附在图上对问题进行描述,同样,当我们梳理问题的数学模型,或理解相关问题的求解算法时,也要依靠它。因此,我将总结和图相关的问…

Android NDK JNI 开发native层崩溃日志栈分析

问题: 在Android的JNI开发中,你是否看到如下一堆崩溃日志,不知如何下手分析问题,崩溃在哪一行? 11-16 17:20:44.844 23077 23077 W test_jni_h: jni_preload: Starting for processln 11-16 17:20:44.844 23077 2307…

AWD比赛中的一些防护思路技巧

## 思路1: 1、改服务器密码 (1)linux:passwd (2)如果是root删除可登录用户:cat /etc/passwd | grep bash userdel -r 用户名 (3)mysql:update mysql.user set…

基于SpringBoot+Vue的二手物品交易平台

基于SpringBootVue的二手物品交易平台的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringBootMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 主页 详情 管理员界面 摘要 本项目是基于Spring Boot 和 Vue 技术栈构建…

latex简单使用

​​文章目录 公式详解 普通公式公式居中带标号公式上标下标根号分式括号运算符列表 无序列表有序列表插入图片 单图多图排版表格脚注与定理子标题目录与附录 目录附录参考文献字体设置 字体样式 加粗斜体字母大写等线自定义字体字体大小 第一种设置第二种设置第三种设置 页面…

系列六、JVM的内存结构【栈】

一、产生背景 由于跨平台性的设计,Java的指令都是根据栈来设计的,不同平台的CPU架构不同,所以不能设计为基于寄存器的。 二、概述 栈也叫栈内存,主管Java程序的运行,是在线程创建时创建,线程销毁时销毁&…

【PyQt小知识 - 4】:QGroupBox分组框控件 - 边框和标题设置

QGroupBox QGroupBox 是 PyQt 中的一个小部件,用于创建一个带有标题的组框。 可以使用 QGroupBox 将相关控件分组并添加一个标题。 以下是一个使用 QGroupBox 的示例代码(示例一): from PyQt5.QtWidgets import * import sysa…

ERP管理系统:企业升级的秘密武器

ERP管理系统:企业升级的秘密武器 在当今快速发展的商业环境中,企业要想保持竞争力,就必须不断进行自我升级。而在这个过程中,ERP管理系统以其强大的功能和优化流程的能力,逐渐成为了企业升级的秘密武器。 一、ERP管理…