美文网首页Java编程思想
《JAVA编程思想》学习笔记:第10章(内部类)

《JAVA编程思想》学习笔记:第10章(内部类)

作者: 编程家园 | 来源:发表于2020-02-03 12:30 被阅读0次

    第10章 内部类

    10.1 链接到外部类

    Java非static的普通内部类自动拥有对其外围类所有成员的访问权。

    a. Java&C++的区别:

    Java普通内部类能访问其外围对象(enclosing object)的所有成员,而不需要任何特殊条件 。C++嵌套类的设计只是单纯的名字隐藏机制,与外围对象没有联系,也没有隐含的访问权。

    b. Java实现原理:

    在Java中,当某个类创建一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围类的对象的引用。然后,在你访问此外围类的成员时,就是用那个引用来选择外围类的成员。这些细节是由编译器处理的。Java的迭代器复用了这个特性。

    10.2 .this 与 .new

    Java非static的普通内部类可应用.this返回其外围对象的引用。

    外围对象可应用.new来生成一个内部类对象。

    public class DotThis{

        public class Inner{

            public DotThis outer(){

                return DotThis.this; // a plain "this" would be Inner's "this"

            }

        }

        public Inner inner(){ return new Inner(); }

        public static void main(String[] args){

            DotThis dt = new DotThis();

            DotThis.Inner dti = dt.inner();

            dti.outer().f();

        }

    }

    10.3 匿名内部类

    Anonymous Inner Class.:没有定义class name的内部类。

    10.4 Java嵌套类

    嵌套类:内部类声明为static时,不再包含外围对象的引用.this,称为嵌套类(与C++嵌套类大致相似,只不过在C++中那些类不能访问私有成员,而在Java中可以访问)。

    - 创建嵌套类,不需要外围对象。

    - 不能从嵌套类的对象中访问非静态的外围对象。

    10.4.1 接口内部的类

    嵌套类可以作为接口的一部分(正常情况下,接口内部不能放置任何代码)。放到接口中的任何类都自动是public和static的。因为类是static的,只是将嵌套类置于接口的命名空间内,这并不违反接口的规则。

    10.4.2 从多层嵌套类中访问外部类的成员

    一个内部类被嵌套多少层并不重要——它能透明地访问它所嵌入的外围类的所有成员。

    10.5 为什么需要内部类

    内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象。所以可以认为内部类提供了某种进入其外围类的窗口。

    内部类实现一个接口与外围类实现这个接口有什么区别呢?答案是:后者不是总能享用到接口带来的方便,有时需要用到接口的实现。所以,使用内部类最吸引人的原因是:

    每个内部类才能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。

    内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。也就是说,内部类使得Java实现继承多个非接口类型(类或抽象类)。

    10.6 闭包与回调

    闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。通过这个定义可以看出内部类是面向对象的闭包,因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向此外围类对象的引用(.this),在此作用域内,内部类有权操作所有的成员,包括private成员。

    回调(callback),通过回调,对象能够携带一些信息,这些信息允许它在稍后的某个时刻调用初始的对象。Java中没有指针,通过内部类提供的闭包功能可以实现回调。

    10.7 局部内部类

    在代码块|方法中定义的类。

    应用场景:class定义&和new Object() 均位于方法内部。

    10.8 Java接口和内部类总结

    Java的接口和内部类比其他面向对象的概念更深奥复杂,C++没有这些,将两者结合起来,同样能够解决C++中的用多重继承所能解决的问题。

    相关文章

      网友评论

        本文标题:《JAVA编程思想》学习笔记:第10章(内部类)

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