【Java面向对象】10 Java内部类 成员内部类、局部内部类、匿名内部类、静态内部类

本文详细介绍了Java中的内部类,包括成员内部类、局部内部类和匿名内部类的用法。成员内部类可以访问外部类的私有变量,局部内部类局限于方法内,而匿名内部类常用于简洁的回调函数实现。此外,还讲解了静态内部类的使用,以及如何通过内部类实现返回最大值和最小值的功能。
摘要由CSDN通过智能技术生成

内部类

内部类是定义在一个类中的类

  • 使用场景
    • 内部类方法可以访问该类定义所在作用域中的数据,包括私有数据
    • 内部类可以对一个包的其他类隐藏
    • 当要定义一个回调函数又不想实现很多代码时,可以使用匿名内部类。

成员内部类

public class InnerClassDemo1 {
    private boolean flag;

    public void outerAction() {
        // 外部类可以使用OuterClass.InnerClass来引用内部类
        // 创建内部类实例可以使用outerObject.new InnerClass();
        InnerClassDemo1.InnerClass1 innerClass1 = this.new InnerClass1();
        innerClass1.action();
    }

    // 内部类可以私有,常规类只能default或者public
    private class InnerClass1 {
        // 内部类声明的所有静态域都必须是final的,不能有静态方法
        private static final String s = "a";

//        private InnerClassDemo1 outer;
//
//        public InnerClass1(InnerClassDemo1 outer) {
//            this.outer = outer;
//        }

        public void action() {
//            if (outer.flag) {
            // 可以访问外部类成员变量
            // 相当于编译器添加了outer.flag,并且在构造中定义了outer且赋值
            // 也可以使用OuterClass.this表示外部类引用
            InnerClassDemo1 outer = InnerClassDemo1.this;
            if (!flag) {
                System.out.println("action invoke");
            }
        }
    }

    public static void main(String[] args) {
        InnerClassDemo1 innerClassDemo1 = new InnerClassDemo1();
        InnerClass1 innerClass1 = innerClassDemo1.new InnerClass1();
        innerClass1.action();
    }
}
  • 内部类对象由外部类对象构造
  • 内部类可以访问外部类成员变量,私有成员也可以访问
  • 内部类可以私有,常规类只能default或者public
  • 表示外部类引用OuterClass.this
  • 表示内部类引用OuterClass.InnerClass
  • 创建内部类实例outerObject.new InnerClass()
  • 内部类声明的所有静态域都必须是final的,不能有静态方法

局部内部类

public class InnerClassDemo2 {
    private boolean flag;

    public void a() {
        // 局部内部类不能使用public或者private,它的作用范围仅在这个方法内部
        class InnerClass2 {
            public void action() {
                if (flag) {
                    System.out.println("inner");
                }
            }
        }
    }
}

匿名内部类

  • 基本格式
new SuperType(construction paramters) {
    inner class methods and data
}
  • 代码
public class InnerClassDemo3 {
    public static void main(String[] args) {
        // 匿名内部类
        Runnable task = new Runnable() {
            @Override
            public void run() {
                System.out.println("run");
            }
        };

        // lambda表达式写法
        Runnable task2 = () -> System.out.println("run");
    }
}
  • 双括号初始化
List<Integer> list = new ArrayList<>();
list.add(1);

// 匿名 
// 双括号初始化,利用内部类语法初始化数据
ArrayList<Integer> list2 = new ArrayList<Integer>() {{
    add(1);
}};

静态内部类

  • 把一个类隐藏到另外一个类中,内部类也无需引用外部类对象,可以将内部类声明为static
  • 一个方法同时返回最大值和最小值,如果不返回数组,那么就需要对象进行封装,那么就需要一个类封装属性做返回值,这个类只为当前外部类服务,也不需要访问外部类成员。
public class InnerClassDemo4 {

    static class InnerClass4 {
        private int min;
        private int max;

        public InnerClass4(int min, int max) {
            this.min = min;
            this.max = max;
        }

        public int getMin() {
            return min;
        }

        public void setMin(int min) {
            this.min = min;
        }

        public int getMax() {
            return max;
        }

        public void setMax(int max) {
            this.max = max;
        }

        @Override
        public String toString() {
            return "InnerClass4{" +
                    "min=" + min +
                    ", max=" + max +
                    '}';
        }
    }

    // 获取最大值和最小值
    public static InnerClass4 getMinMax(int[] arr) {
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        for (int i : arr) {
            min = Math.min(min, i);
            max = Math.max(max, i);
        }
        return new InnerClass4(min, max);
    }

    public static void main(String[] args) {
        InnerClass4 minMax = InnerClassDemo4.getMinMax(new int[]{1, 2, 3, 4});
        System.out.println(minMax); // InnerClass4{min=1, max=4}
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值