美文网首页
详细了解使用java内部类 inner class

详细了解使用java内部类 inner class

作者: 宇子豪 | 来源:发表于2018-12-05 17:34 被阅读0次

    回来补基础,为以前偷的懒还债😄
    先讲一下我对内部类的理解,呃,就是类定义一个类,就叫内部类嘛,嘿嘿,很小白。
    现在我对内部类的理解也不是很深入,但是随着编成能力的提高我们会慢慢发现她的魅力的。

    1 为什么使用内部类

    在《Think in java》中有这样一句话:使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。

    呃这是借用别人的话,现在我也说不出为什么要使用内部类,先搞懂了再来说为什么要用她吧。

    • 内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。

    内部类调用局部变量时,局部变量必须被final修饰哦,因为java内部类在引用局部变量时实际上是去copy了一份,不是直接去使用局部变量,为了防止数据不一致所以要加上final

    1 成员内部类

    最普通,最常用的内部类,顾名思义,就是像成员变量一样的定义在类中。

    • 注:成员内部类不可以使用main方法 image.png
    package demo1;
    
    public class Demo1 { // 外部类
    
        public String say() {
            return "我是外部类";
        }
    
        class Demo1_1 { // 成员内部类
    
            public String say() {
                return "我是成员内部类";
            }
    
        }
    
    }
    

    上面这段代码即是一个简单的成员内部类的定义,成员内部类就像是外部类的一个成员。
    成员内部类可以随意访问外部类的属性方法。

    当成员内部类拥有和外部类同名的成员变量或者方法时,默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,以【外部类.属性方法】的形式进行访问:

    public class DemoA { // 外部类
    
        private final String SAY=":哼唧,这该死的魅力";
        
        public String say() {
            return "我是外部类"+SAY;
        }
    
        class DemoB { // 成员内部类
    
            public String say() {
                return "我是成员内部类"+SAY;
            }
            
            public void dd() {
                System.out.println(say()); // 方法重名默认调用内部类本身的方法
                System.out.println(new DemoA().say()); // 调用外部类的重名方法
            }
    
        }
        
        public static void main(String[] args) {
            DemoA dA = new DemoA();
            System.out.println(new DemoA().say()); // 输出外部类的say()
            DemoB dB = dA.new DemoB();
            System.out.println(dB.say()); // 输出内部类的say()
            dB.dd(); 
        }
    
    }
    
    
    image.png

    上面这段代码体现出了成员内部类可以随意访问调用外部类的属性方法,重名时默认调用本身。

    • 但外部类却不可以访问内部类的属性方法,Oh no,这个妖艳的小贱货。
    image.png
    image.png

    成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象。创建成员内部类对象的一般方式如下:

    .new
            A a= new A(); //这里假设A是外部类,B是成员内部类
            A.B b= A.new B();  //必须通过外部类对象A来创建B
    

    成员内部类可以使用以下修饰符:private、protected、public、默认。用private修饰,则只能在外部类的内部访问,如果用public修饰,则任何地方都能访问,如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问,如果是默认访问权限,则只能在同一个包下访问。
    成员内部类像是外部类的一个成员,像类的成员一样拥有多种权限修饰。

    image.png

    成员内部类真是个磨人的小妖精,现在感觉到了内部类的魅力了吗?
    没有,感觉萌萌哒,继续深入。

    2 局部内部类

    局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。(没错,这句是Ctrl C来的,嘻嘻😄)


    image.png

    3 匿名内部类

    名字一听就有点不平凡,有一种人群中独美的味道


    image.png

    平时开发中用的比较多的就是这个妞了吧,嗯嗯。

    匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。(嗯,这段也是复制的,我怎么可能说出这么有文化的话)

    4 静态内部类

    这个好像是用的比较少,反正我是用的少,几乎没用过。

    静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。
    参考大牛的文章,里面还有深入的详细解释

    最后,为什么要使用内部类呢?

    (这里是复制的)

    1. 每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,
    2. 方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。
    3. 方便编写事件驱动程序
    4. 方便编写线程代码

    要我说一下为什么使用内部类,减少代码冗余,提高了开发效率,增强了程序的健壮性,可变性,奈斯

    相关文章

      网友评论

          本文标题:详细了解使用java内部类 inner class

          本文链接:https://www.haomeiwen.com/subject/mznicqtx.html