第四章~第七章 1。Compiler不会自动在当前目录中查找需要的class,除非在classpath中有“.”路径
2。当一个class中使用了另一个class,如果在classpath路径中没有该class,但是有source(.java文件),将会自动编译
3。除非确认必须透露底层实现,否则应该将所有的fields都定义为private
4。protected类型也提供package access
5。如果一个类在一个package中,比如:package com.cert,那么这个类应该位于这样的目录结构中:/classes/com/cert。而classpath环境变量中应该有/class路径
6。class不允许定义成private或者protected
7。当转化一个object到String时,调用的是toString()方法,可以在类中实现这个方法,当需要的时候,JVM将自动调用此方法。当基类中有此方法时,子类也会自动继承此方法
8。在子类的构造函数中使用super表示基类
9。如果基类的构造函数有参数传入,那么子类必须在自己构造函数的第一行显式执行基类构造函数:super(parameter)
10。对于被重载的函数,基类中的函数在子类中仍然可见,而在C++中则会被隐藏
11。final关键字:对于primitives,表示value是定值,不允许改变;对于object reference,表示此reference不允许指向另一个新的object;对于method,表示此方法不能被重载;对于class,表示此类不允许被继承
12。任何private方法都是final的
13。在一个class的instance被initial的时候(classname bjectname),具有如下创建顺序:基类中的static变量,子类中的static变量,如果此instance被new出(objectname = new classname),那么还会按照如下顺序执行:基类中成员变量(非static,按照定义的顺序),基类的constructor(从最初的基类开始),该object类的成员变量(非static,按照定义的顺序),该object类的congstructor
14。在JAVA中,除了static和final(private隐式为final)的方法,所有都是late binding(对应于early binding)
15。abstract类相当于C++中的虚函数,abstract类的子类必须实现该类中的所有abstract方法,否则也必须是abstract类
16。abstract类不允许创建自己的实例
17。在一个类的constructor中最好只调用本垒的final和private方法,因为此类方法不会被重载
18。如果只有重载(method overloading),而没有late binding,则不能被称为是多态(polymorphism),也就不能说是面向对象的(object-oriented)
19.Interface只是提供一个框架,没有任何实现。Interface中可以定义fields,但是他们隐式为static和final的
20.可以把interface中的方法定义为public,但即使没有加public关键字,interface中的所有方法也是public的,所以在implements一个interface时,class中的这些方法也必须定义为public,否则编译报错。
21.Interface中方法前面可以加abstract关键字,但是跟不加的效果一样。
22.Interface不仅仅是一个更纯粹的abstract类,更有价值的是可以用interface实现多重继承。
23.只能继承一个non-interface,但是可以实现任意多的interface。也就是说只能extends一个class,但是可以implements任意多的interface。
24.在设计一个基类的时候,如果可以不用实现任何方法以及不用定义成员变量,则应该首选interface,其次是abstract class,再其次是concrete class。 25.重载的函数不能以返回值类型不同来区分。
26.Interface可以extends其他的interface,可以extends多个。
27.因为interface中的所有fields都是static和final的,所以可以利用interface方便地实现诸如C++中的enum功能。
28.在http://jakata./commons 中有很多有用的class(但是很多好像已经在j2dk1.4中实现了,比如String类的功能)
29.Interface中的fields可以说不是interface的一部分,只是作为interface的辅助存储在静态存储区域
30.Inner class可以定义为private或者protected,而普通的class只可以定义为public或者package access。
31.包含在某个scope中的inner class,也是和其他的class一样同时被贬意,只是在scope之外,该class是不可用的。
32.匿名class需要以分号(;)结尾,如:return new classname{code};
33.如果要在匿名inner class中使用外部传入的参数,那么此参数必须为final。
34.在匿名class中不可以有命名的constructor,但是确实可以使用constructor,只需要将代码放置在{}中。如: return new Base(){ {System.out.println(“Inside instance initializer”);} } 当然也有限制,因为不能重载,所以只能有一个constructor。
35.Inner class对enclosing class中的所有的elements都有access权限。这是因为inner class拥有一个隐式的enclosing class object的reference。同时这也解释了为什么inner class object只能由enclosing class object来创建(通过enclosing class提供的一个方法)。
36.如果不需要inner class object和outer class object联系,那么可以将inner class定义为static,这通常被称为nested class。在此种状况下,inner class不拥有outer class object的reference(如35中所述)
37.普通的inner class不允许有static成员,但是nested class可以。
38.nested class object不可以存取outer class中的non-static成员
39.一般地说,在interface中不能有任何代码,但是一个nested class可以放在interface中
40.当编译时,对于inner class会生成:outerclass$innerclass.class文件,对于匿名inner class,会在$后面加上数字表示。
41.可以将测试代码放在一个nested class中,假设outer class名为A,nested class名为tester,则运行:java A$tester即可进行测试。当发布产品时,只需要简单地将A$tester.class文件删除即可。
42.在inner class中要使用outer class object,可以用outerclassname.this来表示
43.除了在outer class中提供一个方法来return new innerclass,还可以直接在外部使用new方法。如: outerclass o = new outerclass; outerclass.innerclass inner = o.new innerclass();
44.如果要继承inner class,则在该继承类的constructor中必须显式引入enclosing class object的reference.如:InheritInner(enclosing wi){wi.super();} 如果要继承inner class的类本身是继承了enclosing class类的inner class,那么就不用显式引入reference。
45.当enclosing class的继承类对inner class重载的时候,不会发生像对method重载时那样的auto upcasting,所以对inner class重载是没有意义的。
46.只有当想生成多个object时,才需要使用local inner class来代替anonymous inner class(指包含在方法中的inner class)
47.无论outer class是不是一个继承类,对于inner class都没有限制。这也是使用inner class的最主要理由。也就是说interface解决了多重继承的一部分问题,而inner class丰富了另外一部分(inner class的出现,实现了在效果上等同于继承于多个non-interface的用法)
|