一.方法的重载
-
每个重载的方法都需要有一个独一无二的参数列表,甚至参数顺序的不同,而通过返回值区分是行不通的。
-
如果传入的基本数据类型小于方法中申明的形式参数类型,实际数据类型就会被提升,基本数据类型从小到大的排序是:char < byte < short < int < long < float < double。但是char类型略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升为int型。而如果传入的实际参数较大,则需要通过类型转换进行窄化转换,不然编译器会报错。
二.清理:终结处理和垃圾回收
-
finalize() 不等同于c++的析构函数,在c++中对象一定会被销毁,而java里的对象却并非总是被垃圾回收(在jvm中深入理解垃圾回收)。
-
假设基类版本的finalize()也要做某些重要的事情,因此派生类应该用super来调用它。
三.初始化和执行顺序
-
通过子类调用父类的静态字段,子类不会初始化
-
类作为数组中的元素不会初始化
-
常量池引用也会导致类不初始化
-
类中的执行顺序是:静态代码块>>构造代码块>>构造函数>>普通代码块
如果存在继承关系,则执行顺序是:父类的静态代码块>>子类静态代码块>>父类构造代码块>>父类构造函数>>子类构造代码块>>子类构造函数构造代码块的作用:如果只有一个构造函数,则可以将代码块中内容写在构造函数里,如果有多个构造函数且存在多个构造函数里的公共代码,则可以写在构造代码块中减少代码的重复书写。
静态代码块和构造代码块的区别:
静态代码块作用于类,主要用于类的初始化操作(类在第一次使用的时候初始化),并且只执行一次;
构造代码块作用于对象,主要用于对象的初始化操作,只要有对象创建都会执行,并且优先级由于构造函数。
四.包的访问权限
访问位置 | private | 默认访问权限 | protected | public |
---|---|---|---|---|
类本身 | √ | √ | √ | √ |
相同包中的子类 | × | √ | √ | √ |
相同包中的非子类 | × | √ | √ | √ |
不同包中的子类 | × | × | √ | √ |
不同包中的非子类 | × | × | × | √ |