浅谈Java内部类

作者: 光哥很霸气 | 来源:发表于2015-08-10 15:48 被阅读4274次

    如果文章对你有所帮助,请点喜欢并关注,这将是我最大的动力,谢谢

    • 为什么要有内部类

    1.内部类是为了更好的封装,把内部类封装在外部类里,不允许同包其他类访问
    2.内部类中的属性和方法即使是外部类也不能直接访问
    3.相反内部类可以直接访问外部类的属性和方法,即使private
    4.利于回调函数的编写。 PS:回调函数是函数的迭代
    5.当描述事物,如身体里的大脑时,大脑在身体内部,可以通过内部类直观描述

    • 内部类特点

    1.内部类对象不仅指向该内部类,还指向实例化该内部类的外部类对象的内存。

    zz.png

    2.内部类和普通类一样可以重写Object类的方法,如toString方法;并且有构造函数,执行顺序依旧是先初始化属性,再执行构造函数
    3.在编译完之后,会出现(外部类.class)和(外部类﹩内部类.class)两个类文件名。
    4.内部类可以被修饰为private,只能被外部类所访问。事实上一般也都是如此书写。
    5.内部类可以被写在外部类的任意位置,如成员位置,方法内。

    • 内部类对象的建立

    1在同包其他类 以及main方法中(前提要内部类没有被修饰成private,所以一般不采用)

    1)先创建外部类对象,再通过外部类对象创建内部类
    Out outer = new Out();
    Out.In inner = outer.new In(); //第一个Out是为了说明该内部类到底属于哪个外部类
    2)通过匿名外部类创建内部类
    Out.In inner = new Out().new In();

    2在外部类里

    可直接创建对象,如 In inner = new In(); 或者直接new In();

    • 内部类的访问

    1.静态时,静态内部类只能访问外部类静态成员;非静态内部类都可以直接访问。(原因是:内部类有一个外部类名.this的指引)当访问外部类静态成员出现重名时,通过(外部类名.静态成员变量名)访问。如,Out.show();
    2.重名情况下,非静态时,内部类访问自己内部类通过this.变量名。访问外部类通过(外部类名.this.变量名)访问 。如Out.this.show();
    3.在没有重名的情况下,无论静态非静态,内部类直接通过变量名访问外部成员变量。

    • 外部类的访问

    1.内部类为非静态时,外部类访问内部类,必须建立内部类对象。建立对象方法,如前所述。
    2.1 内部类为静态时,** 外部类访问非静态成员,通过(外部类对象名.内部类名.方法名)访问,如new Out().In.function();
    2.2 内部类为静态时,
    外部类访问静态成员时,直接通过(外部类名.内部类名.方法名)**
    ,如 Out.In.funchtion();
    PS:当内部类中定义了静态成员时,内部类必须是静态的;当外部静态方法访问内部类时,内部类也必须是静态的才能访问。

    • 内部类分类

    • 1成员内部类

    也是最常规的内部类。该内部类相当于位于外部类的成员的位置。该内部类可以访问外部类的所有成员和方法,即使是private.

    • 2静态内部类

    1)该类被修饰为static。同时作为静态内部类,他不能访问外部类非静态的成员或方法。
    2)访问方式如上所述。
    3)一般书写静态类时,不涉及成员变量。

    • 3方法内部类

    类被创建在外部类方法中
    1)可以访问外部类中的成员
    2)不能被static private 修饰,因为他不再是成员位置,只有成员才能被修饰为static...
    3)因此内部类不能有静态成员
    4)内部类要访问外部方法中的局部变量时,该局部变量需要被修饰成final。

    • 4匿名内部类

    1)就是一个内部类的简化版
    2)定义匿名内部类的前提是,该类必须继承一个外部类或者实现接口。
    具体实现如下图
    这是一个继承类的正常版,一共分为这几步


    1.png

    通过匿名内部类将一步到位实现该操作

    2.png
    PS:因为内部类是匿名的,也就是没有名字,所以该类一次只能调用一个方法,通常在写程序时也是如此,这也正是他优点,在只写一个内部类调用方法时,他可以使整个代码看上去很简洁。
    2015.8.26更新
    匿名内部类在Swing的消息机制中广泛使用,具体看例子
    Swing

    相关文章

      网友评论

        本文标题:浅谈Java内部类

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