《java编程思想》读书笔记之初始化与清理
1.只有在没有默认构造函数的时候,编译器才会默认生成一个,当用户定义了构造函数,编译器便不会再生成默认构造函数。
可以使用private默认构造函数来禁止继承
2.方法的构造要素为:方法名和参数列表(不包括返回值),因此重载只能由返回值来重载,无法通过返回值来重载方法
3.float类型范围大于int但是精度小于int,因此可以在方法需要一个float的时候,传入一个int
float的范围大概为-2128次幂-2128次幂
4.调用一个对象的方法的时候,实际上是将这个对象引用作为一个参数传入指定的方法中,用来表示是那个对象调用了此方法
Student student =new Student();student.getName();//实际上是:Student.getName(student)
5.可以通过this(xx,xxx)来调用其他构造函数
6.finalize()方法不同于C++中的析构函数
- 并不能确定什么时候才会调用此方法,也有可能不会调用
- 此方法只于内存有关,只有在JVM可用内存到达极限的时候,才会进行垃圾回收并调用此方法。
7.finlize()方法可用来做对象终结验证的条件,比如某些对象在被回收之前必须经过某些操作才能回收
- Closeable对象的close()方法可以放在这里做二次验证,比如关闭文件流等
8.垃圾回收器:
找到垃圾
- 引用计数法(有循环引用问题)
- 追溯引用法
处理垃圾
- 停止-复制法
- 标记-清扫法
一般更多的是将他们结合起来,大对象标记,小对象复制
9.未初始化的局部对象很有可能是程序员的疏忽,因此对于局部变量,未经初始化就直接使用会出现编译错误
10.类的成员变量不初始化会默认初始化一个值。boolean默认为false,引用为null
11.默认初始化是必然的,对于任何初始化形式(定义初始化或者构造函数初始化),成员变量都会先被赋值为默认值,然后再被赋值,因此编译器不会检查是否有已经初始化,因为初始化已经通过上述形式得到了保证
12.静态对象(static)是在第一次访问此类的时候(使用此类初始化对象或者访问静态数据)的时候才初始化,并且只会被初始化一次
13.对象的成员初始化顺序为先静态成员,再非静态成员,每个类别中根据定义的顺序进行默认或者赋值初始化
14.构造函数可以被看作为静态方法
15.创建对象的过程:假设有个Dog类
- 第一次访问Dog的静态方法或者静态对象的时候,Java 解释器会先查找Dog类的路径
- JVM会载入Dog.class,并按定义顺序初始化所有静态变量
- 当使用new Dog()创建对象的时候,首先在堆上分配足够的存储空间
- 将分配的存储空间清零并将对象所有的成员默认初始化
- 执行所有出现在字段定义的时候的赋值操作
- 执行构造函数
16.Java所有对象都定义在堆上,其他语言在堆上分配空间性能比较低,但是Java的内存管理是连续的,因此性能依然比较快
17.Java允许使用静态块初始化,也就是可以定义
static{
//do something
}
一般用于使用一个方法来初始化一个对象的时候
18.数组允许两种申明方式:int[] a1或者int a1[]
19.数组算是一个对象,它包含Object中的所有方法
20.Java 数组维护了一个length字段,每次存取都会用length来维护数组越界的安全,虽然效率降低是更加安全
21.当数组作为一个类的成员的时候,默认是null
22.默认toString()方法打印出来是这个类型名称@对象的地址(修改:已由R大回答得知,toString()打印的不是地址,而是hashCode()或者identifyHashCode()的返回结果)
23.可变参数本质上还是一个数组(编译器自动填充的语法糖),对于可变数组可以不传参数,此时数组为length为0的数组
24.可变方法也接受数组对象,并且当传入一个数组对象的时候,编译器便不会再自动填充
25.可变参数可能带来的问题:重载,当使用重载的时候,最好不要使用可变参数,或者只在一个版本上使用可变参数
关注我简信回复【资料】可以领取到收集的面试及电子书资料,或许对你有帮助!每天仅限10人
《java编程思想》读书笔记之初始化与清理 《java编程思想》读书笔记之初始化与清理