java内部类的本质

2024-07-17 1431阅读

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

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

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

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

    1.静态内部类:

    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静态内部类可以被外部使用,只是需要通过“外部类.静态内部类”的方式使用:

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

    静态内部类的实现:

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

    java内部类的本质

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

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

    2.成员内部类:

    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.方法内部类:

    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。

    java内部类的本质

    4.匿名内部类

    java内部类的本质

    java内部类的本质

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]