`
chen_jp
  • 浏览: 12431 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Thinking in java学习笔记(七)

    博客分类:
  • Java
阅读更多
第八章 接口与内部类
1. Interface这个关键字产生了一个完全抽象的类,没有提供任何的接口实现。Interface不仅仅是一个极度抽象的类,因为它允许你产生一种类似C++多重继承的效果。

2. 你可以选择在接口中显式地将方法声明为public的,但即使你不这样做,它们也是public的。否则,它们将只能得到缺省的包访问权限,这样在方法被继承的过程中,其可访问权限就被降低了,这是java编译器所不允许的。

3. 使用接口编程的原因?○1为了能够向上转型为不知一个的基类类型○2防止客户端程序员创建该类的对象。

4. 使用接口还是抽象类?接口带来了使用抽象类的好处,而且还带来了使用接口的好处,所以如果要创建不带任何方法定义和成员变量的基类,那么我们应该选择接口而不是抽象类。事实上,如果我们知道某事物应该成为一个基类,那么我们的第一选择应该是使它成为一个接口,只有在强制必须要具有方法定义和成员变量的时候,我们才应该该而选择抽象类,或是在必要的时候使其成为一个具体类。

5. 要避免出现下面的两种情况,形同的方法名,参数列表,却有不相同的返回值。编译器会报错。

6. 在接口中定义的数据成员是static和final的,它们不是“空final”,但是可以被非常亮表达式初始化。

7. 接口与接口之间可以相互嵌套。怎样理解?实现private接口的public类中的public方法?

8. 当我们实现某个接口时,并不需要实现嵌套在其内部的任何接口。而且,private接口不能在定义它的类之外被实现。

9. 如果你想从外部类的非静态方法之外的任意位置,创建某个内部类的对象,那么你必须像main()方法中那样,具体的指明这个对象的类型:OuterClassName.InnerClassName.

10. 用不着使用内部类?当你将内部类向上转型为其基类,尤其是转型为一个接口的时候,内部类就有了用武之地。P280这是因为此内部类——某个接口的实现——对于其他人来说能够完全不可见,并且不可用。你所得到的只是指向基类或接口的一个引用,所以能够很方便的隐藏实现细节。

11. 为什么在方法或是在任意的作用域内定义内部类?○1我们实现了某类型的接口,于是可以创建并返回对其的引用。○2我们想要解决一个比较复杂的问题,想创建一个类来辅助咱们的解决方案,但是又不希望这个类是公共可用的。

12. 如果你有一个匿名内部类,它要使用在它的外部定义的一个对象,编译器会要求其参数引用是final类型的(为什么)。

13. 可以为匿名内部类完成类似构造方法的效果,使用跟在new object后的{ },在花括号中进行实例初始化。但是我们需要注意,只能有这一次!即只能初始化一次!

14. 内部类能够访问与其有联系的外围对象的所有成员,所有元素,且不需要任何的特殊条件,这是它引人注目的地方之一。

15. 内部类自动拥有对其外围类所有成员的访问权,这是如何做到的?当某个外围类的对象创建了一个内部类对象时,此内部类必定会保存一个指向那个外部类的引用。然后,我们在访问此外围类的成员时,就是用的那个“隐藏”的引用来选择外围类的成员。Outer.this

16. 如果我们不需要内部类与外部类之间的联系,我们可以将内部类声明为static。这通常被称作嵌套类(nested class)。嵌套类意味着:○1要创建为嵌套类的对象,并不需要其外围类的对象。○2不能从嵌套类的对象中访问非静态的外围类对象。

17. 嵌套类与普通的内部类还有另外一个区别。普通内部类的属性和方法,只能放在类的外部层次上,所以普通的内部类不能有static属性和static数据,也不能包含嵌套类。

18. 正常情况下,你不能在接口内部放置任何代码,但嵌套类可以作为接口的一部分,因为它是static的,只是将嵌套类放入接口的命名空间,这并不违反接口的规则。P291

19. 虽然为每一个类都写一个main()方法,以用来测试是个方法。但它有一个缺点,它的额外代码必须得到编译。如果我们觉得比较麻烦的话,我们可以使用嵌套类来放置测试代码。

20. 必须使用外部类的一个实例来new出来内部类实例,并获取它的引用(静态内部类除外)。内部类的实例会悄悄地链接到创建它的外部类的对象。

21. 内部类的继承: 在对内部类进行继承时,必须在子类的构造方法中传入外部类的信息,我们必须在构造方法中添加这一句:enclosingClassReference.super();这样才能够通过编译。

22. 内部类被覆盖掉吗?不会!子类的内部类不会将父类的同名的内部类覆盖掉,它们处于不同的命名空间之中,互不影响。

23. P298,在特定情况下,使用局部内部类和匿名内部类能够实现相同的功能,但是我们可能会倾向于选择局部内部类,理由??○1我们需要一个构造方法,或是重载构造方法,而匿名内部类只能用于实例初始化○2我们需要不止一个此内部类的对象。

24. 为什么需要内部类?

25. 如果我只是需要一个对接口的引用,为什么我不通过外围类实现那个接口呢?答案是:“如果这能满足你的需求,那么你就应该这样做。”

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

27. 如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些编程与设计问题就很难解决。从这个角度来看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了多重继承。也就是说,内部类允许你继承多个非接口类型(类或抽象类)。

28. 如果不需要解决“多重继承”的问题,我们自然可以使用别的方式编码,而不需要使用内部类。但使用的话,我们能够获得其他一些特性:○1内部类可有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。○2在单个外围类中,你可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。○3创建内部类对象的时刻并不依赖于外部类对象的创建。○4内部类并没有令人迷惑的“is-a”关系;它就是一个独立的实体。

29. 闭包与回调?

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

31. 控制框架?

32. 控制框架是一类特殊的应用程序框架,它用来响应事件的需求。主要是用来响应事件的系统被称作事件驱动系统(event-driven system)。

33. “使变化的事物与不变的事物分离”,通过创建不同的Event子类来变现不同的行为。这正是内部类要做的事情。通过内部类,我们可以:○1用一个单独类完整的实现一个控制框架,从而将实现的细节封装起来。内部类用来表示解决问题所必须的各种不同的action()。○2内部类可以轻易的访问外围类的任意成员,所以可以避免这种实现变得很笨拙。如果没有这种能力,代码将会变得很讨厌。
分享到:
评论

相关推荐

    Thinking in Java 自学笔记——第二章 一切皆对象

    Thinking in Java 自学笔记——第二章 一切皆对象 个人原创,不喜勿喷。

    Thinking in java学习笔记

    这是我经过半年的认真研读《thinking in java》这本书的读书笔记,涉及到从容器一章开始的所有后续章节的内容,只有把握我笔记中的内容我想你就差不多弄懂了<thinking in java>这本书的精华

    Thinking In java学习笔记

    这是我看Thinking in java 做的笔记,和大家分享下,如有不明白的的地方可与我私信,或者直接问度娘。

    Java学习笔记.pdf

    我的学习笔记的书本课程来自于:《Thinking in Java》和《Head First Java》 视频课程主要来自于:廖雪峰老师《Java 基础课程》 如涉及版权侵犯请联系我更正。 初来乍到,文笔稚嫩,学识浅薄,请多指教。

    java基础补足和thinking In Java学习.rar

    JAVA学习日记---Thinking in Java学习笔记 第5章总结 第五章 初始化与清理 5.1 用构造器确保初始化 1.构造器命名必须与类名相同 2.构造器也是方法,满足方法的各种特征,无参数的构造器称为默认构造器,默认构造...

    《Thinking+in+Java》读书笔记共38页.pd

    《Thinking+in+Java》读书笔记共38页.pdf.zip

    恒生电子JAVA笔试试题-Thinking-In-Java-Notes:ThinkinginJava学习笔记

    Java》学习笔记 [TOC] 阅读计划 章节列表 对象导论 一切都是对象 操作符 控制执行流程 初始化与清理 访问权限控制 复用类 多态 接口 内部类 持有对象 通过异常处理错误 字符串 类型信息 泛型 数组 容器深入研究 Java...

    Thinking in Java

    在学习java的适合看看!有学习笔记,经过整理的。

    Thinking_in_Java(第四版_).rar

    学习笔记

    java学习资料/笔记整理(二)

    java学习资料/笔记整理,含java语言入门中文版、JDK1.4.2手册、JSP由浅入深、Think In Java(中英文)、Thinking_in_Java_chinese_version、精通swing程序设计等8个编译的HTML帮助文档....

    windows10上安装mysql详细图文教程.pdf

    我的学习笔记的书本课程来自于:《Thinking in Java》和《Head First Java》 视频课程主要来自于:廖雪峰老师《Java 基础课程》 如涉及版权侵犯请联系我更正。 初来乍到,文笔稚嫩,学识浅薄,请多指教。

    String学习笔记

    自己写的java学习笔记,有完整的体系结构,有思维导图帮助理解和记忆

    java日常学习资料整理

    该资源包含了本人学习java时的笔记整理,还包含华为编程规范,以及thinking in java等多方面的学习资料,对于java从业者来说javaAPI文档以及经典书目必须要读,另外为了更具实践性还附了java实验指导书,希望对于...

    Tomcat安装、配置和部署笔记 - 辛伯达 - 博客园.pdf

    我的学习笔记的书本课程来自于:《Thinking in Java》和《Head First Java》 视频课程主要来自于:廖雪峰老师《Java 基础课程》 如涉及版权侵犯请联系我更正。 初来乍到,文笔稚嫩,学识浅薄,请多指教。

    5本java学习用书

    找了5本学习java的好书和一些例子代码和大家分享,希望能够对您能有所帮助。

    thinking-in-spring:春天学习笔记

    春天思考 春天学习笔记

    java软件笔试题-MyNotebook:我大学时期的笔记本

    机器学习 C++笔记 part 4: 数据结构与算法 part 5: 笔试/面试 part 6:专业基础 输入URL到页面加载完成的过程 part 7:读书笔记 thinking in java effective java Android开发艺术探索 Android插件化开发指南

    thinking-in-spring:学春天

    春天学习笔记 Bean初始化 BeanDefinitionBuilder 新的GenericBeanDefinition Bean的命名(非强制性) BeanNameGenerator AnnotationBeanNameGenerator Bean的别名(一般XML配置) 别名 BeanDefinition的注册 ...

    java-study:JAVA示例,关于并发和缓存

    [目录]用法一个包含...Thinking in Java》一书的源代码书行动中的Java并发有效的Java(第二) Java 8实战用Java思考(第四)深度JVM Java网络编程博客笔记包和类的名称设法具有描述性,但可能违反了建议的名称样式。

Global site tag (gtag.js) - Google Analytics