Java重修第七天—内部类

发布时间:2024年01月15日

通过学习本篇文章可以掌握如下知识

成员内部类

静态内部类

局部内部类

匿名内部类(重点掌握)


内部类

是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),其定义为:如果一个类定义在另一个类的内部,这个类就是内部类。

场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计为内部类。

例如:汽车中的发动机。

在这里插入图片描述

成员内部类

成员内部类就是类中的一个普通成员,类似之前学过的成员变量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虽然成员内部类充当的时成员变量的成分,但是其本质还是一个类,因此类有的东西,它都有。

public class Outer {
    private static String A = "AAA";

    public class Inner {
        private String name;

        // 无参构造器
        public Inner() {
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void test() {
            System.out.println("这是成员内部类的普通方法;");
            System.out.println(A);
        }
        
    }
}

由于内部类定义的是普通内部类,因此不能定义静态成员与静态方法,但是可以访问外部的静态变量

在JDK16时候进行改变,支持静态变量的定义

那么如何访问呢?

之前访问成员变量需要实例.成员变量,但是这个变量也是一个类,因此需要new,于是就有如下:

public class Test {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner in = outer.new Inner();
        in.test();
    }
}

总结

在这里插入图片描述

静态内部类

有static修饰的内部类,属于外部类自己持有的,注意和内部类的区别。

在这里插入图片描述

代码实现

package cn.msf.baseJava.d_9_innerClass;

public class Outer2 {
    // 静态内部类
    public static class Inner2{
        private String name;
        public static int a;

        public Inner2(String name) {
            this.name = name;
        }

        public Inner2() {
        }

        public void test(){
            System.out.println("静态内部类的普通方法");
        }

        public static void test(int a){
            System.out.println("静态内部类的静态方法");
        }
    }
}



测试

public class Test {
    public static void main(String[] args) {
        Outer2.Inner2 inner2 = new Outer2.Inner2();
        inner2.test();
        Outer2.Inner2.test(2);
    }
}

打印结果

在这里插入图片描述

总结

在这里插入图片描述

局部内部类

局部内部类定义在方法中、代码块中、构造器等执行体中,属于鸡肋语法。

匿名内部类【重点】

是一种特殊的内部类,所谓匿名,即程序员不需要为这个类声明名字。

在这里插入图片描述

代码实现。以猫狗为案例讲解匿名内部类。

package cn.msf.baseJava.d_9_innerClass;

public class Test {
    public static void main(String[] args) {
        Animal a = new Cat();
        a.cry();

        // 如果想建立一个狗子呢?但是有不想声明类。
        // 这就是匿名内部类。
        Animal d = new Animal() {
            @Override
            public void cry() {
                System.out.println("我是狗子,U?ェ?*U");
            }
        };
        d.cry();
    }
}

abstract class  Animal {
    public abstract void cry();
}

class  Cat extends Animal {

    @Override
    public void cry() {
        System.out.println("猫喵喵喵的叫,o(=?ェ?=)m");
    }
}

结果展示

在这里插入图片描述

不用将它作为一个高大上的东西,其本质还是一个类,然后创建对象接收而已

总结
在这里插入图片描述

希望多多点赞收藏关注,如果有问题的地方,欢迎在评论区讨论!

文章来源:https://blog.csdn.net/abc123mma/article/details/135595672
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。