当前位置:首页 > 服务端 > Java中的重写

Java中的重写

以下内容引用自http://wiki.jikexueyuan.com/project/java/overriding.html

如果一个类从它的父类继承了一个方法,如果这个方法没有被标记为final ,就可以对这个方法进行重写。

重写的好处是:能够定义特定于子类类型的行为,这意味着子类能够基于要求来实现父类的方法。

在面向对象编程中,覆盖方法意味着去重写已经存在的方法。

示例:

来看以下的例子:

class Animal{

   public void move(){
      System.out.println("Animals can move");
   }
}

class Dog extends Animal{

   public void move(){
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog{

   public static void main(String args[]){
      Animal a = new Animal(); // Animal reference and object
      Animal b = new Dog(); // Animal reference but Dog object

      a.move();// runs the method in Animal class

      b.move();//Runs the method in Dog class
   }
}
//这将产生如下结果:
Animals can move
Dogs can walk and run

在上面的例子中,可以看到尽管b是Animal类型,但它运行了dog类的方法。原因是:在编译时会检查引用类型。然而,在运行时,JVM会判定对象类型到底属于哪一个对象。

因此,在上面的例子中,虽然Animal有move方法,程序会正常编译。在运行时,会运行特定对象的方法。

考虑下面的例子:

class Animal{

   public void move(){
      System.out.println("Animals can move");
   }
}

class Dog extends Animal{

   public void move(){
      System.out.println("Dogs can walk and run");
   }
   public void bark(){
      System.out.println("Dogs can bark");
   }
}

public class TestDog{

   public static void main(String args[]){
      Animal a = new Animal(); // Animal reference and object
      Animal b = new Dog(); // Animal reference but Dog object

      a.move();// runs the method in Animal class
      b.move();//Runs the method in Dog class
      b.bark();
   }
}
//这将产生如下结果:
TestDog.java:30: cannot find symbol
symbol  : method bark()
location: class Animal
                b.bark();

这个程序在编译时将抛出一个错误,因为b的引用类型Animal没有一个名字叫bark的方法。

一、方法重写规则

  • 重写方法的参数列表应该与原方法完全相同。
  • 返回值类型应该和原方法的返回值类型一样或者是它在父类定义时的子类型。
  • 重写函数访问级别限制不能比原函数高。举个例子:如果父类方法声明为公有的,那么子类中的重写方法不能是私有的或是保护的。
  • 只有被子类继承时,方法才能被重写。
  • 方法定义为final,将导致不能被重写。
  • 一个方法被定义为static,将使其不能被重写,但是可以重新声明。
  • 一个方法不能被继承,那么也不能被重写。
  • 和父类在一个包中的子类能够重写任何没有被声明为private和final的父类方法。
  • 和父类不在同一个包中的子类只能重写non-final方法或被声明为public或protected的方法。
  • 一个重写方法能够抛出任何运行时异常,不管被重写方法是否抛出异常。然而重写方法不应该抛出比被重写方法声明的更新更广泛的已检查异常。重写方法能够抛出比被重写方法更窄或更少的异常。
  • 构造函数不能重写。

二、使用super关键字

当调用父类的被重写的方法时,要用关键字super。

class Animal{

   public void move(){
      System.out.println("Animals can move");
   }
}

class Dog extends Animal{

   public void move(){
      super.move(); // invokes the super class method
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog{

   public static void main(String args[]){

      Animal b = new Dog(); // Animal reference but Dog object
      b.move(); //Runs the method in Dog class

   }
}
//这将产生如下结果:
Animals can move
Dogs can walk and run

 

测试工程:https://github.com/easonjim/5_java_example/tree/master/javabasicstest/test18

作者:EasonJim
来源链接:https://www.cnblogs.com/EasonJim/p/6935738.html

版权声明:
1、Java侠(https://www.javaxia.com)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaxia.com/server/125019.html

分享给朋友:

“Java中的重写” 的相关文章

[C#]richtextbox实现拖放2022年05月17日 20:25:47
[C#]richtextbox实现行号2022年05月17日 20:27:54
linux yum命令详解2022年05月19日 19:54:29
centos7中 yum的安装2022年05月19日 19:54:29
枚举法 之Java实现凑硬币2022年05月21日 11:37:17
信息系统合同管理2022年05月24日 22:14:31
设计模式-桥接模式2022年06月04日 20:58:35
大明对日志的经验总结2022年06月12日 14:15:37