Java内部类介绍和使用

2 内部类

2.1 内部类的分类

什么时候使用内部类 ?
  • 多个事物之间有包含关系, 可以使用内部类
内部类分类 ?
  • 成员内部类
  • 局部内部类
  • 匿名内部类

2.2 成员内部类

  • 定义的位置 : 类中方法外

  • 创建成员内部类对象格式 : 外部类名.内部类名 对象名 = new 外部类名().new 内部类名(参数);

    java 复制代码
    package com.itheima.innerclass_demo.member_innerclass;
    
    // 外部类
    public class Person {
        // 成员内部类
        public class Heart {
            // 频率变量
            private int rate;
            // 跳动方法
            public void beats() {
                System.out.println("咚咚咚!");
            }
        }
    }
    
    class Test {
        public static void main(String[] args) {
            // 创建内部类对象
            Person.Heart heart = new Person().new Heart();
            // 调用内部类中的方法
            heart.beats();
        }
    }
成员内部类访问外部类的成员
  • 在内部类中有代表外部类对象的格式 : 外部类名的.this , 私有的也可以访问
  • 外部类要想访问内部类成员 , 需要创建内部类对象
java 复制代码
package com.itheima.innerclass_demo.member_innerclass;

public class Person {
    private String name = "张三";
    private int num = 10;
    
    // 成员内部类
    public class Heart {
        int num = 100;
        // 频率
        private int rate;
        // 跳动
        public void beats() {
            System.out.println("咚咚咚!");
        }
        // 调用外部类的成员
        public void show(){
            int num = 1000;
            System.out.println(Person.this.name);
            System.out.println(num);// 1000 就近原则
            System.out.println(this.num);// 100
            System.out.println(Person.this.num);// 10

        }
    }
}

class Test {
    public static void main(String[] args) {
        Person.Heart heart = new Person().new Heart();
        heart.beats();
        heart.show();
    }
}

2.3 匿名内部类

  • 匿名内部类 : 没有名字的类 , 一次性产品
  • 使用场景 : 直接调用方法 , 作为方法的传参 , 返回值类型
  • 好处 : 简化代码 , 快速实现接口或者抽象的抽象方法
  • 格式 :
    • new 类名/接口名(){ 重写抽象方法 } 注意 : 此处创建的是子类对象!!!
  • 使用方式 :
    • 直接调用方法
    • 作为方法的参数传递
    • 作为方法的返回值类型
java 复制代码
public interface Flyable {
    void fly();
}
public class Test1 {
    public static void main(String[] args) {
        new Flyable(){
            @Override
            public void fly() {
                System.out.println("我在学习JAVA");
            }
        }.fly();
        // 作为方法的参数传递
        showFlyable(
            new Flyable(){
                @Override
                public void fly() {
                    System.out.println("作为方法的参数传递");
                }
            }
        );
        //  作为方法的返回值类型
        getFlyable().fly();
    }

    public static void showFlyable(Flyable flyable) {
        flyable.fly();
    }
    // 作为方法的返回值类型
    public static Flyable getFlyable(){
        return new Flyable() {
            @Override
            public void fly() {
                System.out.println("作为方法的返回值类型");
            }
        };
    }
}

程序运行后的结果如下:

html 复制代码
我在学习JAVA
作为方法的参数传递
作为方法的返回值类型
相关推荐
人活一口气14 小时前
Spring Boot与AIGC的完美结合:从零搭建智能内容生成平台
java·spring boot·aigc
ServBay14 小时前
9 个 Python 第三方库推荐,不用 AI 都好像多出一个团队
后端·python
用户83562907805114 小时前
如何使用 Python 添加和管理 Excel 批注(完整示例)
后端·python
用户83562907805114 小时前
使用 Python 管理 Excel 工作表:创建、复制、删除与重命名
后端·python
像我这样帅的人丶你还16 小时前
Java 后端详解(三):全局异常处理与 JPA 数据库映射
java·后端
NE_STOP16 小时前
vibe Coding -- 小项目实战
java
未秃头的程序猿1 天前
Java 26正式发布!这3个新特性,让代码量直接减半
java·后端·面试
用户298698530141 天前
Word 文档文本查找与替换的 Java 实现方案
java·后端
阿哉1 天前
Nacos 服务发现源码:藏在背后的两套事件机制,90%的人只讲了一半
java
咖啡八杯1 天前
GoF设计模式——命令模式
java·设计模式·架构