Java语法总结 - 内部类

深入理解Java匿名内部类:语法、应用与最佳实践 在Java编程中,匿名内部类(Anonymous Inner Class)是一种没有名字的内部类,它通常在创建对象的同时定义类的实现。虽然Java 8引入的Lambda表达式在许多场景下可以替代匿名内部类,但理解匿名内部类的工作机制仍然非常重要。匿名内部类是Java语言中函数式编程的雏形,虽然在Java 8引入了Lambda表达式后,部分场景可以被替代,但理解匿名内部类仍然对掌握Java编程思想至关重要。// 如果取消注释,上面的匿名内部类访问counter会报错。// 示例1:实现接口的匿名内部类。 阅读详情
从Java1.1开始引入了内部类以来,它就引起了人们的激烈争论。其实任何优秀的语言特性用得不好就是滥用,内部类用得不好就会导致代码像迷宫一样,导致出现毫无重用的综合征。

1、内部类分为成员内部类、静态嵌套类、方法内部类、匿名内部类。
几种内部类的共性:
A、内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。
B、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。

2、成员内部类:形式如下
    class Outer {
        class Inner{}
    }       
编译上述代码会产生两个文件:Outer.class和Outer$Inner.class。
成员内部类内不允许有任何静态声明!下面代码不能通过编译。
    class Inner{
        static int a = 10;
    }
能够访问成员内部类的唯一途径就是通过外部类的对象!

A、从外部类的非静态方法中实例化内部类对象。

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->    class Outer {
        
private int i = 10;
        
public void makeInner(){
            Inner in 
= new Inner();
            in.seeOuter();
        }
        
class Inner{
            
public void seeOuter(){
                System.out.print(i);
            }
        }
    }

表面上,我们并没有创建外部类的对象就实例化了内部类对象,和上面的话矛盾。事实上,如果不创建外部类对象也就不可能调用makeInner()方法,所以到头来还是要创建外部类对象的。
你可能试图把makeInner()方法修饰为静态方法,即static public void makeInner()。这样不创建外部类就可以实例化外部类了!但是在一个静态方法里能访问非静态成员和方法吗?显然不能。它没有this引用。没能跳出那条规则!但是如果在这个静态方法中实例化一个外部类对象,再用这个对象实例化外部类呢?完全可以!也就是下一条的内容。

B、从外部类的静态方法中实例化内部类对象。
    class Outer {
        private int i = 10;
        class Inner{
            public void seeOuter(){
                System.out.print(i);
            }
        }    
        public static void main(String[] args) {
            Outer out = new Outer();
            Outer.Inner in = out.new Inner();
            //Outer.Inner in = new Outer().new Inner();
            in.seeOuter();
        }
    }

被注释掉的那行是它上面两行的合并形式,一条简洁的语句。
对比一下:在外部类的非静态方法中实例化内部类对象是普通的new方式:Inner in = new Inner();
在外部类的静态方法中实例化内部类对象,必须先创建外部类对象:Outer.Inner in = new Outer().new Inner();

C、内部类的this引用。
普通的类可以用this引用当前的对象,内部类也是如此。但是假若内部类想引用外部类当前的对象呢?用“外部类名”.this;的形式,如下例的Outer.this。
    class Outer {
        class Inner{
            public void seeOuter(){
                System.out.println(this);
                System.out.println(Outer.this);
            }
        }
    }

D、成员内部类的修饰符。
对于普通的类,可用的修饰符有final、abstract、strictfp、public和默认的包访问。
但是成员内部类更像一个成员变量和方法。
可用的修饰符有:final、abstract、public、private、protected、strictfp和static。
一旦用static修饰内部类,它就变成静态内部类了。


3、方法内部类。
顾名思义,把类放在方法内。
    class Outer {
        public void doSomething(){
            class Inner{
                public void seeOuter(){
                }
            }    
        }
    }
A、方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。

B、方法内部类对象不能使用该内部类所在方法的非final局部变量。
因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。
下面是完整的例子:
    class Outer {
        public void doSomething(){
            final int a =10;
            class Inner{
                public void seeOuter(){
                    System.out.println(a);
                }
            }   
            Inner in = new Inner();
            in.seeOuter();
        }
        public static void main(String[] args) {
            Outer out = new Outer();
            out.doSomething();
        }
     }

C、方法内部类的修饰符。
与成员内部类不同,方法内部类更像一个局部变量。
可以用于修饰方法内部类的只有final和abstract。

D、静态方法内的方法内部类。
静态方法是没有this引用的,因此在静态方法内的内部类遭受同样的待遇,即:只能访问外部类的静态成员。


4、匿名内部类。
顾名思义,没有名字的内部类。表面上看起来它们似乎有名字,实际那不是它们的名字。

A、继承式的匿名内部类。
    class Car {
        public void drive(){
            System.out.println("Driving a car!");
        }
    }
    
    class Test{
        public static void main(String[] args) {
            Car car = new Car(){
                public void drive(){
                    System.out.println("Driving another car!");
                }
            };
            car.drive();
        }
    }
结果输出了:Driving another car! Car引用变量不是引用Car对象,而是Car匿名子类的对象。
建立匿名内部类的关键点是重写父类的一个或多个方法。再强调一下,是重写父类的方法,而不是创建新的方法。因为用父类的引用不可能调用父类本身没有的方法!创建新的方法是多余的。简言之,参考多态。

B、接口式的匿名内部类。
    interface  Vehicle {
        public void drive();
    }
    
    class Test{
        public static void main(String[] args) {
            Vehicle v = new Vehicle(){
                public void drive(){
                    System.out.println("Driving a car!");
                }
            };
            v.drive();
        }
    }
上面的代码很怪,好像是在实例化一个接口。事实并非如此,接口式的匿名内部类是实现了一个接口的匿名类。而且只能实现一个接口。

C、参数式的匿名内部类。
class Bar{
    void doStuff(Foo f){}
}

interface Foo{
    void foo();
}

class Test{
    static void go(){
        Bar b = new Bar();
        b.doStuff(new Foo(){
            public void foo(){
                System.out.println("foofy");
            }
        });
    }
}


5、静态嵌套类。
从技术上讲,静态嵌套类不属于内部类。因为内部类与外部类共享一种特殊关系,更确切地说是对实例的共享关系。而静态嵌套类则没有上述关系。它只是位置在另一个类的内部,因此也被称为顶级嵌套类。
静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它。静态嵌套类不能访问外部类的成员和方法。
    class Outer{
        static class Inner{}
    }
    class Test {
        public static void main(String[] args){
            Outer.Inner n = new Outer.Inner();
        }
    }

java基础语法(11)| 内部类 java基础语法 | 内部类 阅读详情

相关推荐

PyMiMi实战指南:midas_api配置与连接测试详解

本文详细介绍了PyMiMi库中midas_api的配置与连接测试全流程。从环境准备、API密钥获取,到核心的url_cfg配置函数使用,再到通过test_url进行连接验证,提供了清晰的步骤和代码示例。文章重点解析了配置原理、常见错误排查方法(如401错误、连接超时),并强调了API密钥的安全性管理,帮助用户稳固建立Python与Midas Civil NX之间的自动化通信桥梁。

weixin_29044713的博客 712

Java语法学习内部类

局部内部类本质上同时有局部变量和类的特点局部变量:局部变量的作用域,导致内部可以访问外部,但是外部不能直接访问内部 ,而如果想访问重名的外部类的属性,需要:外部类.this.属性局部变量没有修饰符(但是类可以用final),本质上属于外部类,所以可以访问外部类的private类:访问局部内部类需要创建对象才能访问,局部内部类也可以继承,实现接口,但是要在同一个作用域才行(局部内部类也可以继承外部其它类),也可以有属性,方法,代码块,构造器,内部类与局部内部类差别在所处的位置。

2403_82385265的博客 1436

Ubuntu20.04 高效安装企业微信的完整指南

本文提供了在Ubuntu20.04系统上高效安装企业微信的完整指南,详细介绍了通过Deepin-wine环境运行Windows版企业微信的步骤和优化技巧。内容包括系统环境检查、依赖安装、企业微信包的获取与安装、首次运行配置及常见问题解决方案,帮助开发者在Ubuntu系统中流畅使用企业微信进行办公通讯。

weixin_42568801的博客 353

Java基础语法——内部类

基本介绍基本介绍一个类的内部又完整的嵌套了另一个类结构,被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系基本语法class OuterClass { // 外部类// ...class NestedClass { // 嵌套类,或称为内部类// ...内部类的分类定义在外部类局部位置上(不如方法内):局部内部类(有类名)匿名内部类(没有类名)

2402_86637890的博客 938

初级文章【西门子】字符拼接成字符串

针对S7-400极其以下PLC,1200往上据说有专门的块了呢,首先,我是不用库的,需要什么函数会自己写,OK进入正题。 首先,我们有一个DB块,里面有14个char,一个14位的char数组和一个14位的string。如下图。 我们的目的是将char1-char10拼接成一个string。 第一种方式:第一步,将char放进数组。 ​​​​​​​ 相信大家都能看明白,但是我还是要解释解释 L取值2 T赋值到临时变量DBNO(INT) OPN DB [#DBNO]获取DB块,这一句.

NS_Speak(IVAV) 1万+

PPT+视频 | 详解智能营销增益模型(uplift model)

分享营销增益模型的原理和常见的建模及评估方法,并以淘票票智能票补为例介绍uplift model技术的实践经验。

阿里文娱技术 8627

java 内部类语法

weixin_43918196的博客 268

crowdcountingp2p代码复现

前面学习了一下论文:Improved Field-Based Soybean Seed Counting and Localization with Feature Level Considered该论文的模型原型由CrowdCounting-P2PNet改进而来这里先复现一下CrowdCounting-P2PNet模型,然后再学习P2PNet-Soy模型。

m0_73832962的博客 2329

Java语法糖4:内部类

内部类 最后一个语法糖,讲讲内部类,内部类指的就是在一个类的内部再定义一个类。 内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念,outer.java里面定义了一个内部类inner,一旦编译成功,就会生成两个完全不同的.class文件了,分别是outer.class和outer$inner.class。所以内部类的名字完全可以和它的外部类名字相同。 内部类分为四种:成员内部类、局部内部...

飞奔的小土豆@1024 217

YOLOv8首创原创改进:即插即用|创新的轻量化非对称多级压缩LADH检测头

总结而言,本文介绍了一种名为轻量化非对称多级压缩LADH检测头的原创改进,该改进可与YOLOv8无缝适配,并显著提升了检测器的性能。在本文中,我们介绍了一种原创改进的检测头,名为轻量化非对称多级压缩LADH检测头,它可与YOLOv8无缝适配,显著提升了检测器的性能。此外,我们引入了多级压缩的概念,通过在不同的检测层级上应用不同程度的压缩,进一步提升了检测头的轻量化特性。具体而言,我们采用了逐级减少卷积核数量和通道数量的策略,以降低模型的参数量和计算复杂度,同时保持较高的检测精度。

IbcVue的博客 2183

SAP 创建PO时提示“不能确定任何组件”

SAP 创建委外加工的PO时提示“不能确定任何组件” 而如果BOM已经创建了,但还是提示该错误保存。 解决办法:1. BOM selection 未配置好; 2. 由于Purchasing prosessing time的设置,如果PO中的delivery time - Purchasing prosessing time是过去的日期,那么会找不到BOM,BOM的有效期需早 于PO审批的有效期。 3. BOM未...

willieyuan的博客 6122

Java基础语法练习36(内部类)

1.局部内部类(有类名) 2.匿名内部类(没有类名,重点!!!!

weixin_68453343的博客 552

2026华为OD机考双机位C卷++ 双机位B卷 + 双机位A卷 + 2025C/B/A卷+ 往年真题 - 题库目录分值说明 + 考点说明+在线OJ

2025华为OD机考双机位C卷++ 双机位B卷 + 双机位A卷 + 2025C/B/A卷+ 往年真题 - 题库目录分值说明 + 考点说明+在线OJ

算法大师! 5万+

一篇文章理解Java的匿名内部类语法

什么是匿名内部类? 将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,类B则称为外部类。 匿名内部类 是内部类的简化写法。它的本质是一个带具体实现的 父类或者父接口的 匿名的 子类对象 如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况下就可以省略该类的定义,而改为使用 匿名内部类。 特征:声明匿名内部类的同时创建该类的对象 前提 存在一个类或者接口,这里的类可以是抽象类也可以是普通类。 语法格式: 继承父类: new 父类名称([实参列表]){ // 类的成员列表 }

sun10367的博客 404

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

java内部类的this和new语法

wzx19840423的专栏 1339

精雕软件(JDpaint) 5.5 绿色版

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

Java中匿名内部类的语法及使用

1.内部类: 什么是内部类? 在类的内部又定义了一个新的类,称为内部类。 内部类的分类: 静态内部类:类似于静态变量。 实例内部类:类似于实例变量。 局部内部类:类似于局部变量。 使用内部类编写的代码,可读性很差,能不用尽量不用。 测试代码 class A { //静态内部类 static class Inner1 { } //静态变量 static String country = "China"; //实例内部类 public class In

pipizhen_的博客 745

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java 关于匿名内部类语法的思考

蚂蚁最近在学习Java和Android时,遇到了一个匿名内部类语法的使用问题。 很多书籍,包括网络,都有特别指出:匿名内部类必须在抽象类或接口的基础上,才可以定义。比如: interface AnInterface{ void info(); } abstract class AnAbstractClass{ abstract void info(); } 完全可以使

silencecyn的博客 410

java 匿名类语法_JAVA匿名内部类语法分析及实例详解

1.前言匿名内部类在我们JAVA程序员的日常工作中经常要用到,但是很多时候也只是照本宣科地用,虽然也在用,但往往忽略了以下几点:为什么能这么用?匿名内部类的语法是怎样的?有哪些限制?因此,最近,我在完成了手头的开发任务后,查阅了一下JAVA官方文档,将匿名内部类的使用进行了一下总结,案例也摘自官方文档。感兴趣的可以查阅官方文档(https://docs.oracle.com/javase/tuto...

weixin_34377186的博客 444

Java学习day043 内部类(使用内部类访问对象状态、内部类的特殊语法规则、内部类是否有用、必要和安全、局部内部类)

使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识。 day043 内部类(使用内部类访问对象状态、内部类的特殊语法规则、内部类是否有用、必要和安全、局部内部类) 内部类(inner class)是定义在另一个类中的类。为什么需要使用内部类呢?其主要原因有以下三点: •内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据。 •内部...

Zzehao的博客 536

深入理解Java内部类:语法、应用与底层原理剖析

内部类(Inner Class)是定义在另一个类内部的类,主要作用包括:实现代码逻辑的更好封装直接访问外部类的私有成员构建更简洁的回调机制支持多继承的变通实现。

KBkongbaiKB的博客 1014

Java内部类语法总结

Java内部类语法总结从Java1.1开始引入了内部类以来,它就引起了人们的激烈争论。其实任何优秀的语言特性用得不好就是滥用,内部类用得不好就会导致代码像迷宫一样,导致出现毫无重用的综合征。1、内部类分为成员内部类、静态嵌套类、方法内部类、匿名内部类。几种内部类的共性:A、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。B、内部类不能用...

肖申克的救赎r的博客 422

Java内部类、foreach循环等语法糖javac到底优化了啥(反编译)

哪儿有那么多岁月静好,只不过编译器在为你负重前行

weixin_53132064的博客 723

Java核心语法——内部类

内部类 含义:定义在内部的一个类 分类: 根据位置不同: 1)成员内部类 1.普通成员内部类 位置:类中方法外 格式:   定义:【 class 名字{……} 】   调用:【 外部类名.内部类名 命名 = new 外部类名().new 内部类名() 】 注意: ①内部类可以直接使用外部类的成员 ②【外部类使用内部类成员(包括私有成员)时,需要先实例化】(可以使用私有成员,所以内部类成员没比较私有化) 2.私有成员内部类 私有化内部类时,不可直接访问内部类,但是可以

Today_He的博客 366

Java 内部类深度解析:语法、原理与设计实践

Java 内部类是语言灵活性与封装思想的集中体现,通过成员内部类、静态内部类、局部内部类和匿名内部类四种形式,为代码组织和设计模式实现提供了丰富工具。理解其编译原理(字节码生成、访问机制)和内存模型(引用关系、GC 影响)是正确使用的前提,而Java 21的无名类等新特性进一步拓展了其应用边界。在工程实践中,应优先选择静态内部类以平衡性能与安全性,通过设计模式提升代码内聚性,同时警惕内存泄漏等潜在风险。掌握内部类,不仅是 Java 进阶的重要一步,更是理解面向对象设计精髓的关键。

zqmgx13291的博客 1013

Java学习教程,从入门到精通,Java嵌套和内部类语法知识点及案例代码(36)

- 嵌套类是任意声明在另一个类或接口中的类。 - 最外层的类不是嵌套类。 - 嵌套类可以是静态的(static)或非静态的(内部类)。

qq_45746668的博客 1507
上一篇: C语言 枚举与位运算
下一篇: Java语法总结 - 线程
zljjava
博客等级 码龄15年 155粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值