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

相关推荐
小bo波1 小时前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
nanxun8861 天前
记一次诡异的 Docker 容器"串包"故障排查
java
用户1563068103511 天前
Day01 | Java 基础(Java SE)
java
行者全栈架构师1 天前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师1 天前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_01 天前
mac(m5)平台编译openjdk
java
唐青枫2 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马2 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261352 天前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户3721574261352 天前
Java 打印 Word 文档:从基础打印到高级设置
java