继承
先使用类图来理一下Pet 父类 和 Dog、Penguin 两个 子类 的关系
可以看到Dog和Penguin一些共有的东西被放进了 Pet类中,而他们各自仍保存了自己独有的属性和方法!这些共有的东西,就可以被看作是Dog类和Penguin类从他们的父类Pet中 继承 的。
使用继承
编写父类
[访问修饰符] class Pet {
//公共的属性和方法
}
1
2
3
编写子类,继承父类
[访问修饰符] class Dog extends Pet {
//子类特有的属性和方法
}
1
2
3
extends 是继承的关键字
知识要点:继承是Java中实现代码重用的重要手段之一;Java中只支持单根继承,即一个类只能有一个直接父类
super的用法
使用super关键字,super代表父类对象
访问父类构造方法:
super();
super(name, gender, ...);
// 在子类构造方法中调用且必须是第一句
1
2
3
访问父类属性:
super.name;
1
访问父类方法:
super.print();
1
注意:不可以访问父类中定义为private的属性和方法
继承条件下构造方法的调用规则
在Java中,一个类的构造方法在如下两种情况总是会被执行:
1.创建该类的对象(实例化)
2.创建该类的子类的对象(子类的实例化)
子类构造方法没有通过super显式调用父类的有参构造方法,也没通过this显式调用自身其他构造方法,系统默认调用父类的无参构造方法
子类构造方法通过super显式调用父类的有参构造方法,执行父类相应构造方法,而不执行父类无参构造方法
子类构造方法通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则
Object类
Object类是所有类的父类。在Java中,所有Java类都直接或间接地继承了java.lang.Object类。在定义一个类时,如果没有使用extends关键字(即无显式继承),则这个类直接继承Object类。
常见的Object类方法
toString(); //返回当前对象本身的有关信息,按字符串对象返回
equals(); //比较两个对象是否是同一个对象,是则返回true
clone(); //生成当前对象的一个副本,并返回
hashCode(); //返回该对象的哈希代码值
getClass(); //获取当前对象所属的类信息,返回Class对象
1
2
3
4
5
方法重写
在子类中可以根据需求对从父类继承的方法进行重新编写,这称为方法的重写或方法的覆盖(Overriding);重写时,可以用super.方法的方式来保留父类的方法;构造方法不能被重写。
方法重写的规则
方法名相同
参数列表相同
返回值类型相同或者是其子类
访问权限不能严于父类
父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法
子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)
父类的私有方法不能被子类覆盖
不能抛出比父类方法更多的异常
方法重写实例
给Object类的equals方法重写
@Override
public boolean equals(Object book){
if (book instanceof Book){
Book book1 = (Book) book;
if (this.getBookId()==book1.getBookId() &&
this.getBookName().equals(book1.getBookName())){
return true;
}
}
return false;
}
//根据需求,只有当两本图书的编号Id和书名Name都相同时,
//两本书才会被判定为重复的书籍,因此改写.