- 继承下来的方法可能被覆盖,但实例变量不会被覆盖
- 继承不能滥用,多用组合,少用继承
- 类只能修饰为public和没有修饰符(表示包访问权限),不能用private
- 继承时不能降低访问方法的访问权限,比如父类方法A为public,子类不能将A改为private
- 所有的类其实都隐式的继承于Object类
- 实例变量(类中方法外的变量)会有默认值,例如0、null、0.0等,局部变量(类中方法内的变量)没有默认值。
- 一个类只能intend一个父类,却可以implement多个接口。
- 所有的对象都保存在堆上(又称为可垃圾回收的堆),方法调用和局部变量保存在栈上,实例变量在对象中,所以实例变量也在堆上。这个C++不一样。
- java中的变量只有两种,1.primitive变量。2.对象引用变量(注意不是对象,其实有点像C++中的指针,但绝不是指针)。
- 在一个对象中创建一个新的对象时,不会在这个对象中为这个新的对象预留分配空间,因为新的对象是在堆上重新分配空间,然后赋值给的是一个对象引用变量。至于这个引用变量占用多大空间因编译器而定了。这个和C++不同,C++取决于是否用new
- 一般在构造函数中,要创建一个不需要参数的构造函数,因为使用默认值时不需要指定大小
- 如果自己没有写构造函数,编译器会自动构造一个无参的构造函数,但是只要自己构造了一个带参的构造函数,编译器就不会再做这样的事了,需要自己构造一个无参的构造函数。
- supper()用来引用父类的构造函数,每个构造函数可以选择调用supper()或者this(),但不能同时用,需要放在构造函数中的第一行,this是在某个构造函数中调用同一个类中的另外一个构造函数。
- 静态的方法不能调用非静态的变量和方案。因为静态的方法不属于任何一个对象,而非静态的方案是属于对象,所以静态的方案是找不到非静态的方法的。
- 被final修饰的东西表示不能改变。静态的final变量表示常量。类被修饰表示不能被继承,方法被修饰表示不能被重载
- 在java 5.0后,每一个primitive主数据类型都有一个包装用的类。类名称都是按主数据名称而定,讲第一个字母大写而已,但Character,Integer除外,写的是全称。
- finally是一定要被执行的,即使在try或者catch中有return语句,先将finally执行完的才会返回return。
- 当对象被序列化时,被该对象引用的实例变量也被序列化,且所有被引用的对象(必须实现序列化,否则会编译错误)也会被序列化,这都是自动化的。
- 如果要让类能够被序列化,就必须implement serializable。其实没有方法需要实现,这个只是用来告诉java虚拟机它可以被序列化。
- hashcode的默认行为是对在heap上的对象产生独特的值,equals()的默认行为是执行==的比较,也就是说会去测两个引用是否对上heap上同一个对象。如果这两个函数没有被覆盖过,则两个对象永远不会被认为是相同的。
- hashcode的方法较快,在对hashset对象进行比较时,同样的hashcode可能对应多个对象对象,然后再使用equals()来判断是否有完全的符合,即:hashcode是用来缩小寻找成本,但最后还是要使用equals才能认定是否真的相同。
------------《head first Java》读后感