当前位置: 首页 > article >正文

JAVA学习*内部类

内部类

内部类就是在类中在定义一个类。内部类分为四种。

实例内部类

代码展示:

public class OutClass {
    public int num1 = 1;
    private int num2 = 2;
    public static final int NUM3 = 3;
    public void test() {
        System.out.println("调用OutClass类的test方法");
    }
    //定义内部类
    class InnerClass {
        public int num1 = 1111;
        public int num4 = 4;
        private int num5 = 5;
        public static final int NUM6 = 6;
        public void innertest1() {
            System.out.println("调用InnerClass类的innertest1普通方法");
            System.out.println(num1);
            System.out.println(this.num1);
            System.out.println(OutClass.this.num1);
            System.out.println(num2);
            System.out.println(OutClass.NUM3);
            System.out.println(num4);
            System.out.println(num5);
            System.out.println(InnerClass.NUM6);
            System.out.println(OutClass.InnerClass.NUM6);
        }
        public static void innertest2() {
            System.out.println("调用InnerClass类的innertest2静态方法");
        }
    }
}
public class Test {
    public static void main(String[] args) {
        OutClass.InnerClass.innertest2();
        System.out.println("--------------");
        OutClass outClass = new OutClass();
        //实例化 实例内部类的对象;需要外部类对象进行引用outClass.new InnerClass()
        OutClass.InnerClass innerClass = outClass.new InnerClass();
        //OutClass.InnerClass innerClass = new OutClass().new InnerClass();
        innerClass.innertest1();
    }
}

输出:
调用InnerClass类的innertest2静态方法
--------------
调用InnerClass类的innertest1普通方法
1111
1111
1
2
3
4
5
6
6

代码解释:

1、创建实例内部类对象

实例内部类依赖于外部类的实例存在,所以要先创建外部类的对象(new OutClass())。通过外部类实例来创建成员内部类的对象。

OutClass outClass = new OutClass();
OutClass.InnerClass innerClass = outClass.new InnerClass();
OutClass.InnerClass innerClass = new OutClass().new InnerClass();
2、实例内部类的成员与外部成员

根据输出结果我们知道:
1、调用实例内部类的静态成员,需要引用两次。
外部类名.内部类名.成员

OutClass.InnerClass.innertest2();

2、当实例内部类成员名与外部类重名时,在内部类调用是优先访问内部类的成员。

System.out.println(num1);
System.out.println(this.num1);

这里单纯用this是无法访问外部类同名成员。
为了访问外部类的成员,还需要加上外部类类名。

System.out.println(OutClass.this.num1);
3、实例内部类也受public、private等访问修饰限定符的约束。

静态内部类

代码展示:

public class OuterClass {
    public int num1 = 1;
    private int num2 = 2;
    public static final int NUM3 = 3;
    public void test() {
        System.out.println("调用OuterClass类的test方法");
    }
    //静态内部类
    static class  InnerClass {
        public int num1 = 1111;
        public int num4 = 4;
        private int num5 = 5;
        public static final int NUM6 = 6;
        public void innertest1() {
            System.out.println("调用InnerClass类的innertest1普通方法");
            System.out.println(num1);
            System.out.println(this.num1);
            //System.out.println(OuterClass.this.num1);//报错
            //System.out.println(num2);//报错
            System.out.println(OutClass.NUM3);
        }
    }
}
public class Test {
    public static void main(String[] args) {
        test2();
    }
    public static void test2() {
        OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
        innerClass.innertest1();
    }
}

输出:
调用InnerClass类的innertest1普通方法
1111
1111
3

代码解释:

1、创建内部类实例对象

创建静态内部类对象时,不需要先创建外部类的对象,可直接通过外部类名来访问静态内部类并创建其对象。

OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
2、静态内部类的成员与外部成员

因为是静态的,所以不能访问外部类当中非静态的成员变量。

3、静态内部类也受public、private等访问修饰限定符的约束。

匿名内部类

代码展示:

interface ID {
    void TEST();
}

public class Anonymous {
    public static int a=10;
    public void test() {
        System.out.println("Anonymous类的test方法被调用");
        a = 20;
    }

    public static void main(String[] args) {
        Test1();
        System.out.println("---------");
        Test2();
    }
    public static void Test2() {
        //定义匿名内部类
        new ID(){
            @Override
            public void TEST() {
                System.out.println("重写接口的方法");
            }
        }.TEST();
    }
    public static void Test1() {
        //定义匿名内部类
        new Anonymous(){
            public static int b = 10;
            //b = 1;//报错
            @Override
            public void test() {
                a = 20;//没报错
                b = 20;//没报错
                System.out.println("重写的test方法被调用");
            }
        }.test();
    }
}

代码解释:

1、它没有类名,在声明的同时完成实例化。通常用于创建只需要使用一次的类的实例。
2、上述代码我们可以简单理解为 new Anonymous(){};继承了Anonymous这个类,所以可以重写test方法。

Anonymous a = new Anonymous(){
	@Override
	public void test() {
    System.out.println("重写的test方法被调用");
	}
};
a.test();

这样写也是可以的。
3、也可以是接口使用。上述代码我们可以简单理解为 new ID(){};实现了ID接口,所以要重写TEST方法。
4、在 Java 匿名内部类中,若要访问局部范围数据,只能是常量和未被改变的量(即使没有显式声明为 final,只要局部变量在匿名内部类使用前未被重新赋值,也可访问)。

局部内部类

代码展示:

public class Out {
    public int num1 = 1;
    public void test() {
        //定义局部内部类
        class innerClass {
            int num2 = 10;
            void func() {
                System.out.println("调用局部内部类func方法");
            }
        }
        innerClass innerclass = new innerClass();
        System.out.println(innerclass.num2);
        innerclass.func();
    }
}
public class Test {
    public static void main(String[] args) {
        test3();
    }
    public static void test3() {
        Out out = new Out();
        out.test();
    }
}

代码解释:

1、局部内部类只能在外部类的成员方法中定义、使用。
2、不能被public、static等修饰符修饰
3、使用的很少


http://www.kler.cn/a/597145.html

相关文章:

  • 通过webrtc+canvas+css实现简单的电脑滤镜拍照效果
  • 告别 ResultSet 的烦恼:使用 Apache DBUtils 和 ArrayList 优化数据管理
  • 机器学习knnlearn1
  • 嵌入式硬件工程师从小白到入门-原理图(三)
  • YOLO编程:开启计算机视觉的神奇之门
  • 我被AI骗了—关于CAN总线填充机制的回答
  • AWS中通过Endpoint Security(如Amazon GuardDuty)与安全组、网络ACL联动实现协同防御
  • 【大语言模型_8】vllm启动的模型通过fastapi封装增加api-key验证
  • ci如何做才能做到每秒rps 为3000+
  • Doris性能优化建议
  • 失物招领|校园失物招领系统|基于Springboot的校园失物招领系统设计与实现(源码+数据库+文档)
  • 【JavaEE进阶】部署Web项目到Linux服务器
  • shell流程控制
  • 操作系统导论——第13章 抽象:地址空间
  • Python网络编程入门
  • C语言入门教程100讲(2)变量与常量
  • 随笔(1)
  • 大模型-提示词工程与架构
  • MySQL Router被HTTP流量击穿
  • linux之 内存管理(1)-armv8 内核启动页表建立过程