Java重写(用法规则与案例详解)

Java重写(用法规则与案例详解)-mikechen

什么是重写

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

 

为什么需要重写

原有的方法无法满足新的需求,需要对这个方法进行改良来满足新的需求。

重写是出现在子类继承父类方法中,可以看出,重写就是子类继承的父类方法无法满足子类的新的功能需求,子类对父类的这个方法进行改良重写的一种方式。

子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。

 

Java重写规则

  1. 方法名必须相同
  2. 返回的类型必须与被重写的方法的返回类型相同
  3. 参数列表必须相同;
  4. 修饰符:范围可以扩大但不能缩小:public>Protected>Default;
  5. 抛出的异常:范围可以缩小但不能扩大 ClassNotFoundException–>Exception(大);
  6. 子类的方法和父类必要一致;

 

Java重写举例

每种动物都有名字和年龄属性,但是喜欢吃的食物是不同的,比如狗喜欢吃骨头、猫喜欢吃鱼等,因此每种动物的介绍方式是不一样的。

class Animal{
   public void move(){
      System.out.println("动物可以移动");
   }
}
 
class Dog extends Animal{
   public void move(){
      System.out.println("狗可以跑和走");
   }
}
 
public class TestDog{
   public static void main(String args[]){
      Animal a = new Animal(); // Animal 对象
      Animal b = new Dog(); // Dog 对象
 
      a.move();// 执行 Animal 类的方法
 
      b.move();//执行 Dog 类的方法
   }
}

在上面的例子中可以看到,尽管 b 属于 Animal 类型,但是它运行的是 Dog 类的 move方法。

这是由于在编译阶段,只是检查参数的引用类型。

然而在运行时,Java 虚拟机(JVM)指定对象的类型并且运行该对象的方法。

因此在上面的例子中,之所以能编译成功,是因为 Animal 类中存在 move 方法,然而运行时,运行的是特定对象的方法。

 

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重写的注意事项

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

 


        
                  
    

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法