浅谈内部类(Java)

内部类

指的就是把类定义在另一个类的内部,类名不一样,在我们说内部类的时候一般都要加上他的前缀
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。

局部内部类

局部内部类也称为本地内部类,是定义在方法当中的类,他是只能在当前方法中使用的
在这里插入图片描述

成员内部类

成员内部类也叫实例内部类,就是可以把它当做是一个普通的实例成员

//外部类
class OuterClass{
      public int data1 = 1;
      private int data2 = 2;
      public static int data3 = 3;

      //实例内部类
    class InnerClass{
        public int data1 = 999;
        public int data4 = 4;
        private int data5 = 5;
        public static final int data6 = 6;

        public InnerClass(){
            System.out.println("不带参数的内部类构造方法!");
        }

        public void func(){
            System.out.println(data1);
            System.out.println(this.data1);
            System.out.println(OuterClass.this.data1);
            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);

            System.out.println("InnerClass::func()");
        }
      }

}

public class TestDemo {
    public static void main(String[] args) {
        OuterClass.InnerClass innerClass = new OuterClass().new InnerClass();
        innerClass.func();
    }
}

在这里插入图片描述

注意:在实例内部类中不能定义一个静态的成员变量,如果非要定义,就只能定义一个静态常量,加上final即可
在这里插入图片描述

如何实例化成员内部类的对象:
外部类名.内部类名 变量 = 外部类对象的引用.new 内部类();
在这里插入图片描述

如果实例内部类当中,包含了和外部类同名的成员变量,那么如何在实例内部类当中访问:
在这里插入图片描述

补充:

继承内部类:
在这里插入图片描述

内部类的字节码文件:
在这里插入图片描述

静态内部类

被 static 修饰的内部成员类就称为静态内部类

class OuterClass2{
public int data1 = 1;
private int data2 = 2;
public static int data3 = 3;

//静态内部类
    static class InnerClass{
        public int data4 = 4;
        private int data5 = 5;
        public static int data6 = 6;

        public static OuterClass2 out = new OuterClass2();

    public InnerClass(){
        System.out.println("静态内部类构造方法");
    }

        public InnerClass(OuterClass2 out){
            this.out = out;
        }
        
        public void func(){
            System.out.println(out.data1);
            System.out.println(out.data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
            System.out.println("InnerClass::func()");
        }
}
}

public class TestDemo2 {
    public static void main(String[] args) {
        OuterClass2 outerClass2 = new OuterClass2();
        OuterClass2.InnerClass innerClass = new OuterClass2.InnerClass(outerClass2);
        innerClass.func();
    }

}

在这里插入图片描述

注意:

1:在静态内部类中只能访问外部类中的静态成员,不可直接访问外部类中的非静态成员
2:创建静态内部类对象时,不需要先创建外部类对象
在这里插入图片描述

如何实例化:
外部类名.内部类名 变量 = new 外部类名.内部类名();
在这里插入图片描述

匿名内部类

就是为了让代码更加简洁,你可以定义一个类的同时对其进行实例化,它与局部类很相似,不同的是它没有类名,如果某个局部类你只需要使用一次,就可以使用匿名类代替局部类。

import java.util.Comparator;
import java.util.PriorityQueue;

class Test {
    public void test() {
        System.out.println("test()haha!");
    }
}

public class TestDemo2 {
    public static void main(String[] args) {
        new Test(){
            @Override
            public void test() {
                System.out.println("我是重写的test方法");
            }
        }.test();

        PriorityQueue<Integer> prio = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return 0;
            }
        });
    }
}

在这里插入图片描述

在这里插入图片描述

再次强调:在说内部类的时候,得加上他的前缀进行说明…

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

粉色的志明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值