Thinking in 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内部类可以轻易的访问外围类的任意成员,所以可以避免这种实现变得很笨拙。如果没有这种能力,代码将会变得很讨厌。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值