Java内部类

别再为PCB和散热器文件发愁了!手把手教你用ADS导出DWG文件给工厂(附单位转换避坑指南) 本文详细解析了从ADS设计到PCB/散热器加工的DWG文件导出全流程,重点介绍了单位转换、分层导出策略及散热器文件处理等关键步骤,帮助射频工程师避免加工误差和返工。特别提供了mil与mm单位转换的精确处理方法,确保设计文件与工厂加工需求无缝对接。 阅读详情

在java中,可以在一个类内部定义另外一个类,也就是我们所说的内部类,内部类个人感觉最大的功能是为java多继承提供了支持(java类最多只能继承一个基类,不允许多继承)。

java内部类有四种,分别是成员内部类、局部内部类、匿名内部类和静态内部类(也称嵌套内部类),下面分别讲一下这四种内部类。

成员内部类

成员内部类位于外部类的内部,看起来就像一个成员变量一样,下面是一个成员内部类的实例:

class A{}
class B{}
interface C{}
interface D{}

class Outter extends A implements C{        //外部类
    private int i = 0;

    public class Inner extends B implements C,D{        //内部类
        int i = 1;
        void test(){
            System.out.println(i);  //1,内部类的i
            System.out.println(Outter.this.i);//0,外部类的i
        }
    }
}   
  • 成员内部类的访问修饰符可以是public,protected,private和缺省。而器外部类只能是public,缺省或者定义为abstract。

  • 上面的例子可以看到,内部类可以访问外部类的成员,如果成员名字有冲突时,默认是内部类自己的成员,这种情况下要想访问外部类的成员,需要使用this

  • 外部类继承了B,而内部类继承了C,这样就实现了java的多继承。

  • 这里我们可以看到,内部类和外部类都同时实现了C接口,这也是允许的。内部类和外部类可以以不同方法实现同一个接口。

创建成员内部类对象

    public static void main(String[] args) {
        Outter outter = new Outter();   //必须要创建外部类对象
        Outter.Inner inner = outter.new Inner();
    }
  • 必须先创建外部类的对象。有兴趣的同志可以去反编译一个内部类的字节码,就可以发现其实它的构造函数接受了一个外部类的对象作为参数,所以创建内部类对象必须要有一个外部类的对象。
  • 用outter.new的方法去创建内部类对象。

局部内部类

局部内部类定义在外部类成员方法内部。

class Outter extends A implements C { // 外部类
    private int i = 0;

    public B test() {
        class Inner extends B implements C, D { // 内部类

        }
        return new Inner();
    }
  • 局部内部类因为不会在其他地方被实例化,所以权限修饰符对于它来说就没有意义了,所以局部内部类没有权限修饰符。
  • 通常是返回一个实例化对象。这里就引出了一个问题,test()方法执行完return后其生命周期就结束了,但是返回的内部类对象其生命周期并没有结束,所以如果内部类使用到外部方法的局部变量怎么办?答案是内部类只能访问外部类和外部类外部方法的final变量,我们看下面的代码:
class Outter extends A implements C { // 外部类
    private String s = "Outer";

    public B test(final int k) {
        int i = 0;
        final int j = 0;
        class Inner extends B implements C, D { // 内部类
            String s = "Inner";
            void f() {
                String s = "Inner.f";
                System.out.println(s); //Inner.f 
                System.out.println(this.s);//Inner
                System.out.println(Outter.this.s);//Outer
                //Cannot refer to the non-final local variable j defined in an enclosing scope
//              System.out.println(i);//error
                System.out.println(k);//0
                System.out.println(j);//0
            }
        }
        return new Inner();
    }

    public static void main(String[] args) {
        Outter outter = new Outter(); // 必须要创建外部类对象 
        B b = outter.test(0);
        b.f();
    }
}
  • 试图访问非final变量i会提示错误。访问外部方法的非final变量是不允许的,因为前面说过了,外部函数生命周期结束的时候,内部类对象还是活着的,所以访问不到。
  • 但是为什么final变量又可以呢?因为内部类将要访问的final变量作为参数传递给了自己的构造函数(这个可以通过反编译字节码看到)。
  • 从上面我们可以看到,如果内部类变量名和外部类变量名一样,默认使用的是内部类的变量,要访问外部类的s变量时,我们要用Outter.this.s

匿名内部类

匿名内部类非常常见,如果某个类只需要在一个外部类内部实例化一次的话,我们就可以使用匿名内部类。匿名内部类在安卓的时间监听器中应用比较多。在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护。下面这段代码是一段Android事件监听代码:

bt.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

            }
        });
  • 匿名内部类和局部内部类一样,都没有访问修饰符
  • 匿名内部类也不能用static修饰,这个因为如果是静态的话,没有名字我们都访问不到它
  • 匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。

上面的代码等价于下面的代码:

private void setListener()
{
    bt.setOnClickListener(new Listener());       
}

class Listener implements View.OnClickListener{
    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub

    }
}

静态内部类(嵌套内部类)

静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,所以基本来说静态内部类仅仅是在外部类内部定义的类,不受限与外部类,和普通静态类没什么区别。

class Outter {  //  外部类
    static class Inner {    //静态内部类
    }
}
  • 静态内部类不能访问外部类的非静态成员
  • 静态内部类不依赖于外部类具体对象

什么时候需要使用内部类

  1. 每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整(最重要的特点)

  2. 方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。

  3. 方便编写事件驱动程序

  4. 方便编写线程代码

一文掌握 MongoDB 详细安装与配置(Windows / Linux / macOS 全平台) 本文详细介绍了MongoDB社区版7.0+在Windows、Linux和macOS三大操作系统上的完整安装、配置与安全加固流程。主要内容包括:各平台推荐安装方式(Windows使用MSI安装包、Linux通过官方仓库、macOS通过Homebrew)、基本配置参数说明、服务启动方法以及关键安全措施(如创建管理员用户和启用身份验证)。文章还提供了系统最低要求、下载地址、数据目录设置建议以及生产环境使用注意事项,适合开发、测试及生产环境部署参考。 阅读详情

相关推荐

基于FPGA的数据采集系统(一)

整体系统设计 本设计主要是对ADC和DAC的使用,主要实现功能流程为:首先通过串口向FPGA发送控制信号,控制DAC芯片tlv5618进行DA装换,转换的数据存在ROM中,转换开始时读取ROM中数据进行读取转换。其次用按键控制adc128s052进行模数转换100次,模数转换数据存储到FIFO中,再从FIFO中读取数据通过串口输出显示在pc上。其整体系统框图如下: 图1:FPGA数据采集系统框图 从图中可以看出,该系统主要包括9个模块:串口接收模块、按键消抖模块、按键控制模块、ROM模块、D..

phflovelt的博客 2万+

java内部类

1、局部内部类就是定义在外部类的局部位置上,比如方法内,并且有类名。class Outer {//外部类public void show() {//方法class Inter {//局部内部类} } }2、局部内部类可以访问外部类的所有成员,包括私有成员。class Outer {//外部类//私有变量private void method1() {}//私有方法public void show() {//方法class Inter {//局部内部类//调用外部类私有变量。

qq_65501197的博客 1430

SAP FICO 资产会计AA后台配置 (上)

输入折旧表“CZ11”如有外币计价的资产,则需指定外币计价的资产折旧范围,以及规则。因为在设置资产类型时,需指定一个对应的 资产编号范围、资产账户确定类型(便于分配自动会计科目)、屏幕格式规则(便于设置资产字段必填与否)。因为在设置资产类型时,需指定一个对应的 资产编号范围、资产账户确定类型(便于分配自动会计科目)、屏幕格式规则(便于设置资产字段必填与否)。新增资产类型:Z101 固定资产-房屋及建筑物新增资产类型:Z301 固定资产-房屋及建筑物。

ghgxm520的博客 1762

全面掌握 Java 内部类

一直以来以为自己对 java 基础甚是清楚,然而面试时却连内部类和静态内部类的区别都无法回答圆满,so~重新学习一遍,彻底掌握内部类。内部类是一种非常有用的特性,它可以把一些逻辑相关的类组织在一起,并控制位于内部的类的可视性,下文中内部类均指非静态内部类。内部类的学习分为以下10个知识点: 1.创建内部类与连接外部类 2.内部类与向上转型 3.局部内部类 4.匿名内部类

yhao的博客 3635

分享一下如何使用labelimg制作自己的YOLO数据集

首先准备一下自己的下准备一个空文件夹用于保存标签文件,如下图所示。

skywalkerxhx的博客 831

飞牛fnOS安装1Panel后Docker容器消失?三步教你恢复数据并避免踩坑

本文详细解析了飞牛fnOS安装1Panel后Docker容器消失的问题,指出这是由于daemon.json文件被覆盖导致。通过SSH连接、修复配置文件和系统重启三个步骤,用户可以轻松恢复数据。文章还提供了预防措施和最佳实践,帮助用户避免类似问题。

yellow的专栏 873

java new 一个内部类_java内部类

java内部类的几种类型:成员内部类,静态内部类,方法内部类,匿名内部类。成员内部类:成员内部类是类内部的非静态类。成员内部类不能定义静态方法和变量(final修饰的除外)。这是因为成员内部类是非静态的,类初始化的时候先初始化静态成员,如果允许成员内部类定义静态变量,那么成员内部类的静态变量初始化顺序是有歧义的。例子如下:运行结果为:访问外部类中的a:99,访问内部类中的b:2成员内部类的使用方法...

weixin_29798379的博客 5241

手把手教你用STM32CubeMX配置WS2812的PWM+DMA驱动(附完整代码)

本文详细介绍了如何使用STM32CubeMX配置PWM+DMA驱动WS2812全彩灯带,包括硬件选型、STM32F103C8T6的时钟配置、定时器与PWM设置、DMA传输优化等关键步骤,并提供了完整的代码实现和常见问题解决方案,帮助开发者高效控制WS2812灯带。

weixin_30859423的博客 440

Java 内部类详解

在 Java 中,我们通常是把不同的类创建在不同的包里面,对于同一个包里的类来说,它们都是同一层次的。但其实还有另一种情况,有些类可以被定义在另一个类的内部,我们把在一个类里面定义的类称为内部类(InnerClass)或嵌套类,把外面定义的类称为外部类(OutClass)或宿主类。也就是说,在类的内部既可以定义成员变量和方法,也可以定义其他的类。public class Outer { // 外部类class Inner { // 内部类// 方法和属性。

流华追梦的专栏 1315

【HFSS】仿真目录

Author: JiJi\textrm{Author: JiJi}Author: JiJi Created Time: 2026.04.27\textrm{Created Time: 2026.04.27}Created Time: 2026.04.27 Modified Time: 2026.04.27\textrm{Modified Time: 2026.04.27}Modified Time: 2026.04.27如果大家觉得有用,就点个赞吧,在阅读过程中存在任何困惑,可在下方评论区留言~

u011699626的博客 310

【AI Agent】Hermes Agent解析

Hermes Agent:一个具备持久化学习能力的开源AI Agent框架 核心特点: 突破传统Agent的"无状态困境",通过记忆系统(SQLite+FTS5全文检索)实现跨会话经验积累 支持200+模型自由切换,11种模型家族和15+平台接入 五层架构设计(入口层、编排层、推理层、工具执行层、存储层)实现平台无关性 47+内置工具和动态技能沉淀机制,支持从任务执行中自动提炼可复用Skill 独特的四层记忆体系(会话/每日/长期/向量索引)和辩证式用户建模 与传统Agent对比: 具备自我进化能力,通过A

sysu_lluozh 948

Java内部类可以public吗,Java 内部类

Java 内部类什么是内部类?在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。主要用以下几种成员内部类局部内部类匿名内部类静态内部类Java 成员内部类示例访问权限private 访问权限protected 访问权限public 访问权限package 访问权限public class TestClass {public void a(){LogHelper....

weixin_30247915的博客 2379

基于YOLOv11的人脸识别系统:从构建到应用的全流程指南

深度学习是机器学习的一个分支,旨在通过多层神经网络模拟人脑的认知能力。它能够从大量数据中自动提取特征,并进行准确的预测和分类。在计算机视觉领域,深度学习技术已经取得了显著的成果,尤其是在图像识别、目标检测等方面。YOLOv11是YOLO系列模型的最新版本,结合了卷积神经网络(CNN)和其他创新技术。它在保持高精度的同时,显著提高了推理速度。YOLOv11的结构轻量且高效,非常适合实时目标检测任务。人脸检测的目标是从图像或视频中定位所有人脸的位置。

FJN110的博客 184

Java 内部类

当静态内部类对象存在时,并不存在一个被它寄生的外部类对象,静态内部类对象只持有外部类的类引用,没有持有外部类对象的引用。在非静态内部类里可以直接访问外部类的私有成员,是因为在非静态内部类的对象里保存了一个它所寄生外部类对象的引用。当调用非静态内部类的实例方法时,必须有一个非静态内部类的实例,非静态内部类实例必须寄生在外部类实例里。如果把一个内部类放在方法里定义,那这个内部类就是一个局部内部类,局部内部类仅在方法里有效。把 A 类定义在 B 类的内部,A——内部类(嵌套类),B——外部类(宿主类)。

我的博客 1640

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java内部类是什么?Java实例内部类、Java静态内部类、Java局部内部类详解

在类内部可定义成员变量和方法,且在类内部也可以定义另一个类。如果在类 Outer 的内部再定义一个类 Inner,此时类 Inner 就称为内部类(或称为嵌套类),而类 Outer 则称为外部类(或称为宿主类)。内部类可以很好地实现隐藏,一般的非内部类是不允许有 private 与 protected 权限的,但内部类可以。内部类拥有外部类的所有元素的访问权限。内部类可以分为:实例内部类、静态内部类和成员内部类,每种内部类都有它特定的一些特点。

Itmastergo的博客 233

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java 内部类list_java详解内部类

可以将一个类的定义放在另一个类的定义内部,这就是内部类。内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二)。第一次见面内部类我们从外面看是非常容易理解的,无非就是在一个类的内部在定义一个类。public class OuterClass {private String name ;private int age;public String...

weixin_39714835的博客 904

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java怎么判断内部类_java-内部类介绍

内部类(Nested Class) 嵌套类:(1)静态内部类(2)非静态内部类:普通内部类(成员内部类):在一个外部类中直接定义的内部类。匿名内部类:方法内部类:在一个方法(外部类中的方法)或代码块中定义的内部类。内部类仍然是一个独立的类,在编译之后内部类会被单独编译成独立的.class文件,但是前面冠以外部类的类名和$符号。内部类可以使用修饰符(public ,protected,default...

weixin_32715349的博客 1264

java四种内部类

java四种内部类 成员内部类 静态内部类 局部内部类、 匿名内部类。 1.成员内部类 定义在一个类(外部类)的内部,而且与成员方法、属性平级的类叫成员内部类,…相当于外部类的非静态方法,如果被static修饰,就变成静态内部类了。 public class Person { private int age; private String name; public void run() { System.out.println("run......."); } class User{

罗罗的1024 869

java 遍历所有内部类_JAVA-内部类

注意:非内部类(外部类或接口)不能被声明为private(私有的)或protected(受保护的),也不能被static修饰可以被final修饰。这是为何???对于外部类(顶级类)来说,只有两种修饰符:public和默认。因为外部类的上一单元就是包。所以外部内就只有这两种作用域同包(包控制权限)或其他任何地方(公开访问权限)。protected的不同包子类可以访问那是针对属性和方法的。类就两种访问...

weixin_36131782的博客 537

java声明内部类_java内部类

为什么在Java中需要内部类?总结一下主要有以下四点:1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,2.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。3.方便编写事件驱动程序4.方便编写线程代码个人觉得第一点是最重要的原因之一,内部类的存在使得Java的多继承机制变得更加完善。◆Jav...

weixin_35964207的博客 1800

java 内部类怎么使用_Java中的内部类的使用

一、内部类的作用1.内部类提供更好的封装,可以把内部类隐藏在外部类里面,不容许同一个包中其他类进行访问。2.内部类的方法可以直接访问外部类的所有数据。3.使用更加方便。二、内部类的分类:1.成员内部类(作为外部类的一个成员)2.静态内部类3.方法内部类(内部类在外部类的一个方法里面)4.匿名内部类三、内部类的使用1.成员内部类的使用:package com.bluesky;public class...

weixin_30019517的博客 1040

JAVA内部类使用,什么时候该使用内部类及使用内部类的好处

提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比。内部类从表面上看, 就是在类中又定义了一个类(下文会看到,内部类可以在很多地方定义),而实际上并没有那么简单,乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著, 但是随着对它的深入了解,你会发现Jav...

以爱护甲,爱满枫林。 758

Java中常用的内部类

内部类

m0_74968164的博客 673

Java的内部类

Java的内部类

weixin_52385232的博客 702
上一篇: Java数组拷贝的四种方法
下一篇: 内存分配
Abyjun
博客等级 码龄15年 10粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值