zoukankan      html  css  js  c++  java
  • java编程思想概括(第八章)接口与内部类

    接口与内部类

    看起来像是一种简单的代码隐藏机制,将某些类置于另外一些类的的内部,内部类了解它的外围类(surrounding class,且能够与之通信。

    1. 接口:接口可以包含数据成员,它们隐含都是staticfinal的。接口只提供了形式,而未提供任何具体实现。

    接口被用来建立类与类之间的“协议(protocol)”。

    接口中被定义的方法必须是public的。

    2. java的多重继承:接口的组合使用。

    使用接口的核心原因:1)为了向上转型为不止一个的基类型,2)与抽象基类相同,防止客户端程序员创建该类的对象,并确保仅仅是建立一个接口。

    3. 组合接口时带来的名字冲突:避免想要组合的不同接口中使用相同的方法名。(被重载的方法仅通过返回类型是不能区分开的)。

    4. 通过继承来扩展接口:使用extends来引用多个基类接口,用逗号将接口名一一分隔开即可。

    5. 群组常量:接口用来创建常量组的工具,使用大写字母的风格

    6. 初始化接口中的数据成员:在接口中的数据成员,自动是staticfinal的,可以被非常量表达式初始化。这些数据成员不是接口的一部分,只是被存储在该接口的静态存储区域内。

    7. 嵌套接口:接口嵌套在类或其他接口中。

    8. 内部类:从外部类的非静态方法之外的任意位置创建某个内部类的对象,指明这个对象的类型:OuterClassName.InnerClassName.

    9. 内部类与向上转型:内部类向上转型为基类,转型为一个接口的时候,使用内部类。所得到的只是指向基类或接口的一个引用,所以能够很方便地隐藏实现细节。

    Private内部类给类的设计者提供了一种途径,以完全阻止依赖于类型的编码,并且完全隐藏了实现的细节。

    普通的(非内部的)类,不能声明为privateprotected;它们只可以被赋予public或者包访问权。

    10. 在方法和作用域内的内部类:理由1)实现了某类型的接口,于是可以创建并返回对其的引用。2)要解决一个负杂的问题,想创建一个类来辅助你的解决方案,但是又不希望这个类是公共可用的。

    11. 匿名内部类:在匿名内部类中,要使用一个在它的外部定义的对象,编译器会要求其参数引用是final型的。通过实例初始化来达到构造器的效果,由于不能重载实例化,所以只能有一个构造器。

    12. 链接到外部类:内部类拥有其外围类的所有元素的访问权。

    13. 嵌套类:将内部类声明为static,这成为嵌套类(nested class)。这意味着:1)要创建嵌套类的对象,并不需要其外围类的对象。2)不能从嵌套类的对象中访问非静态的外围类对象。

    普通的内部类的属性与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static属性,也不能包含嵌套类,但是嵌套类可以包含所有这些东西。

    可以将嵌套类置于接口的命名空间内,并不违反接口的规则。

    14. 引用外围类的对象:在此外围类名称后面跟一个句点和this关键字来获得。

    生成内部类的对象时,必须使用此外围类的一个对象来创建其内部类的一个对象。因为此内部类的对象会悄悄地链接到创建它的外围类的对象。

    15. 从多层嵌套类中访问外部:它能透明地访问所有它所嵌入的外围类的所有成员。

    16. 内部类的继承:继承内部类时,必须将那个“秘密的”外围类对象的引用初始化,而被继承的类中并不存在相联接的缺省对象,需使用专门的语法来明确说清它们之间的关联。

    在继承类的构造器中,使用enclosingClassReference.super(),来提供必要的引用,使程序编译通过。

    17. 内部类不能像方法一样进行重载。因为这两个内部类是完全独立的两个实体,各自在自己的命名空间内。当然,明确地继承某个内部类是可以的。

    18. 局部内部类(Local inner classes):可以访问当前代码块内的常量,和此外围类所有的成员。

    使用局部内部类,原因是需要一个已命名的构造器,或者需要重载构造器,而匿名类只能用于实例初始化。

    需要不止一个此内部类的对象时使用。

    19. 内部类标识符:外围类的名字,加上‘$’,再加上内部类的名字。内部类是匿名的时候,编译器简单地产生一个数字作为其标识符。

    20. 为什么需要内部类:不是总能享用到接口带来的方便,有时你需要与接口的实现进行交互,所以使用内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。

    内部类有效地实现了“多重继承”,也就是说,内部类允许你继承多个非接口类型(类或抽象类)

    21. 闭包(closure)与回调:闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。内部类是面向对象的闭包。

    回调(callback):通过回调,对象能够携带一些信息,这些信息允许它在稍后的某个时刻调用初始的对象。通过内部类提供内闭包的功能。

    22. 内部类与控制框架:1)用一个单独的类完整地实现一个控制框架,从而将实现的细节封装起来。内部类用来表示解决问题所必须的各种不同的action()2)内部类能够轻易地访问外围类的任意成员,所以可以避免这种实现变得很笨拙。如果没有这种能力,代码将变得很令人讨厌,以至于你肯定会选择别的方法。

     

     

     

    ——————————如果不豁出性命的话,也是无法开创未来的。
  • 相关阅读:
    Array,prototype.toString.call()
    js 中的delete运算符
    c#连接sql数据库以及操作数据库
    ArrayList集合
    查找出数据表中的重复值
    C#中的List<string>泛型类示例
    C#中的List<string>泛型类示例
    C#中Convert.ToInt32、int.TryParse、(int)和int.Parse四者的区别
    C#获取文件夹下的所有文件的方法
    从本地文件夹中读取文本文档,并将所有的文档内容合并到一个文本中
  • 原文地址:https://www.cnblogs.com/thirller/p/2923486.html
Copyright © 2011-2022 走看看