覆盖方法
父类中的一些方法对于子类并不是适用,需要提供一个新的方法用来覆盖(override)父类中的方法.如果需要调用父类的方法,在方法名前加super.
子类构造器
由于子类的构造器不能直接访问父类的私有域,所以必须利用父类的构造器对这部分私有域初始化,使用super实现对父类构造器的调用,使用super调用父类构造器的语句必须是子类构造器的第一条语句.
- 如果子类构造器没有显式调用父类构造器,则自动调用父类的默认(无参)构造器,如果父类没有无参构造器.,并且在子类构造器中又没有显式调用父类构造器,则java会报错
抽象类
包含一个或多个抽象方法的类本身必须被声明为抽象的,除了抽象方法外,抽象类还可以包含具体数据和具体方法.
抽象方法充当着占位的角色,它们的具体实现在子类中,扩展抽象类有两个方法:
1.抽象类中定义部分抽象方法或不定义抽象类方法,这样就必须将子类也标记为抽象类.
2.定义全部的抽象方法,这样一来,子类就不是抽象的了.
抽象类不能被实例化
受保护访问(protected)
最好在类中的域标记为private,方法标记为public, 任何声明为private的内容对其他类都不可见,
有些时候需要父类中的某些方法或域允许被子类访问,需要将方法或域声明为protected.这样子类就可以访问父类中的方法或域.
Object类
equals方法
object类中的equals方法用来检测一个 对象是否等于另外一个对象,在object类中,这个方法将被判断两个对象是否具有相同的引用, 如果两个对象具有相同的引用,那么他们一定是相等的,
hashCode方法
散列码是由对象导出的一个整列值, 散列码没有规律, 如果x和y是两个不同的对象,x.hashCode()和y.hashCode()基本不会相同,.
由于hashCode方法定义在object类中, 因此每一个对象都有一个默认的散列码,其值为对象的储存地址.
String和StringBuilder的散列码
对象 | 散列码 |
---|---|
s | 2556 |
sb | 20526976 |
t | 2556 |
tb | 20527144 |
字符串s和t有相同的散列码. 是因为字符串的散列码是由内容导出的, 而字符串sb和tb散列码不同, 是因为在StringBuffer类中没有定义hashCode方法, 它的散列码是object默认hashCode方法导出的存储地址.
- 如果重新定义equals方法, 就必须重新定义hashCode方法, 以便用户可以将对象插入到散列表中.
- 如果x.equals(y)返回true, 那么x.hashCode()就必须与y.hashCode()有相同的值, 如果定义Employee.equals比较雇员id, 那么hashCode方法就需要散列id,而不是雇员的姓名或存储地址.
toString方法
用于返回表示对象值的字符串.
object类定义了toString方法, 用来打印输出对象所属的类名和散列码.
在标准类库中, 许多类都定义了toString方法, 建议为自定的每一个类添加toString方法, 不仅自受益, 所有使用这个类的程序员也从中受益.
对象包装器和自动装箱
有时需要将int这样的基本类型转换为对象, 所有基本类型都有一个与之对应的类.
Integer→int,这些类称为包装器(wrapper), 对象包装器类是不可变的, 一旦构造了包装器, 就不允许更改包装器在其中的值, 同时, 对象包装器还是final. 因此不能定义它们的子类.
装箱:int→Integer
拆箱:Integer→int
详细见https://www.cnblogs.com/dolphin0520/p/3780005.html