内部类

一.概念

当一个事物内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么将这个内部的完整结构最好使用内部类。在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.mfbz.cn/a/555225.html

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

相关文章

第46篇:随机存取存储器(RAM)模块<五>

Q:本期我们使用Quartus软件的IP Catalog工具创建双端口RAM。 A:前期创建的RAM存储模块只有一个端口,同时为读/写操作提供地址。我们将再创建一个具有两个地址输入端口的RAM模块,分别为读操作和写操作提供地址。选择Basic Functio…

2000-2022年各省人力资本水平数据(含原始数据+计算过程+计算结果)(无缺失)

2000-2022年各省人力资本水平数据(含原始数据计算过程计算结果) 1、时间:2000-2022年 2、来源:国家统计局 3、指标:普通高等学校在校学生数(万人)、年末常住人口(万人)、人力资本水平 4、范…

网络编程day6

#include <myhead.h> void Insert_Record(sqlite3* ppDb); // 插入记录 void Delete_Record(sqlite3* ppDb); // 删除记录 void Update_Record(sqlite3* ppDb); // 修改记录 int main(int argc, const char *argv[]) { //1、定义一个数据库句柄指针sqlite3 * ppDb NULL;…

面试经典150题——相同的树

​ 1. 题目描述 2. 题目分析与解析 要编写一个判断两棵二叉树是否完全相同的代码&#xff0c;首先需要理解何谓“完全相同”的二叉树。完全相同意味着两棵树的结构完全一致&#xff0c;并且所有对应的节点上的值也必须相同。 1. 定义问题 首先明确问题定义&#xff1a;给定…

RC4Drop加密技术:原理、实践与安全性探究

title: RC4Drop加密技术&#xff1a;原理、实践与安全性探究 date: 2024/4/18 20:47:30 updated: 2024/4/18 20:47:30 tags: RC4算法流加密安全性RC4Drop技术密钥流加密解密网络通信 第一章&#xff1a;介绍 1.1 加密技术的重要性 加密技术在当今信息社会中扮演着至关重要的…

R语言计算:t分布及t检验

t分布理论基础 t分布也称Student’s t-distribution&#xff0c;主要出现在小样本统计推断中&#xff0c;特别是当样本量较小且总体标准差未知时&#xff0c;用于估计正态分布的均值。其定义基于正态分布和 X 2 X^{2} X2分布&#xff08;卡方分布&#xff09;。如果随机变量X服…

Matlab r2023b Simulink 给子系统添加封面

写这篇记录的原因是&#xff0c;r2023b版本里改动了自定义封面的界面&#xff0c;而我是一个新手小白&#xff0c;零基础&#xff0c;探索一天之后发现实现方法。最终效果如图&#xff1a; 步骤1&#xff1a;打开软件&#xff0c;点击Simulink&#xff0c;再打开含有子系统的工…

【基础】在GCC中编译和链接不是一个命令

在 GCC&#xff08;GNU Compiler Collection&#xff09;中&#xff0c;编译和链接不是一个命令。编译是将源代码转换为目标代码的过程。它主要进行语法检查、词法分析、生成中间代码等操作。链接是将多个目标文件和库文件组合成一个可执行文件的过程。在 GCC 中&#xff0c;通…

Cesium实现加载离线地形数据(nginx发布数据,cesiumLab地形切片数据)

实现效果如图&#xff1a; 详细步骤 1 下载地形数据&#xff08;DEM&#xff09; 下载地址&#xff1a;地理空间数据云 (gscloud.cn) 操作步骤&#xff1a; 注意&#xff1a;第3步可以自主选择DEM的分辨率&#xff0c;然后下载。 下载结果解压后如下图&#xff1a; 2 使用…

C语言 递归

递归指的是在函数的定义中使用函数自身的方法。 举个例子&#xff1a; 从前有座山&#xff0c;山里有座庙&#xff0c;庙里有个老和尚&#xff0c;正在给小和尚讲故事呢&#xff01;故事是什么呢&#xff1f;“从前有座山&#xff0c;山里有座庙&#xff0c;庙里有个老和尚&…

python3高级特性

1. 装饰器 装饰器是 Python 的一种高阶函数&#xff0c;它可以在不修改函数内部代码的情况下&#xff0c;给函数增加额外的功能。 案例&#xff1a;记录函数执行时间的装饰器 import time def timing_decorator(func): def wrapper(*args, **kwargs): start_time time.t…

lua学习笔记18(面相对象之多态)

print("*****************************面相对象多态*******************************") --相同方法不同执行逻辑 object{} object.id1 function object:new()local obj{}self.__indexself setmetatable(obj,self)return obj end function object:subClass(className)…

PLC程序远程上下载

在工业自动化领域&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;扮演着至关重要的角色。然而&#xff0c;传统的PLC程序上传与下载方式往往受限于物理距离和现场环境&#xff0c;给工程师们带来了诸多不便。如今&#xff0c;随着远程技术的不断发展&#xff0c;PLC程…

基于XML配置bean(一)

文章目录 1.获取bean的两种方式1.通过id获取bean&#xff08;前面用过&#xff09;2.通过类型获取bean&#xff08;单例时使用&#xff09;1.案例2.代码1.beans.xml2.SpringBeanTest.java3.结果 3.注意事项 2.三种基本依赖注入方式1.通过属性配置bean&#xff08;前面用过&…

Eureka基础介绍和使用

目录 一.理论基础 二.父项目 2.1 新建父项目 2.2 管理依赖 三.子项目 3.1 新建子项目 3.2 注册中心Server依赖和启动类和配置文件 3.3 生产者Client 依赖和启动类和配置文件 3.5 消费者Custmer依赖和配置类、启动类和配置文件 四.心跳 五.公共资源项目 5.1新建实体…

BUG:vue表单验证校验不报错,必填都有信息,就是不能正常往下进行

vue表单验证未报错却出现异常 框架bug场景解决办法 框架 UI&#xff1a;element-UI 前端&#xff1a;vue2 bug场景 正常表单里面&#xff0c;有的信息要求必填或者加了一些限制&#xff0c;作为校验验证&#xff0c;只有走到校验才会执行其他行为&#xff0c;比如调用保存接…

labelimg安装和使用(解决闪退问题)

&#x1f308;个人主页&#xff1a;Rookie Maker &#x1f525; 系列专栏&#xff1a;计算机视觉 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于IT的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到我的代码世界~ &#x1f601; 喜…

C++修炼之路之list--C++中的双向循环链表

目录 前言 一&#xff1a;正式之前先回顾数据结构中的双向循环链表 二&#xff1a;list的简介 三&#xff1a;STL中list常用接口函数的介绍及使用 1.构造函数接口 2.list迭代器 范围for 3.数据的修改接口函数 4.list容量操作函数 5.list的迭代器失效 6.演示代码和测…

【网络编程】Web服务器shttpd源码剖析——线程池调度

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的网络编程系列之web服务器shttpd源码剖析——线程池调度&#xff0c;在这篇文章中&#xff0c;你将会学习到在Linux内核中如何创建一个自己的并发服务器shttpd&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘…

allure2教程-3-测试报告定制

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节&#xff0c;我们学习一下pytestallure2生成html测试报告的方法&#xff0c;本小节我们学习一下allure2测试报告的定制。 allure2报告预览 预览网址&#xff1a;https://demo.qameta.io/allure/# allur…
最新文章