Java基础-内部类

内部类指的是在一个类的内部定义的类,Java 中存在四种内部类,分别是成员内部类、局部内部类、静态内部类和匿名内部类。

成员内部类

成员内部类在类文件中与成员变量和成员方法并列,作为类的成员存在。

成员内部类可以访问外部类的所有成员,成员内部类不可以定义静态成员。

java 复制代码
public class Outer {

    private String a = "a";

    class Inner {
        
        private String b = "b";
        
        void hello() {
            System.out.println(Outer.this.a + " " + b);
        }
    }
}

要实例化一个成员内部类,必须先实例化外部类,通过外部类实例实例化一个成员内部类。

java 复制代码
public class Main {

    public static void main(String[] args) {
        Outer out = new Outer();
        Outer.Inner inner = out.new Inner();
        inner.hello();
    }
}

局部内部类

局部内部类指定义在成员方法或者代码块中的类,对它的访问仅限于定义它的方法或代码块内。

局部内部类可以访问外部类所有成员,如果要访问局部变量,则变量必须被 final 修饰。局部内部类不能定义静态成员。

java 复制代码
public class Outer {

    private String a = "123";

    public void hello() {
        final String b = "b";

        class PartInnerClass{
            private String c = "c";

            public void hello() {
                System.out.println(a + b + c);
                outerMethod();
            }
        }

        PartInnerClass partInnerClass = new PartInnerClass();
        partInnerClass.hello();

        a = "aa";
    }


    private void outerMethod(){
        System.out.println(a);
        
        a = "aa";
    }
}

静态内部类

静态内部类的定义和成员内部类类似,只是比成员内部类多了一个 static 修饰符。

静态内部类不可以访问外部类非静态成员。

java 复制代码
public class Outer {

    private String a = "a";
    private static String staticA = "a";

    private void outerMethod(){
        a = "aa";
        System.out.println(a);
    }

    static class staticInnerClass{
        private String b = "b";
        
        public void innerMethod(){
            System.out.println(staticA + b);
        }
    }
}

静态内部类不再依附于外部类,这点和静态成员有点类似。

java 复制代码
public class Main {

    public static void main(String[] args) {
        Outer.staticInnerClass inner = new Outer.staticInnerClass();
        inner.innerMethod();
    }
}

匿名内部类

匿名内部类在 Java 中用于实现接口和抽象类,它也可以继承普通类,但是很少使用。

匿名内部类可以访问外部类的所有成员。匿名内部类如果要访问局部变量,则该局部变量必须被 final 修饰。

匿名内部类不能定义静态成员。

java 复制代码
public class Outer {

    private String a = "a";

    private void outerMethod(){
        
        String c = "c";
        
        Runnable r = new Runnable() {
            
            private String b = "b";
            
            @Override
            public void run() {
                System.out.println(a + b + c);
            }
        };
        
        r.run();
    }
}
相关推荐
黑客老李2 分钟前
JavaSec | SpringAOP 链学习分析
java·运维·服务器·开发语言·学习·apache·memcached
开开心心就好10 分钟前
高效Excel合并拆分软件
开发语言·javascript·c#·ocr·排序算法·excel·最小二乘法
特立独行的猫a16 分钟前
Nuxt.js 中的路由配置详解
开发语言·前端·javascript·路由·nuxt·nuxtjs
勤奋的知更鸟28 分钟前
Java编程之原型模式
java·开发语言·原型模式
叶 落37 分钟前
[Java 基础]数组
java·java 基础
KK溜了溜了39 分钟前
JAVA-springboot log日志
java·spring boot·logback
珂朵莉MM41 分钟前
2021 RoboCom 世界机器人开发者大赛-高职组(初赛)解题报告 | 珂学家
java·开发语言·人工智能·算法·职场和发展·机器人
香蕉炒肉1 小时前
Java优化:双重for循环
java·开发语言
傍晚冰川1 小时前
FreeRTOS任务调度过程vTaskStartScheduler()&任务设计和划分
开发语言·笔记·stm32·单片机·嵌入式硬件·学习
PingdiGuo_guo1 小时前
C++智能指针的知识!
开发语言·c++