重写只与方法有关,与属性没有关系。

一、 方法重写的概念

方法的重写指的是在继承关系中,子类定义一个方法名返回值(八大基本数据类型)和参数列表都和父类一样的方法,而这个方法内的方法体可以跟父类不一样,用以实现不一样的功能。可以这么理解,方法重写就是子类方法对父类原方法的覆盖

值得注意的是,方法重写,从jdk 1.5开始,返回值类型不再要求是相同类型,放宽了这个限制,被重写的方法的返回值类型可以是其父类的子类。如:
class A{
    public Object test(){
    return;
  }
}

class B extends A{
    public String test(){ //重写中,返回父类的子类数据类型
        return;
    }
}

二、方法重写注意事项:

1. 必须是非静态方法,静态方法不叫重写

也就是说,方法的定义中,修饰符不能是private,方法的重写只能出现在非静态方法中

前面提过,static静态方法跟随类加载而加载,创建对象是在类加载之后发生的

所以哪个类的对象就调用哪个类的静态方法,与后面赋值(地址引用无关),静态方法与重写无关。如:
// Animal.java(父类)
package com.zctou.oop.demo06;

public class Animal {

    public static void run(){
        System.out.println("动物在走!");
    }
}

// Dog.java(子类)
package com.zctou.oop.demo06;

public class Dog extends Animal{

    public static void run() {
        System.out.println("小狗在跑!");
    }
}

//Application.java
package com.zctou.oop;
import com.zctou.oop.demo06.Animal;
import com.zctou.oop.demo06.Dog;

public class Application {

    public static void main(String[] args) {
        Animal animal = new Dog(); //声明父类变量,创建子类对象并赋值
        Dog dog = new Dog(); //声明子类变量,创建子类对象并赋值

        animal.run();
        dog.run();

    }
}

//输出:
动物在走!
小狗在跑!
*可以看出,以上示例中,子类静态方法虽然与父类方法名,返回值,参数列表都一至,但并不能算方法重写。看下图,强行给静态方法加@Override, IDEA会报错,说不是重写其父类方法。

Java面向对象编程11 - 方法的重写

2. 重写只能存在继承关系中

方法重写就是对父类方法的覆盖,所以没有继承就没有方法重写这一说法,只有子类能重写父类。

3. 注意方法重写与方法重载的区别

  • 方法重写与方法重载不一样,重载是方法名必须一样,要参数列表必定不一样,修饰符和返回值不作要求。

    而方法重写的方法名,参数列表,必须一样。返回值都必须是其(父类或父类的其他子类)的数据类型,除了修饰符,全方位覆盖。

  • 方法重写的修饰符,权限只能从小变大=> public , protected, default, private, private 不能被继承,也就不能被重写。
  • 方法重写的抛出的异常范围:只能从大范围到小范围。 ClassNotFoundException -> Exception.
  • 方法重写一般带关键定@Override

    方法定义方法重写方法重载
    修饰符权限(低 --> 高)不作要求
    返回类型与父(类或父类的其他子类)数据类型相同不作要求
    访问参数列表必须不一样必须与父类一样
    静态方法(static)必须不能是带static不作要求
    异常可删减,不能抛出范围更大的异常不作要求

三、 重写的意义:

父类的功能不一定能满足子类的需求,或者父类包含的信息方法太广。 而当子类需要修改父类的一些方法,进而实现功能扩展,或者抛弃父类的一些功能,这时候方法重写的意义就出现了。

PS:

IDEA中,快捷批量重写方法的快捷键是:Alt + Insert ==>选择override。
文章目录