内部类的分类及特点

本文详细解析了Java内部类的四种类型,包括静态成员内部类、成员内部类、局部内部类和匿名内部类。探讨了内部类的使用场景,如访问外部类的私有属性、实现多继承和代码封装。通过实例展示了如何实例化内部类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近看到好多源码中都有内部类的存在,比如ThreadLocal、HashMap中都是这样。也了解到在jdk源码中,静态内部类较为常见。了解内部类是很有必要的。

为什么要使用内部类?可以去看下这篇文章链表为什么使用内部类实现

1.内部类可以访问其所在类的私有属性和方法
2.不希望除了所属的外部类使用外的其他类进行访问,内部类可以隐藏起来
3.可以联合外部类解决多继承问题

内部类总共有以下四类。

1.静态成员内部类(和成员字段相同位置,static修饰)
2.成员内部类(和成员字段相同位置,没有static修饰)
3.局部内部类(方法内定义一个类)
4.匿名内部类(方法内定义一个类,但是没有名称,类似于new Runnable)
1.类可以用static修饰吗?

只有成员内部类可以用static关键字修饰。public类、方法内部类不行 。

2.内部类可以被实例化吗?

当然可以。在网上看到好多说静态类只能调用其静态方法,不能实例化。其实是可以被实例化的,好多jdk的源码都是这么干的。

3.什么是内部类。

一句话,内部类看作外部类(或者方法的)的一个变量名称。他们都是可以被实例化的,

4.成员内部类

package com.xiaoer;

public class StaticOuterBean {
    public static void main(String[] args) {
        System.out.println("============静态类============================");
        System.out.println(StaticInnerClassA.staticClassStaticField);
        StaticInnerClassA.staticClassStaticMethod();    //静态内部类的静态调用,无需实例化内部类
        StaticInnerClassA staticInnerClassA = new StaticInnerClassA();
        System.out.println(staticInnerClassA.staticClassNotStaticField);
        staticInnerClassA.staticClassNotStaticMethod(); //静态内部类的非静态调用,需要实例化内部类
        System.out.println("============非静态类============================");
        StaticOuterBean staticOuterBean = new StaticOuterBean();
        //非静态内部类是外类对象的一个属性,所以必须要在外部类实例化之后才能使用
        NotStaticInnerClassB notStaticInnerClassB = staticOuterBean.new NotStaticInnerClassB();
        System.out.println(notStaticInnerClassB.staticClassNotStaticField);
        notStaticInnerClassB.staticClassNotStaticMethod();

//        new NotStaticInnerClassB();
    }
    static class StaticInnerClassA {
        private String staticClassNotStaticField = "静态类的非静态字段";
        static String staticClassStaticField = "静态类的静态字段";
        void staticClassNotStaticMethod() {
            System.out.println("静态类的非静态方法");
        }
        static void staticClassStaticMethod() {
            System.out.println("静态类的静态方法");
        }
    }
    class NotStaticInnerClassB {
        private String staticClassNotStaticField = "静态类的非静态字段";
//        static String staticClassStaticField = "静态类的静态字段";
        void staticClassNotStaticMethod() {
            System.out.println("静态类的非静态方法");
        }
//        static void staticClassStaticMethod() {   //非静态内部类不能声明姿态字段或者静态方法
//            System.out.println("静态类的静态方法");
//        }
    }
}

输出结果:

============静态类============================
静态类的静态字段
静态类的静态方法
静态类的非静态字段
静态类的非静态方法
============非静态类============================
静态类的非静态字段
静态类的非静态方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值