java内部类的本质

定义在类内部,可以实现对外部完全隐藏,可以有更好的封装性,代码实现上也往往更为简洁。

内部类可以方便地访问外部类的私有变量,可以声明为private从而实现对外完全隐藏。

在Java中,根据定义的位置和方式不同,主要有4种内部类:

  • 静态内部类:可以被外部使用(但要看访问权限而定)
  • 成员内部类:可以被外部使用(但要看访问权限而定)
  • 方法内部类:在一个方法内限定和使用
  • 匿名内部类:不能在外部使用

1.静态内部类:

java 复制代码
class outer{
    private static int shared=100;
    public static class Staticinter{
        public void innermethod(){
            System.out.println(shared);
        }
    }
    public void test(){
        Staticinter si=new Staticinter();
        si.innermethod();
    }
}

静态内部类可以有:静态变量、静态方法、成员方法、成员变量、构造方法等。它可以访问外部类的静态变量和方法,如innerMethod直接访问shared变量。在类内部,可以直接使用内部静态类,如test()方法所示。

public静态内部类可以被外部使用,只是需要通过"外部类.静态内部类"的方式使用:

java 复制代码
public static void main(String[] args) {
        outer.Staticinter O=new outer.Staticinter();
        O.innermethod();
       
    }

静态内部类的实现:

代码实际上会生成两个类:一个是Outer,另一个是Outer$StaticInner

内部类访问了外部类的一个私有静态变量shared,而我们知道私有变量是不能被类外部访问的,Java的解决方法是:自动为Outer生成一个非私有访问方法access$0,它返回这个私有静态变量shared。

静态内部类的使用场景是很多的,如果它与外部类关系密切,且不依赖于外部类实例,则可以考虑定义为静态内部类。比如,一个类内部,如果既要计算最大值,又要计算最小值,可以在一次遍历中将最大值和最小值都计算出来,但怎么返回呢?可以定义一个类Pair,包括最大值和最小值,但Pair这个名字太普遍,而且它主要是类内部使用的,就可以定义为一个静态内部类。

2.成员内部类:

java 复制代码
class outer{
    private  int shared=100;
    public  class inter{
        public void innermethod(){
            System.out.println(shared);
        }
    }
    public void test(){
        inter si=new inter();
        si.innermethod();
    }
}

如果内部类与外部类关系密切,需要访问外部类的实例变量或方法,则可以考虑定义为成员内部类。

外部类的一些方法的返回值可能是某个接口,为了返回这个接口,外部类方法可能使用内部类实现这个接口,这个内部类可以被设为private,对外完全隐藏。

3.方法内部类:

java 复制代码
class outer{
    private  int shared=100;
   
    public void test(){
        final String str="hello";
       class inner{
        public void innermethod(){
            System.out.println(shared);
        }
    }

inner in=new inner;
in.innermethod();
}    
}

类Inner定义在外部类方法test中,方法内部类只能在定义的方法内被使用。如果方法是实例方法,则除了静态变量和方法,内部类还可以直接访问外部类的实例变量和方法,如innerMethod直接访问了外部私有实例变量a。如果方法是静态方法,则方法内部类只能访问外部类的静态变量和方法。方法内部类还可以直接访问方法的参数和方法中的局部变量,不过,这些变量必须被声明为final,如innerMethod直接访问了方法参数param和局部变量str。

4.匿名内部类

相关推荐
佚先森2 分钟前
2024ARM网络验证 支持一键云注入引流弹窗注册机 一键脱壳APP加固搭建程序源码及教程
java·html
古月居GYH16 分钟前
在C++上实现反射用法
java·开发语言·c++
儿时可乖了1 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
ruleslol1 小时前
java基础概念37:正则表达式2-爬虫
java
xmh-sxh-13141 小时前
jdk各个版本介绍
java
天天扭码2 小时前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶2 小时前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺2 小时前
Spring Boot框架Starter组件整理
java·spring boot·后端