admin管理员组

文章数量:1794759

【JAVA内部类】

内部类

内部类:可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类

代码语言:javascript代码运行次数:0运行复制
package demo4_Inner_Class;

public class OutClass {
    class  InnerClass{
        
    }
}
  • ⚠️注意:定义在class类名{}花括号外部的,即使是在一个文件里,都不能称为内部类。

内部类的类型

⭐️⭐️⭐️⭐️⭐️静态内部类
代码语言:javascript代码运行次数:0运行复制
package demo4_Inner_Class;

class Outer{
    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 void test(){
            System.out.println("Innner::test()");
        }
    }

    public void testFun(){
        System.out.println("Outer::testFun");
    }
}

public class Test {
    public static void main(String[] args) {
        //如何获取静态内部类对象
        Outer.InnerClass inn = new Outer.InnerClass();
    }
}

静态内部类对象的获取方法:

代码语言:javascript代码运行次数:0运行复制
public class Test {
    public static void main(String[] args) {
        //如何获取静态内部类对象
        Outer.InnerClass inn = new Outer.InnerClass();
    }
}
  • 在静态内部类中不可以直接访问外部类对象的非静态成员变量,因为外部类对象的成员依赖于外部类的对象。代码和运行结果如下所示:
代码语言:javascript代码运行次数:0运行复制
package demo4_Inner_Class;

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

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

        public void test(){
            Outer outer = new Outer();
            System.out.println(outer.data1);
            System.out.println(outer.data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);

            System.out.println("Innner::test()");
        }
    }

    public void testFun(){
        System.out.println("Outer::testFun");
    }
}

public class Test {
    public static void main(String[] args) {
        //如何获取静态内部类对象
        Outer.InnerClass inn = new Outer.InnerClass();
        inn.test();

    }
}

⭐️⭐️⭐️实力内部类

代码语言:javascript代码运行次数:0运行复制
class Outer{
    public  int data1 = 1;
    private  int data2 = 2;
    public static  int data3 = 3;

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

        public void test(){
            
        }
    }

    public void testFun(){
        System.out.println("Outer::testFun");
    }
}

这段代码里面的 class InnerClass就是实例内部类(非静态内部类)

但是我们可以看到实例内部类里面不能有静态的变量,如果实在要加,需要加一个final关键字

代码语言:javascript代码运行次数:0运行复制
package demo4_Inner_Class;

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

    //实例内部类
    class InnerClass{
        public  int data4 = 4;
        private   int data5 = 5;
//        常量在变异的时候确定
        public  static  final int data6 = 6;

        public void test(){
            System.out.println("test()");
        }
    }

    public void func(){
        InnerClass innerClass = new InnerClass();
        innerClass.test();
    }
}

public class Test {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.func();
        Outer.InnerClass innerClass = outer.new InnerClass();
        innerClass.test();

    }
}
  • 实力内部类的获取方法

实例内部类的获取方法书写格式: Outer.InnerClass innerClass = outer.new InnerClass();

代码语言:javascript代码运行次数:0运行复制
class Outer{
    public  int data1 = 1;
    private  int data2 = 2;
    public static  int data3 = 3;

    //实例内部类
    class InnerClass{
        public  int data1 = 11111111;


        public  int data4 = 4;
        private   int data5 = 5;
//        常量在变异的时候确定
        public  static  final int data6 = 6;

        public void test(){
            //访问类内成员变量
//            访问方法1
            System.out.println(data1);
//            访问方法2
            System.out.println(this.data1);
            Outer outer = new Outer();
            //访问类外成员变量
//            访问方法1
            System.out.println(outer.data1);
//            访问方法2
            System.out.println(Outer.this.data1);

            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println("test()");
        }
    }

    public void func(){
        InnerClass innerClass = new InnerClass();
        innerClass.test();
    }
}

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

    }
}

运行结果:


⭐️⭐️⭐️⭐️匿名内部类

代码语言:javascript代码运行次数:0运行复制
public class Test {
    public void func(){
        System.out.println("func()");
    }
    public static void main(String[] args) {
        Test test = new Test();
        test.func();
        test.func();

        new Test().func();//匿名对象
        new Test().func();//匿名对象
    }

匿名对象:就是有实例化的对象但没有指向任何引用。 如果以后的使用场景是使用一次对象,那么就使用匿名对象。

代码语言:javascript代码运行次数:0运行复制
interface InterFaceA{
    void func();
}

class TestA implements InterFaceA{
    @Override
    public void func() {
        System.out.println("我是重写了funcA方法");
    }
}

public class Test {
    public static void main(String[] args) {
        TestA testA = new TestA();
        System.out.println("============");
        //匿名内部类的写法:
        InterFaceA a = new InterFaceA(){
            @Override
            public void func() {
                System.out.println("");
            }
        };

    }

    public void func(){
        System.out.println("func()");
    }

    public static void main1(String[] args) {
        Test test = new Test();
        test.func();
        test.func();

        new Test().func();//匿名对象
        new Test().func();//匿名对象
    }
}

匿名内部类:是没有名字的类,它通常用于简化代码结构,尤其是在需要创建某个接口或类的实例时,这个实例只需要一次性使用,且不需要复用的场景。匿名内部类的本质是一个局部类,它在声明和实例化的同时进行定义。

代码语言:javascript代码运行次数:0运行复制
class MyInnerC{
    public  void myfunc(){
        System.out.println("happy~");
    }
}

interface InterFaceA{
    void func();
}

class TestA implements InterFaceA{
    @Override
    public void func() {
        System.out.println("我是重写了funcA方法");
    }
}

public class Test {
    public static void main(String[] args) {
        TestA testA = new TestA();
        System.out.println("============");
        //匿名内部类的写法:
//        写法一:
        InterFaceA a = new InterFaceA(){
            @Override
            public void func() {
                System.out.println("匿名内部类执行1");
            }
        };
        a.func();
        System.out.println("============");
//        写法二:
        new InterFaceA(){
            @Override
            public void func() {
                System.out.println("匿名内部类执行2");
            }
        }.func();
        System.out.println("============");
//        写法三:普通类的匿名内部类
        new MyInnerC(){
            @Override
            public void myfunc() {
                System.out.println("匿名内部类执行3:You will be happiness");
            }
        }.myfunc();

    }
 }

运行结果:

根据上面的代码我们可以总结出匿名内部类的书写格式和使用规则:

写法一:直接赋值给接口类型的变量

代码语言:javascript代码运行次数:0运行复制
InterFaceA a = new InterFaceA() {
    @Override
    public void func() {
        System.out.println("匿名内部类执行1");
    }
};
a.func();

写法二:直接调用匿名内部类的方法

代码语言:javascript代码运行次数:0运行复制
new InterFaceA() {
    @Override
    public void func() {
        System.out.println("匿名内部类执行2");
    }
}.func();

继承普通类的匿名内部类

代码语言:javascript代码运行次数:0运行复制
new MyInnerC() {
    @Override
    public void myfunc() {
        System.out.println("匿名内部类执行3: You will be happiness");
    }
}.myfunc();
匿名内部类的优点
  • 接口的匿名内部类: 实现接口时,直接实现并使用,适合短小的代码块和事件处理器。
  • 继承普通类的匿名内部类: 覆写父类的方法,适合需要修改父类方法但不需要创建一个新类的情况。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-12-04,如有侵权请联系 cloudcommunity@tencent 删除javapublicsystem变量对象

本文标签: Java内部类