Java的内部类

文章目录

java 复制代码
public class OutClass {
class InnerClass{
}
}
// OutClass是外部类
// InnerClass是内部类

静态内部类(被static修饰的成员内部类)--可以实例化!

获取静态内部类对象(把它当成外部类的成员)

创建静态内部类对象时,不需要先创建外部类对象

java 复制代码
class Outer {
    //静态内部类
    static class InnerClass {
    }
}

public class Test {
    public static void main(String[] args) {
        Outer.InnerClass inn = new Outer.InnerClass();
    }
}
java 复制代码
class Outer {
    //静态内部类
    static class InnerClass {
    }
    InnerClass inn = new InnerClass();
}

静态内部类可以声明普通成员变量和方法,而普通内部类不能声明static成员变量和方法

静态内部类跟静态方法一样,只能访问静态的成员变量和方法,不能直接访问外部类的非静态成员变量,但是普通内部类可以访问任意外部类的成员变量和方法

  • 因为外部类对象的非静态成员,依赖外部类对象
  • 被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问,方便在没有创建对象的情况下进行调用(方法/变量)
java 复制代码
class Outer {
    public int data1 = 1;
    private int data2 = 2;
    public static int data3 = 3;

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

        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);
        }
    }
}


public class Test {
    public static void main(String[] args) {
        Outer.InnerClass inn = new Outer.InnerClass();
        inn.test();
    }
}
java 复制代码
class Outer {
    //静态内部类
    static class InnerClass {
        public static int data = 5;
        public static void test() {
            System.out.println(data);
        }
    }
}


public  class Test {
    public static void main(String[] args) {
        Outer.InnerClass.test();
        System.out.println(Outer.InnerClass.data);
    }
}

实例内部类(未被static修饰的成员内部类)

一般实例内部类不能有被static修饰的成员变量和方法,但是成员变量加上final后可以变成常量(常量在编译的时候确定)

  1. 外部类中的任何成员都可以在实例内部类方法中直接访问
  2. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象

实例化实例内部类(先将外部类实例化)

实例内部类对象必须在先有外部类对象前提下才能创建

两种方式:

java 复制代码
class Outer {
    class InnerClass {
    }
}

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

实例内部类中包含了2个this(一个是外部类,一个是实例内部类自己)

java 复制代码
class Outer {
    public int data1 = 1;
    public static int data2 = 2;
    class InnerClass {
        public int data1 = 111;
        public static final int data3 = 3;
        public void test() {
            System.out.println(Outer.this.data1);
            System.out.println(this.data1);
            System.out.println(data1);
            System.out.println(data2);
            System.out.println(data3);
        }
    }

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

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

匿名内部类

匿名对象(运用的场景是只使用一次对象)

java 复制代码
public class Test {
    public void func() {
        System.out.println("func()");
    }
    public static void main(String[] args) {
       new Test().func();
    }
}

匿名内部类

抽象类和接口可以接收具体对象

java 复制代码
interface InterFaceA {
    void func();
}
public class Test {
    public static void main(String[] args) {
        InterFaceA a = new InterFaceA() {
            @Override
            public void func() {
                System.out.println("func()");
            }
        };
        a.func();
        System.out.println("============");
        new InterFaceA() {
            @Override
            public void func() {
                System.out.println("func()");
            }
        }.func();
    }
}

局部内部类(定义在方法里面)

只能在方法里面实例化对象.

不能被public、static等访问限定符修饰

局部内部类只能在所定义的方法体内部使用

编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class

java 复制代码
public class Test {
    public void test() {
        class InnerClass {    
            public void test() {
                System.out.println("InnerClass::test()");
            }
        }
        InnerClass innerClass = new InnerClass();
        innerClass.test();
    }
    public static void main(String[] args) {
        Test test = new Test();
        test.test();
    }
}
相关推荐
斯维赤9 小时前
限流、熔断、降级,你真的分得清吗?
java·后端·架构
Evand J10 小时前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波
BaiPeter11 小时前
ZPL文件预览
开发语言·c++
aiks_yuan11 小时前
Java CPU 100% 怎么排查:JDK 11 起 jstack 自带线程 CPU 时间,不用再 top -H 换算十六进制(JDK 8、11、17 实测)
java
Flynn Liang13 小时前
AiServices 源码级拆解:一个接口如何变成 RAG Agent
java·langchain·源码分析·rag·langchain4j·aiservices
Flynn Liang13 小时前
LangChain4j 1.23 架构全景:Java 大模型应用的 6 层抽象
java·langchain·大模型·rag·ai agent·langchain4j
聪明的笨猪猪14 小时前
实际工程问题:AI生成Redis分布式锁的原子性缺陷导致库存超卖
java·经验分享·面试·ai编程
软件技术NINI14 小时前
基于SpringBoot和Vue的新能源汽车销售推荐系统
java·vue.js·spring boot·后端·汽车·毕业设计·毕设
Flynn Liang15 小时前
LangChain4j 生产级工程骨架:12 个模块 + Docker 一键启动
java·spring boot·langchain·rag·langchain4j
噢,我明白了16 小时前
JAVA中的一些基础应用知识点
java·开发语言