Java——内部类的本质

Java内部类本质:四类内部类的生命周期与内存管理 Java内部类并非语法糖,而是JVM为支持闭包语义、作用域隔离和对象生命周期控制而设计的核心机制。其本质是编译期与运行期协同实现的访问契约:非静态内部类隐式持有外部类引用,构成强生命周期依赖;静态内部类则解耦实例关系,支持独立序列化与延迟初始化;局部与匿名内部类通过变量捕获(effectively final)保障栈帧安全。这些特性直接决定内存占用、GC行为与线程安全性,广泛应用于事件监听、单例实现、Builder模式及高并发任务封装等工程场景。本文基于字节码验证、JOL内存布局分析与17个生产项目复盘,系 阅读详情

1、概述

所说的类都对应于一个独立的Java源文件,但一个类还可以放在另一个类的内部,称之为内部类,相对而言,包含它的类称之为外部类。

一般而言,内部类与包含它的外部类有比较密切的关系,而与其他类关系不大,定义在类内部,可以实现对外部完全隐藏,可以有更好的封装性,代码实现上也往往更为简洁。

不过,内部类只是Java编译器的概念,对于Java虚拟机而言,它是不知道内部类这回事的,每个内部类最后都会被编译为一个独立的类,生成一个独立的字节码文件。

也就是说,每个内部类其实都可以被替换为一个独立的类。当然,这是单纯就技术实现而言。内部类可以方便地访问外部类的私有变量,可以声明为private从而实现对外完全隐藏,相关代码写在一起,写法也更为简洁,这些都是内部类的好处。

在Java中,根据定义的位置和方式不同,主要有4种内部类。

  • 静态内部类。
  • 成员内部类。
  • 方法内部类。
  • 匿名内部类。

其中,方法内部类是在一个方法内定义和使用的;匿名内部类使用范围更小,它们都不能在外部使用;成员内部类和静态内部类可以被外部使用,不过它们都可以被声明为private,这样,外部就不能使用了。

2、静态内部类

静态内部类与静态变量和静态方法定义的位置一样,也带有static关键字,只是它定义的是类,下面我们介绍它的语法、实现原理和应用场景。我们看个静态内部类的例子代码如下所示。

public class Outer {
    private static int shared = 100;
    
    public static class StaticInner {
        public void innerMethod() {
            System.out.println("inner " + shared);
        }
    }
    
    public void test() {
        StaticInner si = new StaticInner();
        si.innerMethod();
    }
}

外部类为Outer,静态内部类为StaticInner,带有static修饰符。语法上,静态内部类除了位置放在其他类内部外,它与一个独立的类差别不大,可以有静态变量、静态方法、成员方法、成员变量、构造方法等。

静态内部类与外部类的联系也不大(与其他内部类相比)​。它可以访问外部类的静态变量和方法,如innerMethod直接访问shared变量,但不可以访问实例变量和方法。在类内部,可以直接使用内部静态类,如test()方法所示。

public静态内部类可以被外部使用,只是需要通过“外部类.静态内部类”的方式使用,如下所示:

Outer.StaticInner si = new Outer.StaticInner();
si.innerMethod();

静态内部类是怎么实现的呢?实际上会生成两个类:一个是Outer,另一个是Outer$StaticInner,代码大概如下所示。

public class Outer {
    private static int shared = 100;
    public void test(){
        Outer$StaticInner si = new Outer$StaticInner();
        si.innerMethod();
    }
    static int access$0(){
        return shared;
    }
}
public class Outer$StaticInner {
    public void innerMethod() {
        System.out.println("inner " + Outer.access$0());
    }
}

内部类访问了外部类的一个私有静态变量shared,而我们知道私有变量是不能被类外部访问的,Java的解决方法是:自动为Outer生成一个非私有访问方法access$0,它返回这个私有静态变量shared。

静态内部类的使用场景是很多的,如果它与外部类关系密切,且不依赖于外部类实例,则可以考虑定义为静态内部类。

比如,一个类内部,如果既要计算最大值,又要计算最小值,可以在一次遍历中将最大值和最小值都计算出来,但怎么返回呢?可以定义一个类Pair,包括最大值和最小值,但Pair这个名字太普遍,而且它主要是类内部使用的,就可以定义为一个静态内部类。

我们也可以看一些在Java API中使用静态内部类的例子:

  • Integer类内部有一个私有静态内部类IntegerCache,用于支持整数的自动装箱。
  • 表示链表的LinkedList类内部有一个私有静态内部类Node,表示链表中的每个节点。
  • Character类内部有一个public静态内部类UnicodeBlock,用于表示一个Unicode block。

3、成员内部类

与静态内部类相比,成员内部类没有static修饰符,少了一个static修饰符,含义有很大不同,下面我们详细讨论。我们看个成员内部类的例子,如代码所示。

public class Outer {
    private int a = 100;
    
    public class Inner {
        public void innerMethod() {
            System.out.println("outer a " + a);
            Outer.this.action();
        }
    }
    
    private void action() {
        System.out.println("action");
    }
    
    public void test() {
        Inner inner = new Inner();
        inner.innerMethod();
    }
}

Inner就是成员内部类,与静态内部类不同,除了静态变量和方法,成员内部类还可以直接访问外部类的实例变量和方法,如innerMethod直接访问外部类私有实例变量a。成员内部类还可以通过“外部类.this.xxx”的方式引用外部类的实例变量和方法,如Outer.this. action(),这种写法一般在重名的情况下使用,如果没有重名,那么“外部类.this. ”是多余的。

在外部类内,使用成员内部类与静态内部类是一样的,直接使用即可,如test()方法所示。与静态内部类不同,成员内部类对象总是与一个外部类对象相连的,在外部使用而是要先将创建一个Outer类对象,代码如下所示:

    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.innerMethod();
    }

创建内部类对象的语法是“外部类对象.new 内部类()”​,如outer.new Inner()。

与静态内部类不同,成员内部类中不可以定义静态变量和方法(final变量例外,它等同于常量)​,下面介绍的方法内部类和匿名内部类也都不可以。Java为什么要有这个规定呢?可以这么理解,这些内部类是与外部实例相连的,不应独立使用,而静态变量和方法作为类型的属性和方法,一般是独立使用的,在内部类中意义不大,而如果内部类确实需要静态变量和方法,那么也可以挪到外部类中。

成员内部类背后是怎么实现的呢?代码清单5-5也会生成两个类:一个是Outer,另一个是Outer$Inner,它们的代码大概如代码所示。

public class Outer {
    private int a = 100;
    private void action() {
        System.out.println("action");
    }
    public void test() {
        Outer$Inner inner = new Outer$Inner(this);
        inner.innerMethod();
    }
    static int access$0(Outer outer) {
        return outer.a;
    }
    static void access$1(Outer outer) {
        outer.action();
    }
}

public class Outer$Inner {
    final Outer outer;
    public Outer$Inner(Outer outer){
        ths.outer = outer;
    }
    public void innerMethod() {
        System.out.println("outer a " + Outer.access$0(outer));
        Outer.access$1(outer);
    }
}

Outer I n n e r 类有个实例变量 o u t e r 指向外部类的对象,它在构造方法中被初始化, O u t e r 在新建 O u t e r Inner类有个实例变量outer指向外部类的对象,它在构造方法中被初始化,Outer在新建Outer Inner类有个实例变量outer指向外部类的对象,它在构造方法中被初始化,Outer在新建OuterInner对象时给它传递当前对象,由于内部类访问了外部类的私有变量和方法,外部类Outer生成了两个非私有静态方法:access$0用于访问变量a, access$1用于访问方法action。

成员内部类有哪些应用场景呢?如果内部类与外部类关系密切,需要访问外部类的实例变量或方法,则可以考虑定义为成员内部类。外部类的一些方法的返回值可能是某个接口,为了返回这个接口,外部类方法可能使用内部类实现这个接口,这个内部类可以被设为private,对外完全隐藏。

比如,在Java API的类LinkedList中,它的两个方法listIterator和descendingIterator的返回值都是接口Iterator,调用者可以通过Iterator接口对链表遍历,listIterator和descend-ingIterator内部分别使用了成员内部类ListItr和DescendingIterator,这两个内部类都实现了接口Iterator。

4、方法内部类

内部类还可以定义在一个方法体中。我们看个例子,如代码所示。

public class Outer {
    private int a = 100;

    public void test(final int param) {
        final String str = "hello";
        class Inner {
            public void innerMethod() {
                System.out.println("outer a " + a);
                System.out.println("param " + param);
                System.out.println("local var " + str);
            }
        }

        Inner inner = new Inner();
        inner.innerMethod();
    }
}

类Inner定义在外部类方法test中,方法内部类只能在定义的方法内被使用。如果方法是实例方法,则除了静态变量和方法,内部类还可以直接访问外部类的实例变量和方法,如innerMethod直接访问了外部私有实例变量a。如果方法是静态方法,则方法内部类只能访问外部类的静态变量和方法。方法内部类还可以直接访问方法的参数和方法中的局部变量,不过,这些变量必须被声明为final,如innerMethod直接访问了方法参数param和局部变量str。

方法内部类是怎么实现的呢?系统生成的两个类代码大概如代码所示。

public class Outer {
    private int a = 100;
    public void test(final int param) {
        final String str = "hello";
        OuterInner inner = new OuterInner(this, param);
        inner.innerMethod();
    }
    static int access$0(Outer outer){
        return outer.a;
    }
}
public class OuterInner {
    Outer outer;
    int param;
    OuterInner(Outer outer, int param){
        this.outer = outer;
        this.param = param;
    }
    public void innerMethod() {
        System.out.println("outer a " + Outer.access$0(this.outer));
        System.out.println("param " + param);
        System.out.println("local var " + "hello");
    }
}

与成员内部类类似,OuterInner类也有一个实例变量outer指向外部对象,在构造方法中被初始化,对外部私有实例变量的访问也是通过Outer添加的方法access$0来进行的。

方法内部类可以访问方法中的参数和局部变量,这是通过在构造方法中传递参数来实现的,如OuterInner构造方法中有参数int param,在新建OuterInner对象时,Outer类将方法中的参数传递给了内部类,如OuterInner inner =new OuterInner(this, param); 。在上面的代码中,String str并没有被作为参数传递,这是因为它被定义为了常量,在生成的代码中,可以直接使用它的值。

这也解释了为什么方法内部类访问外部方法中的参数和局部变量时,这些变量必须被声明为final,因为实际上,方法内部类操作的并不是外部的变量,而是它自己的实例变量,只是这些变量的值和外部一样,对这些变量赋值,并不会改变外部的值,为避免混淆,所以干脆强制规定必须声明为final。

如果的确需要修改外部的变量,那么可以将变量改为只含该变量的数组,修改数组中的值,如代码所示。

public class Outer {
  public void test(){
      final String[] str = new String[]{"hello"};
        class Inner {
            public void innerMethod(){
                str[0] = "hello world";
            }
        }
        Inner inner = new Inner();
        inner.innerMethod();
        System.out.println(str[0]);
    }
}

str是一个只含一个元素的数组,方法内部类不能修改str本身,但可以修改它的数组元素。

5、匿名内部类

与前面介绍的内部类不同,匿名内部类没有单独的类定义,它在创建对象的同时定义类,语法如下:

        new 父类(参数列表) {
            //匿名内部类实现部分
        }

或者

        new 父接口() {
            //匿名内部类实现部分
        }

匿名内部类是与new关联的,在创建对象的时候定义类,new后面是父类或者父接口,然后是圆括号(),里面可以是传递给父类构造方法的参数,最后是大括号{},里面是类的定义。

public class Outer {
    public void test(final int x, final int y){
        Point p = new Point(2,3){
            @Override
            public double distance() {
                return distance(new Point(x, y));
            }
        };
        System.out.println(p.distance());
	}
}

创建Point对象的时候,定义了一个匿名内部类,这个类的父类是Point,创建对象的时候,给父类构造方法传递了参数2和3,重写了distance()方法,在方法中访问了外部方法final参数x和y。

匿名内部类只能被使用一次,用来创建一个对象。它没有名字,没有构造方法,但可以根据参数列表,调用对应的父类构造方法。它可以定义实例变量和方法,可以有初始化代码块,初始化代码块可以起到构造方法的作用,只是构造方法可以有多个,而初始化代码块只能有一份。因为没有构造方法,它自己无法接受参数,如果必须要参数,则应该使用其他内部类。与方法内部类一样,匿名内部类也可以访问外部类的所有变量和方法,可以访问方法中的final参数和局部变量。

匿名内部类是怎么实现的呢?每个匿名内部类也都被生成为一个独立的类,只是类的名字以外部类加数字编号,没有有意义的名字。代码会产生两个类Outer和Outer$1,代码大概如下所示。

public class Outer {
    public void test(final int x, final int y){
        Point p = new Outer$1(this,2,3, x, y);
        System.out.println(p.distance());
    }
}

public class Outer$1 extends Point {
    int x2;
    int y2;
    Outer outer;
    Outer$1(Outer outer, int x1, int y1, int x2, int y2){
        super(x1, y1);
        this.outer = outer;
        this.x2 = x2;
        this.y2 = y2;
    }
    @Override
    public double distance() {
        return distance(new Point(this.x2, y2));
    }
}

与方法内部类类似,外部实例this、方法参数x和y都作为参数传递给了内部类构造方法。此外,new时的参数2和3也传递给了构造方法,内部类构造方法又将它们传递给了父类构造方法。

匿名内部类能做的,方法内部类都能做。但如果对象只会创建一次,且不需要构造方法来接受参数,则可以使用匿名内部类,这样代码书写上更为简洁。

在调用方法时,很多方法需要一个接口参数,比如Arrays.sort方法,它可以接受一个数组,以及一个Comparator接口参数,Comparator有一个方法compare用于比较两个对象。比如,要对一个字符串数组不区分大小写排序,可以使用Arrays.sort方法,但需要传递一个实现了Comparator接口的对象,这时就可以使用匿名内部类,代码如下所示:

public void sortIgnoreCase(String[] strs){
    Arrays.sort(strs, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o1.compareToIgnoreCase(o2);
        }
    });
}

Comparator后面的与泛型有关,表示比较的对象是字符串类型。匿名内部类还经常用于事件处理程序中,用于响应某个事件,比如一个Button,处理单击事件的代码可能类似如下:

Button bt = new Button();
bt.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e) {
        //处理事件
    }
});

调用addActionListener将事件处理程序注册到了Button对象bt中,当事件发生时,会调用actionPerformed方法,并传递事件详情ActionEvent作为参数。

以上Arrays.sort和Button都是针对接口编程的例子,另外,它们也都是一种回调的例子。所谓回调是相对于一般的正向调用而言的,平时一般都是正向调用,但Arrays.sort中传递的Comparator对象,它的compare方法并不是在写代码的时候被调用的,而是在Arrays. sort的内部某个地方回过头来调用的。Button的addActionListener中传递的ActionListener对象,它的actionPerformed方法也一样,是在事件发生的时候回过头来调用的。

将程序分为保持不变的主体框架,和针对具体情况的可变逻辑,通过回调的方式进行协作,是计算机程序的一种常用实践。匿名内部类是实现回调接口的一种简便方式。

ZYNQ新手必看:你的PS端DDR和QSPI配置真的对了吗?从原理到实操的避雷指南 本文深入解析ZYNQ PS端外设配置的关键要点,特别是DDR匹配和QSPI时钟优化的实战技巧。通过详细案例和配置清单,帮助开发者避免常见错误,确保系统稳定性和启动可靠性。适合ZYNQ新手和需要优化最小系统的开发者参考。 阅读详情

相关推荐

告别CANoe?手把手教你用Python+PCAN搭建汽车诊断脚本(附完整代码)

本文详细介绍了如何利用Python和PCAN硬件搭建高性价比的汽车诊断自动化方案,替代昂贵的CANoe工具。通过开源库python-can和udsoncan实现UDS诊断协议,涵盖硬件选择、环境配置、核心功能实现及性能优化,附完整代码示例,助力开发者快速构建诊断脚本。

weixin_42551227的博客 373

JavaSE进阶5之内部类

JavaSE进阶5之内部类内部类内部类的使用场景、作用内部类的分类静态内部类成员内部类局部内部类 内部类 内部类就是定义在一个类里面的类,里面的类可以理解成(寄生),外部类可以理解为(宿主) public class People{ public class Heart{ } } 内部类的使用场景、作用 当一个事务的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构可以选择使用内部类来设计。 内部类通常可以方便访问外部类的成员,包括

qq_34306228的博客 655

大模型系统构建的“三驾马车”——Prompt、Context与Harness工程

在LLM应用开发的早期阶段,我们热衷于比拼“提示词”的精妙程度。那时,一个精心构造的思维链CoT就能让模型的表现提升10%以上。随着大模型从“玩具”走向“生产系统”,我们逐渐意识到:单一的 Prompt 只是起点,而非终点。 真正的工业级应用,需要构建一套三层递进的工程体系——Prompt Engineering、Context Engineering 和 Harness Engineering。

西木风落 604

java内部类的本质

连接与通信,作为桥接中间件存在。 内部类和主体类可以无障碍通信; 1、通过继承连接实现; 2、通过接口连接通信; 形式: 1、命名空间; 2、运行上下文; 其它: 信息隐藏是次要功能。 内部类 Java的内部类也是一个语法糖,它仅仅是一个编译时的概念,outer.java里面定义了一个内部类inner,一旦编译成功,就会生成两个完全不同...

diaoju3333的博客 253

同花顺Supermind量化交易 技术面分析专题(一)-- 相似k线的形态验证与选股

W底”,“多头上涨”,“趋势回踩”,”上涨中继“这些都是常见的K线形态,以”上涨中继“为例,当股价快速上涨后,出现盘整形态而非顶部形态,预示股价还会进一步上涨,那么本节主要讲述”上涨中继”形态是否能够预测未来股价上涨,以及如何应用“上涨中继”形态,来快速选股。"相似K线"技术相比于传统的K线组合而言更具技术性,其还有较多的运用空间,比如:运用顶部形态来监控个股潜在的下跌风险,运用相似度来监控个股是否脱离大盘走势,研究各类形态的上涨预测能力,并应用于选股等等。第一步:选取一段标准的“上涨中继”形态K线图。

qq_22808537的博客 4549

如何解决Windows系统中缺失oem*.inf文件导致的软件运行问题

本文详细解析了Windows系统中因oem*.inf文件缺失导致软件无法运行的常见问题。文章阐述了oem*.inf文件作为安装信息文件的重要作用,并提供了从精准定位文件路径、安全获取与替换文件的手动修复步骤,到利用专业工具进行一站式修复的完整解决方案。最后,还给出了从软件安装来源、卸载习惯到系统维护等方面的预防措施,帮助用户彻底避免此类问题。

water的专栏 547

Java编程的逻辑 (21) - 内部类的本质

本系列文章经补充和完善,已修订整理成书《Java编程的逻辑》,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http://item.jd.com/12299018.html 内部类 之前我们所说的类都对应于一个独立的Java源文件,但一个类还可以放在另一个类的内部,称之为内部类,相对而言,包含它的类称之为外部...

175

RTAB-MAP实战:用Realsense D435i在ROS中搭建室内3D地图(附避坑指南)

本文详细介绍了如何在ROS环境下,使用Intel Realsense D435i深度相机和RTAB-MAP算法进行室内3D地图构建的完整实战流程。内容涵盖环境配置、核心节点数据流解析、关键参数调优、地图保存与重定位,并提供了实用的避坑指南,帮助机器人开发者和研究者快速实现稳定的视觉SLAM应用。

weixin_29095049的博客 490

【Java编程的逻辑】内部类的本质

之前我们所说的类都对应于一个独立的Java源文件,但一个类还可以放在另一个类的内部,称之为内部类。 内部类可以实现对外部完全隐藏,可以有更好的封装性,代码实现上往往更加简洁。 不过,内部类只是Java编译器的概念,对于Java虚拟机而言,它是不知道内部类这回事的,每个内部类最后都会被编译成为一个独立的类。 静态内部类 静态内部类和静态变量、静态方法类似,同样是使用static关键字...

whyalwaysmea 457

STM32F407+OV2640的DCMI+DMA双缓冲JPEG图像采集系统

在嵌入式视觉系统中,数字摄像头接口(DCMI)是MCU连接CMOS图像传感器的关键硬件通道,其与DMA协同实现零CPU干预的高速数据流采集;而JPEG作为一种基于DCT变换与量化压缩的有损图像格式,依赖传感器端硬件编码引擎才能满足实时性要求。理解DCMI三重同步时序(PCLK/HSYNC/VSYNC)与DMA双缓冲机制的流水线协作原理,是突破带宽瓶颈、避免FIFO溢出和帧丢失的技术基础。该架构广泛应用于智能硬件、工业检测与边缘AI前端等需低功耗、高可靠图像捕获的场景,本文以OV2640与STM32F407为

weixin_42103128的博客 156

对雷达中相位补偿概念的一些理解

基于多普勒相位补偿的速度扩展方法和DBF测角,两者本质上都是对相位进行补偿。

qq_42235129的博客 4030

Java 内部类的本质

5.3 内部类的本质          之前我们所说的类都对应于一个独立的Java源文件,但一个类还可 以放在另一个类的内部,称之为内部类,相对而言,包含它的类称之为 外部类 。          一般而言,内部类与包含它的外部类有比较密切的关系,而与其他 类关系不大,定义在类内部,可以实现对外部完全隐藏,可以有更好的 封装性,代

norang的博客 540

【即插即用模块】Mamba篇 | CVPR 2025 | MaIR:新型Mamba扫描方式+通道混洗注意力,全任务涨点!

MaIR是一种新型图像恢复模型,通过嵌套S形扫描策略(NSS)和序列混洗注意力(SSA)改进传统Mamba方法。NSS采用条纹区域划分和S形扫描路径,既保留图像局部性又维持空间连续性;SSA通过通道洗牌和门控机制增强特征聚合。该模块创新性地融合多路径选择性扫描、深度卷积和注意力机制,在保持O(N)计算复杂度的同时,显著提升超分辨率和去噪等任务的性能表现(PSNR提升0.2-0.5dB)。代码实现包含特征洗牌、组卷积等关键操作,适用于高分辨率视觉任务,可作为即插即用组件替代传统自注意力模块。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1167

java-匿名内部类本质及使用

java-匿名内部类本质 源码 package com.InnerClass; /* 演示匿名内部类的使用 / public class AnonymousInnerClass { public static void main(String[] args) { Outer04 outer04 = new Outer04(); outer04.method(); } } class Outer04{//外部类 private int n1 = 10;//属性 public void method(){

m0_59605707的博客 259

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java内部类的本质:

本质: 1、内部类与包含它的外部类有比较紧密的关系,而与其他类关系不大,定义在类的内部,可以实现对外部的完全隐藏,可以有更好的封装性,代码实现上也更简洁。 2、内部类只是一个Java编译器的概念,对于Java虚拟机而言,它不知道有内部类存在,Java编译器在编译的时候,每个内部类最后都会编译为一个独立的类(外部类$内部类名.class) 3、内部类可以方便地访问外部类的私有变量,可以声明为p...

aa792978017的博客 777

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java-匿名内部类(本质)-内部类(其二)

匿名内部类是一个重难点,所以我还是多分几部分记笔记,以便精确查找、分析

qq_39123467的博客 565

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java 四大内部类全解析:从设计本质到实战应用

本文是一系列Java学习笔记的摘要,详细讲解了Java四种内部类的使用场景和特性。静态内部类属于类级别,实例内部类绑定外部类实例,局部内部类限于方法作用域,匿名内部类适合一次性使用。文章对比了四类内部类的定义位置、访问权限和典型应用,并指出潜在的内存泄漏和序列化问题。建议优先使用静态内部类,合理使用其他类型,Java8+可用Lambda替代匿名内部类。内容涵盖代码示例、注意事项和设计价值,适合Java学习者参考。

HRDMN的博客 615

Java学习之String类的本质及内部类

String类的本质,常用的方法,三种内部类的详解,以及面向对象知识总结思维导图

qq_54190167的博客 999

Java枚举与内部类:从语法本质到工程实战

在Java开发中,类型安全与代码整洁度往往决定了项目的可维护性。通过引入枚举类型,可以将魔法值收敛为编译期可检查的实例,有效避免无效状态码;而内部类则提供了一种精细控制类作用域与访问关系的手段。本文从枚举的本质——一种受限的类——出发,解析其字段、接口实现及抽象方法等扩展用法,并系统梳理成员内部类、静态内部类、局部内部类与匿名内部类的适用场景。结合状态机、错误码、单例模式、lambda表达式等实际案例,揭示这些语法特性背后的设计思想与踩坑细节,帮助读者在业务代码中做出更合理的设计选择。

weixin_26938645的博客 154

Java进阶之深入理解内部类的本质

1 内部类 1.1 什么是内部类? 答:类都对应于一个独立的Java源文件,但一个类还可以放在另一个类的内部,称之为内部类,相对而言,包含它的类称之为外部类。不过,内部类只是Java编译器的概念,对于Java虚拟机,它是不知道内部类这回事的,每个内部类最后都会被编译为一个独立的类,生成一个独立的字节码文件。 1.2 为什么放到别的类内部呢? 答:内部类与包含它的外部类有比较密切的关系,而与其他类关系不大,定义在类内部,可以实现对外部完全隐藏,可以有更好的封装性,代码实现上也往往更为简洁。 1.3 内部类有什

chenliguan的博客 685

Java抽象类与接口的本质区别及内部类实战应用

在Java面向对象编程中,抽象类和接口是实现多态性的核心机制。抽象类通过abstract关键字定义,可以包含抽象方法和具体实现,适合作为模板提供基础功能;接口则定义纯粹的行为契约,强调实现类必须履行的义务。从技术价值看,抽象类适合代码复用和层次化设计,而接口更利于实现松耦合和多重继承效果。随着Java 8引入default方法,接口的能力得到扩展,但在设计上仍应保持其契约本质。在应用场景上,抽象类常用于框架基类设计,如游戏角色系统;接口则广泛应用于跨模块交互,如支付系统集成。内部类作为Java的重要特性,包

weixin_26934905的博客 85

java语言基础(49)——匿名内部类的本质理解

1 匿名内部类就是内部类的简化写法 2 前提,存在一个类或接口 3 格式: new 类名或接口名(){                   重写方法......                } 上代码: interface Inner // 接口 { public abstract void show(); } abstract class InnerClass // 抽象类 也

Don't lost way 2810

python内部类的好处_java中匿名内部类的内容理解

在java内部类的使用中,有一种因为匿名的应用而比较频繁出现,这种就是匿名内部类的作用。对于一般的方法和实例而言,都不是匿名内部类的处理范畴,可以把它看成是依附接口而作用的工具。下面我们就java中匿名内部类的概念、特点、本质进行分析,然后带来实例的代码方法。1.概念是我们用得最多的,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护。2.特点(1)要继承父类或者实现接口(2)匿...

weixin_30994671的博客 121

【无标题】Java匿名内部类

定义在外部类的局部位置上(比如方法体内),并且没有类名。本质是一个类,同时还是一个对象。@OverrideSystem.out.printf("老虎在哭。。。。");

2201_75798871的博客 242

Java四大内部类之局部内部类、匿名内部类

类的五大成员:属性、方法、构造器、代码块、内部类内部类的分类。

jlihan的博客 1142
上一篇: Java——接口的细节
下一篇: Java——枚举的本质
吴声子夜歌
博客等级 码龄9年 2688粉丝 2268原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值