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

相关推荐
这料鬼有毒8 小时前
二刷hot100-73.矩阵置零
java
caoerzhong8 小时前
JeeWMS 开源仓库管理系统二次开发与接口对接实战:Java WMS 如何与 ERP、MES 和自动化设备打通
java·开源
长谷深风1118 小时前
评测AI Agent:三种裁判各司其职
java·大数据·开发语言·人工智能·ai agent
边境悍匪9 小时前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring
槑有烦恼9 小时前
Java 字符串 & List集合 高频易错真题复盘(含全部错题+修正)
java
语戚9 小时前
力扣 1621. 大小为K的不重叠线段的数目:动态规划(Java 实现)
java·算法·leetcode·动态规划·力扣·dp
君顾19 小时前
本地托管机构管理源码实战:需求拆解、数据建模与多端部署
java·开发语言·托管
青山木9 小时前
Hot 100 --- 最长有效括号
java·数据结构·算法·leetcode·动态规划
xcl09259 小时前
本地电竞服务交易系统架构设计与实战:从同城匹配到订单履约
java·spring boot
曹牧10 小时前
SVN 上查找文件
java