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
作为方法的参数传递
作为方法的返回值类型
相关推荐
FuLLovers21 分钟前
2024-09-13 冯诺依曼体系结构 OS管理 进程
linux·开发语言
IT毕设梦工厂1 小时前
计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
everyStudy1 小时前
JS中判断字符串中是否包含指定字符
开发语言·前端·javascript
luthane1 小时前
python 实现average mean平均数算法
开发语言·python·算法
码农研究僧1 小时前
Flask 实现用户登录功能的完整示例:前端与后端整合(附Demo)
python·flask·用户登录
Ylucius1 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
凡人的AI工具箱2 小时前
AI教你学Python 第11天 : 局部变量与全局变量
开发语言·人工智能·后端·python
sleP4o2 小时前
Python操作MySQL
开发语言·python·mysql
是店小二呀2 小时前
【C++】C++ STL探索:Priority Queue与仿函数的深入解析
开发语言·c++·后端
七夜zippoe2 小时前
分布式系统实战经验
java·分布式