Java的内部类详解(成员内部类、静态内部类、局部内部类、匿名内部类)

Java知识点总结:想看的可以从这里进入

2.2.4、 内部类

一个类定义在另一个类内,那么这个类就是一个内部类,比如:在类A中定义一个类B,B就是内部类,而B可以当做A的一个成员看待。从种类上说,内部类可以分为四类:成员内部类、静态内部类、匿名内部类、局部内部类。

image-20220724161134268

1、成员内部类

成员内部类:最普通的一种内部类,定义在类中方法外的一个普通的类(没有static修饰),可用任意的修饰符修饰

  • 内部类可以访问外部类所有的属性和方法(包括私有)。但是外部类要访问成员内部类的属性和方法,必须要先实例化内部类

    image-20230202204614229
  • 在其他的类中使用内部类时,需要先有外部类的对象(成员内部类是依附外部类而存在的)

    image-20230203152306776
  • 关于在成员内部类中使用静态方法和属性的问题: 关于JDK16后可以在非静态内部类中使用静态属性和方法的说明

    • 在 jdk16之前的版本,不能再非静态成员内部类中定义静态的属性和方法

      image-20230203153900340
    • 在 jdk Java16之后的版本是可以定义静态方法和属性的

      image-20230203153246101
  • 当外部类变量与方法和内部类的同名时,内部类默认访问自己的成员变量或方法,而要引用外部变量时要加类名.this(类名.this.变量名、类名.this.方法名())

    image-20230202211913116
2、静态内部类

静态内部类:静态内部类就是在成员内部类加了一个 static 关键字,静态内部类就像外部类的一个静态成员一样

  • 静态内部类不能直接访问外部类的非静态成员,但可以通过创建外部类的对象访问

    image-20230203155334889
  • 外部类的静态成员与内部类的成员名称相同,可通过(类名.静态成员) 访问外部类的静态成员

    image-20230203155654587
  • 静态内部类创建对象无需依赖外部类对象,可以直接创建

    image-20230203155915238
3、局部内部类

局部内部类:使用的比较少,声明在方法体或一段代码块的内部。

  • 仅在定义的方法、代码块内部使用,其他地方无法使用(定义在方法内则只能在方法中使用,定义在for循环中则只能在for循环中使用),作用范围类似于局部变量

  • 局部内部类不可使用权限修饰符 静态(static)修饰符进行修,但可以使用final 或 abstract修饰。

    image-20230203160225947
  • 局部内部类可以直接访问方法中的属性

  • 局部内部类创建对象要在方法内部、局部内部类的外部声明。

    image-20230203160730189
  • 可以访问外部类的的属性和方法(包括私有的)。

    image-20230203161055270
4、匿名内部类

匿名内部类:很常用。它是一种没有名字的内部类,只能使用一次,通常是某个类在实现时只会使用一次,所以为了简化,不需要去专门写一个实现类,而是直接使用内部类完成。

  • 匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
  • 在匿名内部类中可以使用外部类的属性,但是外部类却不能使用匿名内部类中定义的属性,匿名内部类没有名字,因此在外部类中无法获取这个类的类名,也就无法得到属性信息。(只能有一个对象)
  • 匿名内部类必须继承父类或实现接口,使用多态形式引用
new 接口/类名(参数1, 参数2...){
    实现方法1(){
        
    }
    实现方法2(){
        
    }
    ......
};

在线程的时候通常就喜欢使用匿名内部类实现

image-20220724171746400
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
成员内部类是在类的内部方法的外部编写的类。它的特点是可以访问外部类的所有成员(包括私有成员),并且需要通过创建外部类对象来访问。 在外部类中,可以通过直接创建内部类的对象来访问内部类的属性和方法,就像访问普通的类一样。但是需要注意的是,在外部类的静态成员中不能使用非静态的成员内部类静态内部类是定义在外部类中的静态成员。它的特点是不依赖于外部类的实例而存在,可以直接创建静态内部类的对象来访问它的属性和方法。静态内部类不能访问外部类的非静态成员,只能访问外部类的静态成员局部内部类是定义在方法内部的类。它的特点是只能在方法内部使用,并且只有在方法内部创建对象后才能访问局部内部类的属性和方法。局部内部类可以访问外部类的所有成员,包括私有成员匿名内部类是没有类名的内部类。它的定义格式比较特殊,通常用于实现接口或继承父类,并重写其方法。匿名内部类的特点是只能创建一个对象,并且只能在声明的地方使用。 总结: - 成员内部类是在外部类的方法外部定义的类,可以访问外部类的所有成员。 - 静态内部类是在外部类中定义的静态成员,不依赖于外部类的实例。 - 局部内部类是定义在方法内部的类,只能在方法内部使用。 - 匿名内部类是没有类名的内部类,通常用于实现接口或继承父类,并重写其方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java内部类详解(含:成员内部类局部内部类匿名内部类静态内部类)](https://blog.csdn.net/leaf__yang/article/details/126221094)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Java成员内部类静态内部类局部内部类匿名内部类详解](https://blog.csdn.net/sun10367/article/details/108050807)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰 羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值