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
作为方法的参数传递
作为方法的返回值类型
相关推荐
Blossom.11822 分钟前
基于深度学习的图像分类:使用Capsule Networks实现高效分类
人工智能·python·深度学习·神经网络·机器学习·分类·数据挖掘
CodeCraft Studio30 分钟前
借助Aspose.HTML控件,在 Python 中将 HTML 转换为 Markdown
开发语言·python·html·markdown·aspose·html转markdown·asposel.html
QQ_43766431430 分钟前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
永卿00131 分钟前
设计模式-迭代器模式
java·设计模式·迭代器模式
aramae31 分钟前
大话数据结构之<队列>
c语言·开发语言·数据结构·算法
誰能久伴不乏39 分钟前
Linux如何执行系统调用及高效执行系统调用:深入浅出的解析
java·服务器·前端
悠哉悠哉愿意1 小时前
【电赛学习笔记】MaxiCAM 项目实践——与单片机的串口通信
笔记·python·单片机·嵌入式硬件·学习·视觉检测
封奚泽优1 小时前
使用Python实现单词记忆软件
开发语言·python·random·qpushbutton·qtwidgets·qtcore·qtgui
慕y2741 小时前
Java学习第七十二部分——Zookeeper
java·学习·java-zookeeper
midsummer_woo1 小时前
基于spring boot的医院挂号就诊系统(源码+论文)
java·spring boot·后端