java内部类的本质

07-17 1429阅读

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

内部类可以方便地访问外部类的私有变量,可以声明为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购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]