目录
方法的重写或方法的覆盖(overriding)
子类根据需求对从父类继承的方法进行重新编写
重写时,可以用super.方法的方式来保留父类的方法
构造方法不能被重写
方法重写规则
方法名相同
参数列表相同
返回值类型相同或者是其子类
访问权限不能严于父类
父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法 子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)
父类的私有方法不能被子类覆盖
不能抛出比父类方法更多的异常
方法重写vs方法重载
比较项 | 位置 | 方法名 | 参数表 | 返回值 | 访问修饰符 |
方法重写 | 子类 | 相同 | 相同 | 相同或是其子类 | 不能比父类更严格 |
方法重载 | 同类 | 相同 | 不相同 | 无关 | 无关 |
Object类被子类经常重写的方法
方法 | 说明 |
toString() | 返回当前对象本身的有关信息,按字符串对象返回 |
equals() | 比较两个对象是否是同一个对象,是则返回true |
hashCode() | 返回该对象的哈希代码值 |
getClass() | 获取当前对象所属的类信息,返回Class对象 |
equals()方法与操作符==
Object类的equals()方法比较两个对象是否是同一个对象,是则返回true
操作符== 简单数据类型,直接比较值。如1==2 ,引用类型,比较两者是否为同一对象
(1)Object类的equals()方法与==没区别
(2)当有特殊需求,如认为属性相同即为同一对象时,需要重写equals()
(3)Java.lang.String重写了equals()方法,把equals()方法的判断变为了判断其值
代码示例:
package cn.bdqn.demo01;
public class Cat extends Pet {
// 定义Cat类独有的属性
private String color;
public Cat() {
super();// 调用父类Pet类里的无参构造方法
}
public Cat(String name, int health, int love, String color) {
super(name, health, love);
this.color = color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
//在Cat类中重写了Pet类中的print方法
public void print(){
super.print();
System.out.println("宠物颜色:"+this.getColor());
}
}
package cn.bdqn.demo01;
public class Penguin extends Pet {
// 定义Penguin类里独有的属性
private String sex;
public Penguin() {
super();// super表示父类Pet对象,所以这个地方表示调用父类的无参构造方法
}
public Penguin(String name, int health, int love, String sex) {
super(name, health, love);// 表示调用父类Pet类的有参构造方法
this.sex = sex;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public void print() {
super.print();
System.out.println("宠物性别:"+this.getSex());
}
}
package cn.bdqn.demo01;
public class Pet {
private String name;
private int health;
private int love;
// 添加构造方法
public Pet() {
}
public Pet(String name, int health, int love) {
this.name = name;
this.health = health;
this.love = love;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public void print() {
System.out.println("宠物信息:昵称:" + this.getName() + ",健康值:"
+ this.getHealth() + ",亲密度:" + this.getLove());
}
}
package cn.bdqn.demo01;
public class Test {
public static void main(String[] args) {
//创建子类对象
Cat cat = new Cat("Tom", 99, 80, "灰色");
cat.print();
Dog dog = new Dog("来福", 100, 99, "藏獒");
dog.print();
Penguin penguin = new Penguin("QQ", 99, 98, "公");
penguin.print();
/*
* 各个子类对象是可以通过调用父类中的print()方法来输出子类对象的信息
* 但是父类中的print()只能输出相同的属性信息(昵称、健康值、亲密度)
* 不能输出每个子类中独有的信息,从而说明父类里的print()方法不能够满足子类对象的使用
* 此时需要对父类中的print()方法进行升级(方法重写)
*
* 重写的特点:
* 1)在子类中重写
* 2)方法名相同
* 3)参数列表相同
* 4)重写后的方法返回值类型与父类相同或者是其子类
* 5)访问权限修饰符不能严于父类
*
*
*/
}
}
* 重写的特点:
* 1)在子类中重写
* 2)方法名相同
* 3)参数列表相同
* 4)重写后的方法返回值类型与父类相同或者是其子类
* 5)访问权限修饰符不能严于父类