第八章 接口与内部类
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》是一本深度解析Java编程语言的经典著作,其深入浅出的讲解和丰富的实例使得读者能够全面理解Java的精髓。以下是对书中部分关键知识点的总结: 1. **Java 泛型**:泛型是Java SE 5.0引入的重要...
### Thinking in Java 自学笔记——第二章 一切皆对象 #### 重要概念解析 ##### 2.1 用引用操纵对象 在Java中,一切都被视为对象,这意味着无论是字符串、数字还是其他数据类型都可以被视为对象来进行操作。当...
### Thinking in Java 读书笔记知识点总结 #### 一、万事万物皆对象 1. **对象存储位置** - **寄存器**:程序无法直接控制。 - **栈(Stack)**:存储基本类型数据和对象引用,但对象本身不在此处。 - **堆(Heap)...
该标签表明本章节的主要内容是关于 Java 编程语言的学习笔记。 部分内容: 1.1 抽象过程 抽象是编程语言的基本机制,它允许开发者定义和使用抽象类型,隐藏实现细节,提高代码的可维护性和可重用性。 1.2 每个...
《王者归来之Thinking in Java读书笔记》是对Bruce Eckel的经典之作《Thinking in Java》第四版的深度学习与总结。这本书是Java程序员的必备参考书,它深入浅出地阐述了Java语言的核心概念和技术,旨在帮助读者理解...
### Thinking In Java 学习笔记知识点总结 #### 面向对象编程(OOP)的重要性及其影响 面向对象编程(OOP)在软件开发领域产生了深远的影响。它不仅提高了开发效率和降低了维护成本,还简化了设计流程,使得编程任务...
《Thinking in Java》是Bruce Eckel的经典之作,它深入浅出地讲解了Java语言的核心概念和技术,对于初学者和有经验的开发者来说都是极好的学习资源。这篇读书笔记主要聚焦在第五部分的内容,可能涵盖了类、对象、...
这些只是《Thinking in Java》中的一部分内容,全书还包括类、接口、多态性、异常处理、集合框架、并发编程等多个主题,是Java学习者的宝贵资源。理解和掌握这些基础知识是成为一名熟练Java程序员的关键步骤。
通过以上概述,《Thinking In Java》第一章深入浅出地讲解了Java的基础概念,涵盖了面向对象编程的核心原则、数据的存储与管理、基本类型与包装类的使用,以及高精度数字的处理技巧,为初学者和进阶学习者提供了宝贵...
JAVA学习日记---Thinking in Java学习笔记 第5章总结 第五章 初始化与清理 5.1 用构造器确保初始化 1.构造器命名必须与类名相同 2.构造器也是方法,满足方法的各种特征,无参数的构造器称为默认构造器,默认构造...
我的学习笔记的书本课程来自于:《Thinking in Java》和《Head First Java》 视频课程主要来自于:廖雪峰老师《Java 基础课程》 如涉及版权侵犯请联系我更正。 初来乍到,文笔稚嫩,学识浅薄,请多指教。
在IT领域,特别是Java编程的学习过程中,"JAVA夜未眠,thinkingJAVA和学习笔记"这一主题涵盖了许多核心概念和实践技巧。以下是对这些资源的详细解释: 首先,"Java夜未眠"可能指的是一个深入探讨Java编程的书籍或...
《中文版Thinking in Java 4th编程思想》是学习Java编程的重要参考资料,它深入浅出地介绍了面向对象编程的核心概念。下面将详细解读其中的主要知识点。 1. **对象导论** - **万物皆对象**:Java编程的核心是对象...
总之,《Thinking in Java》的读书笔记结合了广泛的Java知识和实践应用,从基础知识到高级主题,从理论到实践,为学习和提升Java编程技能提供了全面的资源。无论是对初学者还是经验丰富的开发者,这都是一个宝贵的...
其次,"Thinking in Java"的资源可能包括了课后练习、习题解答、代码注释或者其他辅助学习材料。这些资源对于自学Java的人来说极其宝贵,它们可以帮助检验学习效果,解决遇到的问题,并提供额外的实践机会。通过完成...
**Java JDK 6.0 学习笔记** Java JDK(Java Development Kit)是Java编程语言的核心组件,包含Java运行环境、编译器、类库以及各种工具,是开发者进行Java程序开发的基础。Java JDK 6.0是Oracle公司发布的一个重要...
Java》学习笔记 [TOC] 阅读计划 章节列表 对象导论 一切都是对象 操作符 控制执行流程 初始化与清理 访问权限控制 复用类 多态 接口 内部类 持有对象 通过异常处理错误 字符串 类型信息 泛型 数组 容器深入研究 Java...
6. **Java学习笔记.doc**: 这可能是个人或教师的教学笔记,可能包含学习心得、重点难点解析,对学习者来说是宝贵的参考资料。 7. **2011最新整理Java练习题.doc**: 提供了最新的练习题目,反映了当时Java技术的发展...