« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
| 公告 |
关注电子政务、大型企业应用开发、Web、Workflow、MOM、MDA、RCP、GEF email:gmluyang@gmail.com
|
Blog信息 |
blog名称:SixSun的Blog 日志总数:152 评论数量:372 留言数量:13 访问次数:2380361 建立时间:2004年12月13日 |

| |
[J2SE / 基础类]Thinking in Java笔记 读书笔记, 心得体会
SixSun 发表于 2006/3/8 10:32:37 |
初学Java,看Thinking in Java时候做的部分章节笔记,一些容易遗忘和忽略的东西
(4).初始化与清理
1.如果写了一个没有构造函数的类,编译器会自动为你创建一个默认的构造函数;2.如果写了有构造函数的类(包括无参数的构造函数或带参数的构造函数),编译器不再为你创建一个默认的构造函数;3.如果写了一个带参数的构造函数的类,且无无参数的构造函数,如使用 new ClassName() ,编译器报错,没有定义默认构造函数;4.this关键字处在对象自身内部表示自身的reference;5.当你为同一个类撰写多个构造函数时候,this关键字在一个构造函数内可以作为调用另一个构造函数的一种形式,且可调用一次;
6.对primitive进行重载,如找不到匹配的类型,实参比形参小,primitive会自动从较小的类型升级到相近的较大类型(常数被视为int类型,char类型比较特殊被升级为int类型);7.对primitive进行重载,如找不到匹配的类型,实参比形参大,需要强制设置类型转换,否则编译器报错(且会造成数据丢失的问题);
8.垃圾回收器只知道释放new分配的内存;
9.类的primitive成员变量如果没有赋初值,编译器会自动赋值;10.一个类何时被加载 : a.当第一次新建类的一个实例时 b.或第一次访问类的static成员时;11.初始化顺序: a.加载类,一个类何时被加载 : a.当第一次新建类的一个实例时 b.或第一次访问类的static成员时; b.初始化static成员,且初始化一次; c.初始化primitive成员变量和reference值; d.执行构造函数;
12.static block 将静态初始化语句全部组织起来;12.非 static block 将初始化语句全部组织起来;
5.隐藏实现1.package语句必须是文件里的第一个非注释行;2.无论那种对象,只要放进了String表达式,就会被强制转换为这个对象的String表示形式;3.如果不写类的访问控制符,默认为package权限,但是如果这个类有public 的 static成员,既便客户程序员不能创建那个类对象,也可以访问static成员;
6.复用类
1.可以在派生类里修改基类定义的方法,如果在这个复写的方法里调用基类的方法,需要使用super.方法名(),否则造成递归;
2.继承会令构造行为从基类“向外”发展,基类会在派生类的构造函数访问它之前进行初始化;
3.既便你不为派生类创建构造函数,编译器也会为你构造一个默认的构造函数,然后在由它去调用基类的构造函数;
4.如基类没有默认构造函数,或者要调用的基类构造函数带参数的,需要显视的用super关键字以及合适的参数调用构造函数;
5.对派生类的构造函数而言,调用基类的构造函数应该是它做的第一件事情,应明白什么时候需要用super参与调用,什么时候编译器会帮你完成(参见4),编译器会强制你这么做,否则会报错;
6.不能某样东西是final的,就判断说“它的值在编译的时候就已经确定了”,在运行期确定值也是可以的;
7.空白final数据,你一定要为final数据赋值,为了确保final数据在使用前已经初始化,要么在定义数据的时候用表达式赋值,要么在构造函数里面进行赋值;
8.final的参数,不能在方法里reference指向另一个对象,同样符合final的含义;
9.final的方法禁止派生类复写,private方法根本不存在被复写的机会;
10.final的类会禁止集成,隐式的将final的类中的方法作为final的方法,因为类无法继承,何来复写,但不会影响成员变量的类型;
7.多态性
8.接口和内部类1.接口内方法被自动为public的;
2.复载和覆盖不期而遇且不能仅仅通过返回值来辨别重载的方法;
3.interface的数据成员自动就是public、static和final,方法是public的;
4.接口嵌套接口,类嵌套接口;
5.嵌套的私有接口只能在它的类里面实现(私有接口不能被外部访问);
6.实现接口时,不一定要实现嵌套里面的接口;
7.公共接口返回一个private接口的reference;
8.除非在“宿主类”的非static方法里面,否则你在那里创建内部类对象,都必须用outerClassName.InnerClassName表示这个对象类型;
9.用异常来处理错误
1.getMessage()类似与toString(),getLocalizedMessage()获得更多信息;
2.可以声称方法会抛出一个实际并不会抛出的异常,编译器会当真,它会要求客户程序员象真的会抛出异常那样使用这个方法,它能为异常占个位子;
3.fillInStackTrace覆盖旧的异常轨迹,保存新的异常轨迹,fillInStackTrace返回的是Throwable的reference;
4.如果抛出一个与你扑捉到的异常不同的异常,异常的最初在那里发生的信息被扔掉了,里面保存的是抛出新异常的地点,与fillInStackTrace有相同的效果;
5.异常链:扑捉到一个异常并且抛出另一个异常的时候,还要保存前一个异常的信息(与4.的称述相矛盾),Throwable的子类都有一个能接受cause对象的构造函数,cause就是用来保存前一个异常的。但Throwable的之类中只有三种基类的异常提供了带cause参数的构造函数,他们是Error,Exception和RuntimeException,如果你要链接其他异常,那就不能用构造函数,而只能用initCause方法了。
6.RuntimeException由Java自动抛出,通常情况不用自己去扑捉RuntimeException,你只能忽略RuntimeException(及其之类),RuntimeException表示编程错误,如果RuntimeException不受阻挡的冲到main(),它就会在程序退出的时候,调用printStackTrace();
7.异常没有被当前这组catch子句所扑获的情况下,finally也会在异常处理机制的更高一层的运行环境开始寻找处理程序之前得到执行了;
7.把try区块放进一个循环,你就能构建一个程序运行之前必须满足的条件,提高程序的健壮性;
8.有break和continue语句的情况下,finally语句也会得到执行;
9.finally造成丢失的异常:第一个异常尚未处理,就产生了第二个异常;
匹配异常的时候并不要求抛出的异常同处理程序所要求的异常完全匹配,派生类的对象也可以匹配处理程序中的基类;
如果把扑捉基类异常的catch子句放在最前面,就会把该异常的派生类的异常全部给屏蔽掉;
如果异常被传到控制台,就无需再在main()的主体用try-catch子句了;
覆写方法的时候,只能抛出这个方法在基类中的版本所声名的异常;
|
|
回复:Thinking in Java笔记 读书笔记, 心得体会
小狐狸(游客)发表评论于2006/4/21 9:52:57 |
|
回复:Thinking in Java笔记 读书笔记, 心得体会
xcly(游客)发表评论于2006/3/9 14:22:44 |
|
» 1 »
|