您的位置 首页 java

Java的重写

一、什么是重写

   在子类中创建了一个与父类中 名称相同、返回值类型相同、参数列表的方法相同,只是方法体中的实现不同 ,以实现不同于父类的功能,这种方式被称为方法重写(override),又称为方法覆盖、方法复写。

二、为什么需要重写

  原有的方法无法满足新的需求,需要对这个方法进行改良来满足新的需求。重写是出现在子类 继承 父类方法中。可以看出,重写就是 子类继承的父类方法无法满足子类的新的功能需求,子类对父类的这个方法进行改良重写的一种方式 子类 可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。

三、重写的条件/规则

  1. 重写只跟非静态方法(成员方法)有关,而与静态方法无关:

静态方法和非静态方法是不一样的:在静态方法中,方法的调用只和左边声明的对象类型有关,而与右边无关,是哪个类型,就调用对应的方法。

同时,静态方法是在idea中无法使用快捷键(Alt+Insert==》选择Overrider Methods)快速的生成重写的方法:

非静态方法:

非静态方法可以由idea创建重写的方法:

   总结:

  • 父类的成员方法只能被它的子类重写。
  • 声明为 static 的方法不能被重写,但是能够再次声明。

  2. 方法名 必须相同;

     返回的类型 必须与被重写的方法的返回类型相同

     参数列表 必须相同;

     修饰符 :范围 可以扩大但不能缩小 :public>Protected>Default;

     抛出的 异常 :范围, 可以被缩小,但不能扩大

子类的方法和父类必要一致;方法体不同!;

  每种动物都有名字和年龄属性,但是喜欢吃的食物是不同的,比如狗喜欢吃骨头、猫喜欢吃鱼等,因此每种动物的介绍方式是不一样的。Dog通过重写Animal的方法来表现狗特有的行为特征。

Animal父类:

 public class Animal {

    public void shout(){

        System.out.println("动物都会叫");

    }

    void move(){

        System.out.println("动物都会走");

    }

    protected void eat(String food){

        System.out.println("动物都会吃食物");

    }

    private void breed(){

        System.out.println("动物需要繁衍");

    }

}  

  Dog子类:

 public class Dog extends Animal{
    @Override
    public void shout() {
        System.out.println("汪汪汪");
    }
 
    @Override
    void move() {
        System.out.println("狗用四只腿跑");
    }
 
    @Override
    protected void eat(String food) {
        System.out.println("啃骨头");
        System.out.println("狗还要吃"+food);
    }
}  

  对类进行实例化:

 public class AnimalTest {
    public static void main(String[] args) {
        Animal a = new Animal();
        //尽管 b 属于 Animal 类型,但是它运行的是 Dog 类的 move方法
        Animal b = new Dog();
 
        a.shout();
        a.move();
        a.eat("水");
        //a.breed();  私有属性,无法在类以外使用
 
        b.shout();
        b.move();
        b.eat("肉");
    }
}  

  在上面的例子中可以看到,尽管 b 属于 Animal 类型,但是它运行的是 Dog 类的方法。 这是由于在编译阶段,只是检查参数的 引用类型 。然而在运行时,Java 虚拟机(JVM)指定对象的类型并且运行该对象的方法。因此在上面的例子中,之所以能编译成功,是因为 Animal 类中存在 move 方法,然而运行时,运行的是特定对象的方法。

以上实例编译运行结果如下

 动物都会叫
动物都会走
动物都会吃食物
汪汪汪
狗用四只腿跑
啃骨头
狗还要吃肉  

四、重写的注意事项

  1. 重写的方法可以使用 @Override 注解来标识。
  2. 构造方法 不能被重写。
  3. 声明为 final 的方法不能被重写。
  4. 子类和父类在同一个包中时,子类可以重写父类除了声明为 private final 方法的其他方法。
  5. 子类和父类不在同一个包中时,子类只能重写父类的声明为 public protected 的非 final 方法。
  6. 如果不能继承一个方法,则不能重写这个方法。重写是在继承的基础上,如果方法无法被继承那么就无法重写

五、super关键字的使用

  当需要在子类中调用父类的被重写方法时,要使用 super 关键字。

 public class Animal {

    public void shout(){

        System.out.println("动物都会叫");

    }

}  

  子类调用父类的shout()方法:

 public class Dog extends Animal{

    @Override

    public void shout() {

        super.shout();

        System.out.println("汪汪汪");

    }

}  

  

 public class AnimalTest {

    public static void main(String[] args) {

        Animal b = new Dog();

        b.shout();

    }

}  

运行结果

 动物都会叫

汪汪汪  

文章来源:智云一二三科技

文章标题:Java的重写

文章地址:https://www.zhihuclub.com/180469.shtml

关于作者: 智云科技

热门文章

网站地图