【Java-Day13】内部类

目录

一.内部类

二.内部类的分类

[2.1 成员内部类(了解)](#2.1 成员内部类(了解))

[2.2 静态内部类(了解)](#2.2 静态内部类(了解))

[2.3 局部内部类(了解)](#2.3 局部内部类(了解))

[2.4 匿名内部类(重要)](#2.4 匿名内部类(重要))


一.内部类

定义:一个类的内部,再定义另一个类,里面这个类就叫内部类 ,外层的类叫外部类

**使用场景:**一个类表示的事物是另一个类的一部分,且单独存在没有意义。

二.内部类的分类

  1. 成员内部类(普通内部类)
  2. 静态内部类(嵌套类)
  3. 局部内部类(方法内)
  4. 匿名内部类(最常用)

2.1 成员内部类(了解)

(1)注意:

  • 成员内部类写在成员位置的,属于外部类的成员
  • 成员内部类可以被一些修饰符所修饰,比如:private,默认,protected,public,static等
  • 在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量

(2)写法:

java 复制代码
public class Outer {
    private String msg = "外部类私有字段";
    // 成员内部类
    public class Inner {
        public void show() {
            // 直接访问外部类 private
            System.out.println(msg);
        }
    }
}

(3)获取成员内部类对象的两种方式:

方式一:当成员内部类被private修饰时。

在外部类编写方法,对外提供内部类对象

方式二:当成员内部类被非私有修饰时,直接创建对象。

Outer.Inner oi = new Outer().new Inner();

(4)当内部类成员变量和外部类成员变量重名时,需要用 外部类名.this.变量名 调用外部类的属性。

在内部类的内存中会用 外部类.this 保存外部类的地址:

2.2 静态内部类(了解)

(1)注意:

  • 静态内部类也是成员内部类中的一种
  • 静态内部类只能访问 外部类中的静态变量和静态方法
  • 如果在静态内部类中,想要访问外部类非静态的内容,需要先创建外部类的对象

(2)创建静态内部类的对象:

外部类名.内部类名 对象名=new 外部类名.内部类名();

Outer.Inner oi = new Outer.Inner();

(3)调用静态内部类中非静态方法的格式:

**非静态方法:**先创建对象,用对象调用

(4)调用静态内部类中静态方法的格式:

**静态方法:**外部类名.内部类名.方法名();

2.3 局部内部类(了解)

  1. 将内部类定义在方法里面 就叫做局部内部类,类似于方法里面的局部变量。
  2. 外界是无法直接使用,需要在方法内部创建对象并使用。
  3. 该类可以直接访问外部类的成员,也可以访问方法内的局部变量。

2.4 匿名内部类(重要)

1. 什么是匿名内部类?

隐藏了名字的内部类,可以写在成员位置,也可以写在局部位置。

2. 匿名内部类的格式?

new 类名或接口名() {

重写方法;

};

java 复制代码
Animal a = new Animal() {
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }
};

interface Animal {
    void eat();
}

解释:创建了一个没有名字的类,这个类实现了 Animal 接口,然后马上创建这个类的对象。

3. 匿名内部类等价于

定义一个没有名字的java类 + 实现接口/继承类 + 重写方法 +创建对象

4.使用场景

如果实现类只使用一次,就可以用匿名内部类简化代码

5.注意

接口本身不能new,我们写的new Animal(),不是直接创建接口对象,而是创建了一个实现接口的匿名类对象。

相关推荐
维吉斯蔡5 小时前
【VS Code / Cursor】文件夹右键快捷打开与文件类型自动关联
开发语言·程序人生·学习方法
蓝斯4975 小时前
[原创]《C#高级GDI+实战:从零开发一个流程图》第章:增加贝塞尔曲线,上、下、左、右连接点
java·c#·流程图
前端工作日常6 小时前
我学习到的Java 的 Service 分层:itf 和 impl 到底是什么?
java·后端
都叫我大帅哥6 小时前
Spring @Transactional 注解完全指南
java·spring
Java成神之路-7 小时前
G1 垃圾回收器 :SATB + TAMS核心机制深度解析
java·jvm
前端工作日常7 小时前
我学习到的JIT即时编译与机器码缓存失效
java·后端
带刺的坐椅7 小时前
Solon 的 10 种 HTTP 服务器:改一行依赖,换一个引擎
java·solon·jetty·undertow·mcp-server·htttp
luj_17687 小时前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法
always_TT7 小时前
【Python 日志记录:logging 模块入门】
开发语言·python·php
xcLeigh8 小时前
Go入门:变量声明的五种方式详解
java·开发语言·golang