一.重写与重载的区别
具体的重载在我之前的博文有写过,有兴趣的小伙伴可以看一下。
二.方法重写的规则
- 重写方法所在的类要与原方法类为继承关系
- 方法名相同
- 参数列表相同
- 返回值类型相同或是父类返回值的子类
- 访问修饰符不能严于父类
- 抛出的异常不能多余父类
- 父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法
- 子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)
- 父类的私有方法不能被子类覆盖
三.代码示例
-
先创建一个父类并写一个eat方法
-
在创建个狗类继承父类并重写eat方法
-
在创建个猫类不重写方法
-
此时创建一个测试类,分别调用猫的eat方法以及狗类重写后的eat方法
-
结果
四.总结
- 重写方法可以很使子类根据自己的特性来自定义方法内容
五.接招
- 所有没继承父类的类默认继承Object类,尝试着重写object类中的equals与toString两个方法
- 重写toString方法
//创建一个类Pet
public class Pet {//类默认继承Object
public String name;
public String toString(){
return "我的名字叫:"+name;
}
//创建一个测试类
public class Test {
public static void main(String[] args) {
Pet pet=new Pet();//实例化对象pet
pet.name="狗子";
System.out.println(pet.toString());//调用重写后的toString方法
}
}
- 重写equals方法
//创建一个类Pet
public class Pet {//类默认继承Object
public String name;
public boolean equals(Object object){//重写equals方法
if (object instanceof Pet){//instanceof的作用,判断左边的对象是否为右边类的示例(或接口,抽象类,父类)
Pet pet=(Pet) object;//将对象强制转型成Pet类
if (this.name!=null&&this.name.equals(pet.name)){//判断对象的属性name是否与当前类的属性name相同
return true;
}
}
return false;
}
//创建一个测试类
public class Test {
public static void main(String[] args) {
Pet pet=new Pet();
Pet pet1=new Pet();
pet.name="狗子";
pet1.name="狗子";
System.out.println(pet.equals(pet1));//调用对象pet的equals方法,如果pet1与pet的属性name相同,则返回true
}
}