继承(inheritance),人们可以利用继承在已经存在的类的基础上创造新类,既可使用超类的方法和域,也可以在此基础上修改或者添加新的方法或者添加新的域,满足新的需求。
设计技巧
- 将公共操作和域放在超类。
- 不要使用受保护的域。
- 使用继承实现“is-a”关系。
- 除非所有继承的方法都有意义,否则不要使用继承。
- 在覆盖方法时不要改变预期的行为。
- 使用多态,而非类信息。
public class Parent {
private String name;
private Integer age;
public Parent(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
}
public class Child extends Parent{
private String School;
public Child(String name,Integer age,String School) {
//简写形式
/*
子类的构造器不能够访问超类的私有域,必须通过super关键字实现对超类
构造器的调用。对于超类没有参数的构造器,如果子类没有显式的调用,那
么子类在创建对象时将自动的调用。对于含参的构造器如果子类没有显式的
调用,那么在编译时就会报错。
*/
super(name,age);
this.School = School;
}
}
public class ChildTest {
Child child = new Child("Bob",22,"JIALIDUN");
//不需要强制转换
Parent parent = child;
//需要强制转换
Child child1 = (Child) parent;
}
扩展抽象类的两种选择:
- 在抽象类中定义部分抽象类的方法或者不定义抽象类方法,这样就必须将子类也标记为抽象类。
- 定义全部的抽象方法,子类就不是抽象类了。
要看子类是否完全实现了超类中的全部抽象方法,如果没有完全实现的话,那么该子类必须被声明为抽象类。
java中每个类都是由Object扩展而来,并且在创建类时不需要显式指出某个类继承于超类,默认继承于超类。可以使用Object类型的变量引用任何类型的对象,Object类型的变量只能用于作为各种值通用持有者,要想对其中的内容进行具体的操作还需要清楚对象的原始类型,并进行响应的类型转换。
equals方法
equals方法通过判断两个对象是否有相同的引用来检测一个对象是否等于另外一个对象。
基本判断的步骤:
1.显式参数命名为otherObj,
2.检测this与otherObj是否引用同一个对象,
3.检测otherObj是否为一个null对象,
4.比较this和otherObj是否属于同一个类,利用getClass()函数进行检测,如果所有的语义都相同,就是有instanceof进行检测,
5.将otherObj转换为相应的类类型变量,
6.对所有的域进行比较。
如果在子类中重新定义了equals方法,就需要先调用超类中的equals方法。
要求:
1.自反性:对于任何非空的引用,x.equals(x)返回true。
2.对称性:x.equals(y)和y.equals(x)返回一致(交换律)。
3.传递性:x和y相等,y和z相等,那么x和z也相等。
4.一致性:x和y引用的对象没有发生变化,x.equals(y)应该返回同样的结果。
5.对于任意非空引用x,x.equals(null)为false。
疑问:在进行所属类的比较时,getClass()和instanceof如何判断使用哪个。。。
书上的原话:如果子类能够拥有自己的相等概念,则对称性需求将强制采用getClass进行检测,如果由超类决定相等的概念,那么就可以使用instanceof进行检测,这样可以在不同子类的对象之间进行比较。
下面给出代码实例:
public boolean equals(Object otherObj){
//首先对传入的对象引用与this引用进行判断,如果引用同一个对象,则直接返回true。
if(this == otherObj)
return true;
//如果传入的参数为null必须要返回false
if(otherObj == null)
return false;
//然后判断两个是否属于同一个类,此处应该使用否定来判断,以便进行判断之后的逻辑
if(getClass()!=otherObj.getClass())
return false;
//将传入的参数强制转换为本类型的引用
ClassName other = (ClassName)otherObj;
//利用逻辑与运算逐个判断参数是否一致,所有参数都一致的话,返回true
return field1 == other.field1 && Objects.equals(field2,other.field2) && ...;
}
hashCode方法
hashCode方法定义在Object中,每个对象都从object中继承到一个hashCode方法,其值为对象储存的地址。如果两个对象相等,则二者的hashCode应该也相等,前提是保证equals方法在被重写的同时hashCode也被重写。而二者的hashCode相等,并不一定表示两个对象就相等。hashCode是用来查找使用的,而equals是用来比较相等的。
2025 - 快车库 - 我的知识库 重庆启连科技有限公司 渝ICP备16002641号-10
企客连连 表单助手 企服开发 榜单123