【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(),不是直接创建接口对象,而是创建了一个实现接口的匿名类对象。

相关推荐
用户298698530141 小时前
Java 开发中读取与解析 Word 文档的实践记录
java·后端
INGNIGHT1 小时前
984.不含 AAA 或 BBB 的字符串(贪心)
开发语言·算法·leetcode
Ws_1 小时前
C# 桌面端开发工程师面试题 + 参考答案
开发语言·面试·c#
梦幻通灵1 小时前
Java传递负数金额被默认转化为0处理方案
java·开发语言
未若君雅裁1 小时前
ArrayList vs LinkedList:四维对比,该怎么选?
java
七夜zippoe1 小时前
OpenClaw Canvas 执行:JavaScript 注入实战
开发语言·javascript·udp·canvas·openclaw
组合缺一1 小时前
Solon Server 启动模式深度解析:从 0.3MB 内核到 10+ Server 插件
java·websocket·http·solon·server
雨落在了我的手上1 小时前
初识java(十五):字符串-String类
java·开发语言
zzx2006__1 小时前
JavaScript最终考核
开发语言·前端·javascript