Java 中的内部类的定义

目录

一、成员内部类

二、静态内部类

三、局部内部类

四、匿名内部类


一、成员内部类

java 复制代码
public class InnerClass {
    String name;
    private Integer age;
    static String hobby;

    /**
     * 成员内部类
     * 1、成员内部类中只能定义非静态属性和方法
     * 2、成员内部类中可以访问外部类的成员,私有的可以,静态的也可以
     */
    public class MemberInnerClass {
        //static int num;  报错
        int age = 20;
        public void test() {
            //当本类中没有该属性,则会去外部类中寻找该属性,访问外部类属性
            System.out.println("访问外部类的成员变量:" + name); // => null
            //当本类中有该属性,此时访问的是内部类的 age,this代表的是 MemberInnerClass
            System.out.println("访问内部类的成员变量:" + age); // => 20
            System.out.println("访问外部类的私有成员变量:" + InnerClass.this.age);// =>null
            System.out.println("访问外部类的静态成员变量:" + hobby); // => null
        }
    }
}

成员内部类的创建方式

二、静态内部类

静态内部类的创建方式

三、局部内部类

java 复制代码
/**
     * 局部内部类:定义在外部类方法中
     * 1、局部内部类中只能定义非静态属性和方法
     * 2、局部内部类中可以访问外部类的成员,私有的可以,静态的也可以
     * 3、局部内部类只能在方法内创建对象
     * 4、局部内部类只能访问 局部常量
     * 在jdk1.7版本中,如果局部变量在局部内部类中使用必须要显式的加上final
     * 在jdk1.8版本中,final是默认加上的
     * 因为局部变量在方法结束后,就会被销毁,而局部内部类的对象却要等到内存回收机制进行
     * 销毁所以如果是常量的话,那么常量就会被存放在常量池中,
     */
    public void method() {
        int n = 10;
        int m = 10;
        m=20;
        final int[] nums = {1};
        final InnerClass innerClass = new InnerClass();
        class LocalInnerClass {
            public void test() {

                //局部变量被访问时默认添加了 final 关键字
                System.out.println("访问外部类的方法的局部变量:" + n);

                /* Variable 'n' is accessed from within inner class,
                needs to be final or effectively final
                报错,n 可以被内部类访问,需要是常量值或有效的常量值
                因为 m 在外部已经被修改了,它不再是有效的常量值 */
                System.out.println("访问外部类的方法的局部变量:" + m);

                // n=20;  常量不能被修改

                /*不报错,因为 final 修饰的基本数据类型的数值不能被改变,
                但是被 final 修饰的引用变量它的引用对象不能改变,
                但是其中的属性可以改变*/
                nums[0] = 20;
                innerClass.name = "张三";

                //nums=new int[10]; 报错 常量值不能更改
                //innerClass=new InnerClass();  报错

                System.out.println("访问外部类的成员变量:" + name);
                System.out.println("访问外部类的私有成员变量:" + age);
                System.out.println("访问外部类的静态成员变量:" + hobby);
            }
        }
        //只能在被创建的方法中创建该类
        LocalInnerClass localInnerClass = new LocalInnerClass();
        localInnerClass.test();
    }

四、匿名内部类

java 复制代码
/**
     * 匿名内部类:本身就是一个对象
     * 1、匿名内部类本身就是一个对象
     * 2、一般在匿名内部类中不会定义属性和方法,因为没有意义
     * 3、匿名内部类的父类一般都是抽象类或者是接口
     * 4、访问变量机制和局部内部类一致
     * 匿名内部类的应用场景
     * 如果一个方法的参数是接口,且这个接口只需要实现一次,那么就可以使用匿名内部类
     * 这个接口的实现每一次都不相同,就可以使用匿名内部类
     */
    public void test() {
        int n = 10; // 默认添加了 final
        //例如创建一个线程
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                // n=20;  报错
                System.out.println("访问外部类的成员变量:" + name);
                System.out.println("访问外部类的私有成员变量:" + age);
                System.out.println("访问外部类的静态成员变量:" + hobby);
            }
        });
    }
相关推荐
Devin~Y12 小时前
大厂 Java 面试实录:从音视频内容社区到 AI RAG 的全链路技术设计
java·spring boot·redis·spring cloud·微服务·kafka·音视频
在放️12 小时前
Python 练习题讲解 2 · 循环计算
开发语言·python
CoderYanger12 小时前
A.每日一题:3612. 用特殊操作处理字符串 I
java·程序人生·leetcode·面试·职场和发展·学习方法·改行学it
江华森12 小时前
高级 Bash 脚本编程指南 — 实战教程
开发语言·bash
我不是懒洋洋12 小时前
【C++】string(string的成员变量、auto和范围for、string常用接口的说明、OJ题目、string的模拟实现)
c语言·开发语言·c++·visual studio
Brilliantwxx12 小时前
【C++】 C++11 知识点梳理(中)
开发语言·c++
j7~12 小时前
【C++】STL--Vector容器--拆析解剖Vector的实现以及Vector的底层详解(2)
开发语言·c++·动态二维数组·vector深度剖析·vector的实现·杨辉三角形
唐青枫13 小时前
Java Flyway 实战指南:用 SQL 脚本管理数据库版本
java
三品吉他手会点灯19 小时前
C语言学习笔记 - 50.流程控制4 - 流程控制为什么非常非常重要
c语言·开发语言·笔记·学习
huangdong_20 小时前
电商平台图片URL原图转换技术深度解析:从缩略图到高清原图的完整方案
java·后端·spring