《Thinking in Java》 读书笔记 ——第五、六章 初始化和清理、访问权限控制

一.方法的重载

  1. 每个重载的方法都需要有一个独一无二的参数列表,甚至参数顺序的不同,而通过返回值区分是行不通的。

  2. 如果传入的基本数据类型小于方法中申明的形式参数类型,实际数据类型就会被提升,基本数据类型从小到大的排序是:char < byte < short < int < long < float < double。但是char类型略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升为int型。而如果传入的实际参数较大,则需要通过类型转换进行窄化转换,不然编译器会报错。

二.清理:终结处理和垃圾回收

  1. finalize() 不等同于c++的析构函数,在c++中对象一定会被销毁,而java里的对象却并非总是被垃圾回收(在jvm中深入理解垃圾回收)。

  2. 假设基类版本的finalize()也要做某些重要的事情,因此派生类应该用super来调用它。

三.初始化和执行顺序

  1. 通过子类调用父类的静态字段,子类不会初始化

  2. 类作为数组中的元素不会初始化

  3. 常量池引用也会导致类不初始化

  4. 类中的执行顺序是:静态代码块>>构造代码块>>构造函数>>普通代码块
    如果存在继承关系,则执行顺序是:父类的静态代码块>>子类静态代码块>>父类构造代码块>>父类构造函数>>子类构造代码块>>子类构造函数

    构造代码块的作用:如果只有一个构造函数,则可以将代码块中内容写在构造函数里,如果有多个构造函数且存在多个构造函数里的公共代码,则可以写在构造代码块中减少代码的重复书写。

    静态代码块和构造代码块的区别:
    静态代码块作用于类,主要用于类的初始化操作(类在第一次使用的时候初始化),并且只执行一次;
    构造代码块作用于对象,主要用于对象的初始化操作,只要有对象创建都会执行,并且优先级由于构造函数。

四.包的访问权限

访问位置 private 默认访问权限 protected public
类本身
相同包中的子类 ×
相同包中的非子类 ×
不同包中的子类 × ×
不同包中的非子类 × × ×

猜你喜欢

转载自blog.csdn.net/weixin_48922154/article/details/112849795