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
作为方法的参数传递
作为方法的返回值类型
相关推荐
黄贵根12 小时前
JavaScript实现教培行业意向登记系统
开发语言·javascript·ecmascript
小趴蔡ha14 小时前
02 Anaconda、Python 与机器学习开发环境入门
python·机器学习·anaconda
2401_8685347815 小时前
RTOS之RT-Thread & Linux:线程/进程管理与调度核心差异分析
c++·python
zzzll111115 小时前
Claude Code离线安装方案揭秘
开发语言·php
mifengxing16 小时前
LeetCode 41.缺失的第一个正数|Hard题O(n)+O(1)最优解法深度解析
java·算法·leetcode·排序算法
数字化转型分享点滴16 小时前
富士康、蓝思科技为何选择四化信息?MES制造执行系统的实践
python·科技
wling030116 小时前
vasp虚频计算-python脚本
开发语言·windows·python·vasp计算
魔镜前的帅比16 小时前
(开源项目)x-claw(总)
python·ai·rust·开源
郝学胜-神的一滴16 小时前
Qt 高级编程 040:按钮悬浮弹出滑块弹窗的完整攻略
开发语言·c++·qt·软件工程·用户界面
xrandzj17 小时前
Python面向对象编程入门:类、实例、初始化与封装实践
开发语言·python