内部类

news2024/12/24 2:56:05

一.概念

当一个事物内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么将这个内部的完整结构最好使用内部类。在Java中,可以将一个类定义在另一个类或者一个方法内部,前者称为内部类,后者称为外部类,内部类也是封装的一种体现

注意:

1.定义在类名{}外部的,即使在同一个文件里,都不能称为内部类

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

二.内部类的分类

内部类可以在一个类的哪些位置进行定义呢?

public class Outclass{
    //成员位置定义,未被static修饰-实例内部类
    public class Innerclass1{
    }

    //成员位置定义,被static修饰-静态内部类
    static class Innerclass2{

    }

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

根据内部类定义的位置不同,一般可分为几种形式

三.实例内部类

即未被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);
            //输出300

            //如果要访问外部类同名成员时,必须:外部类名称.this.同名成员名字
            OutClass.this.c = 400;
            System.out.println(OutClass.this.c);
            //输出400
        }
    }

    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();
        
    }
}

要访问实例内部类中成员,必须要创建实例内部类的对象

而普通内部类定义与外部类成员定义位置相同,因此创建实例内部类对象时必须借助外部类

//创建实例内部类对象
        OutClass.InnerClass innerClass1 = new OutClass().new InnerClass();
        //这样写比较奇怪,也可以先将外部类对象先创建出来,然后再实例化内部类对象
//        OutClass outClass = new OutClass();
        OutClass.InnerClass innerClass2 = outClass.new InnerClass();
        innerClass2.methodInner();

四.静态内部类

被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();
        }
    }

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

不能直接在静态内部类中直接访问外部类的非静态成员,可以拿外部类对象访问

OutClass outClass = new OutClass();
System.out.println(outClass.a);

五.局部内部类

定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用,一般使用较少

public class OutClass {
    int a;
    public void methodd(){
        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; 编译失败
    }
}

编译器也有自己独立的字节码文件。命名格式:外部类名字$数字内部类名字.class

六.匿名内部类

定义:匿名内部类其实就是没有名称的内部类

说明:在调用包含有接口类型参数的方法时吗,通常为了简化代码,可以直接通过匿名内部类的形式传入一个接口类型参数,在匿名内部类中直接完成方法的实现

前提:必须是类或接口

格式:new 类名/接口名(){

                重写抽象方法

        }

public abstract class Animal {
    public abstract void eat();
}
public class Demo {
    public static void main(String[] args) {
        new Animal(){  //整体就等效于:是Animal父类的子类对象
            public void eat(){
                System.out.println("狗吃肉");
            }
        }
    }
}

此时只是创建了子类对象,没有调用方法

若要调用方法,有两种方式

public class Demo {
    public static void main(String[] args) {
        new Animal(){  //整体就等效于:是Animal父类的子类对象
            public void eat(){
                System.out.println("狗吃肉");
            }
        }.eat();
    }
}
public class Demo {
    public static void main(String[] args) {
        Animal a = new Animal() {
            public void eat(){
                System.out.println("狗吃肉");
            }
        };
        a.eat();
    }
}

注意:通过匿名内部类访问局部变量,此局部变量不能被修改

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

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

相关文章

如何进行开关电源温升极限测试?

开关电源温升极限测试是指开关电源在没有过温保护的条件下,逐渐升高电源的测试温度,直到开关电源损坏。温升极限测试是为了研究开关电源能够承受的最高环境温度,从而评估开关电源的性能,优化提升开关电源的工艺设计。 温升极限测试…

【Canvas技法】六种环状花纹荟萃

【图例】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>使用HTML5/Canvas绘制六种环状花纹</title><style type&quo…

SimCLR v2(NeurIPS 2020)论文解读

paper&#xff1a;Big Self-Supervised Models are Strong Semi-Supervised Learners official implementation&#xff1a;https://github.com/google-research/simclr 本文的创新点 本文在SimCLR的基础上做了一些改进&#xff0c;提出了SimCLR v2&#xff0c;进一步提升了…

车机系统与 Android 的关系概述

前言&#xff1a;搞懂 Android 系统和汽车到底有什么关系。 文章目录 一、基本概念1、Android Auto1&#xff09;是什么2&#xff09;功能 2、Google Assistant3、Android Automotive1、Android Auto 和 Android Automotive 的区别 4、App1&#xff09;App 的开发2&#xff09;…

JavaWeb开发02-MYSQL-DDL-DML-DQL-多表设计-多表查询-事务-索引

一、MySQL概述 通过SQL语句可以操作数据库 关系型数据库&#xff1a; 只要是关系型数据库就可以用SQL语句这一统一标准进行操作数据库 1.MYSQL数据模型 客户端通过SQL语句交给了数据库管理系统DBMS&#xff0c;进行相应操作&#xff0c;创建一个一个数据库&#xff0c;体现为一…

mysql使用逗号分隔的一行数据转多行数据

文章目录 学习链接准备建表插入数据 方法MySQL逗号拼接的列拆分为多行&#xff08;不使用mysql.help_topic&#xff09;遇到字段以逗号分隔符分号分隔符存放多个值&#xff0c;需要一行转化多行&#xff0c;以用来关联&#xff08;使用mysql.help_topic&#xff09;改为LEFT JO…

DevOps是什么?

DevOps是一系列实践、工具和文化理念的组合&#xff0c;旨在自动化并整合软件开发和信息技术运维团队之间的流程。以下是DevOps的几个关键点&#xff1a; 沟通与协作&#xff1a;DevOps强调开发和运维团队之间的沟通与合作&#xff0c;通过改善这两个部门间的协作关系&#xff…

OpenHarmony轻量系统开发【13】鸿蒙小车开发

13.1 小车介绍 基于鸿蒙系统 Hi3861 的WiFi小车 首先&#xff0c;我们得有一套WiFi小车套件&#xff0c;其实也是Hi3861 加上电机、循迹模块、超声波等模块。 小车安装完大概是这样&#xff1a; 13.2 电机驱动 我们这里先只做最简单的&#xff0c;驱动小车的电机&#xff…

奶酪——并查集,BFS,DFS(NOIP2017提高组)

目录 题目 思路 并查集 代码&#xff08;java&#xff09; BFS&#xff08;DFS同理&#xff09; 代码&#xff08;C&#xff09; 题目 思路 这个题目意思是有很多个球分布在一个三维空间内&#xff0c;如果这些球相切或者相交都可以互相到达&#xff0c;我们需要判断能否…

【python从入门到精通】-- 第五战:函数大总结

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…

元宇宙VR虚拟线上展馆满足企业快速布展的需要

想要拥有一个VR线上虚拟展馆&#xff0c;展现您的城市风采或企业特色吗? 相比实体展馆搭建&#xff0c;VR线上虚拟展馆投入资金少&#xff0c;回报周期短&#xff0c;只需几个月的时间&#xff0c;您就能开始资金回笼。那么一个VR线上虚拟展馆多少钱呢? 深圳VR公司华锐视点基…

C语言如何使⽤指针?

一、问题 指针变量在初始化以后就可以使⽤和参与操作了&#xff0c;那么就要⽤到对指针变量最常⽤的两个操作符——> * 和 &#xff06; 。 二、解答 这⾥⼜要提到始终贯穿着指针的⼀个符号“ * ”&#xff0c;但是这⾥的“ * ”是作为指针运算符使⽤的&#xff0c;叫做取内…

三大常用自动化框架对比

上次发布过性能测试工具的对比后&#xff0c;有小伙伴后台留言&#xff0c;想了解一下自动化测试框架的对比&#xff0c;尤其是RobotFramework、pytest和unitest之间的优劣势情况。 这不我们今天就来分析一下他们之间的区别和各自的优缺点。 1 RobotFramework 优点&#xff1a;…

selenium 下载文件取消安全下载的方法

问题描述 我要从一个网站上下载文件&#xff0c;谷歌浏览器总是自动阻止下载&#xff0c;并询问我是否保留。 可是&#xff0c;我想要的是不要询问&#xff0c;默认下载即可。 运行环境 OS: macOSselenium: 4.19.0python: 3.10.11Chrome: 124.0.6367.62selenium chromedrive…

openEuler-23.03下载

下载地址&#xff1a;openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网 下载版本&#xff1a;openEuler-23.03-x86_64-dvd.iso

CTF中常见的四种python逆向

说在前面&#xff1a; 什么是pyc文件&#xff1f; pyc是一种二进制文件&#xff0c;是由py文件经过编译后&#xff0c;生成的文件&#xff0c;是一种byte code&#xff0c;py文件变成pyc文件后&#xff0c;加载的速度有所提高&#xff0c; pyc 文件是 Python 编译过的字节码文…

WdatePicker异常,无法弹出日期选择框

官网&#xff1a;My97日期控件官方网站 My97 DatePickerhttp://www.my97.net/ 可能使版本太老了&#xff0c;可以更新一下&#xff0c;然后根据官方的文件进行使用。 我的异常是因为在网上找的包里面缺少文件&#xff0c;去官网拉了一下最新的就行了。

【Linux驱动层】iTOP-RK3568学习之路(二):vscode中设置头文件路径-完成代码自动补全

在Ubuntu下用vscode写Linux驱动层的时候&#xff0c;需要添加头文件&#xff1a; #include<linux/module.h> #include<linux/init.h> #include<linux/kernel.h>但vscode没有智能提示&#xff0c;因此需要我们手动添加自己的头文件路径&#xff1a; topeetu…

Ubuntu 23.10.1 nginx源码安装

注&#xff1a;以下所有命令均在root管理员模式下&#xff0c;若不是&#xff0c;请在所有命令前加sudo 1、安装依赖库 1.1、安装gcc g的依赖库 apt-get install build-essential apt-get install libtool1.2、安装pcre依赖库 apt-get update apt-get install libpcre3 lib…

嵌入式科普(15)小米su7成本分析和拆解之智驶、座舱分析

目录 一、概述 二、小米su7成本分析 2.1 整车成本构成 2.2 三电系统 2.3 车身与底盘 2.3 智能网联 2.4 内外饰 三、小米su7拆解之智驶、座舱分析 3.1 主要芯片 3.2 智能驾驶&智能座舱 四、NXP S32K324汽车通用微控制器 嵌入式科普(15)小米su7成本分析和拆解之智…