Java中重写和重载的深入浅析

  

Java中重写和重载的深入浅析?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

癑ava中重写和重载的深入浅析"

重载(重载)和重写(覆盖)是Java中两个比较重要的概念。但是对于新手来说也比较容易混淆。本文通过两个简单的例子说明了他们之间的区别。

<强>定义

<强>重载

简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。

<强>重写

重写指的是在Java的子类与父类中有两个名称,参数列表都相同的方法的情况。由于他们具有相同的方法签的名,所以子类中的新方法将覆盖父类中原有的方法。

<强>重载VS重写

关于重载和重写,你应该知道以下几点:

1,重载是一个编译期概念,重写是一个运行期间概念。

2,重载遵循所谓“编译期绑定”,即在编译时根据参数变量的类型判断应该调用哪个方法。

3,重写遵循所谓“运行期绑定”,即在运行的时候,根据引用变量所指向的实际对象的类型来调用方法

4,因为在编译期已经确定调用哪个方法,所以重载并不是多态。而重写是多态。重载只是一种语言特性,是一种语法规则,与多态无关,与面向对象也无关。(注:严格来说,重载是编译时多态,即静态多态。但是,Java中提到的多态,在不特别说明的情况下都指动态多态)

重写的例子

下面是一个重写的例子,看完代码之后不妨猜测一下输出结果:

{类狗
  公共空间树皮(){
  System.out.println(“汪”);
  }
  }
  类猎犬狗{延伸
  公共空闻(){
  System.out.println(“闻“);
  }
  
  公共空间树皮(){
  System.out.println (“bowl");
  }
  }
  
  公开课OverridingTest {
  公共静态void main (String [] args) {
  狗狗=new猎犬();
  dog.bark ();
  }
  }

输出结果:

上碗面的例子中,狗对象被定义为狗类型。在编译期,编译器会检查狗类中是否有可访问的树皮()方法,只要其中包含树皮()方法,那么就可以编译通过。在运行期,猎犬对象被新出来,并赋值给狗变量,这时,JVM是明确的知道狗变量指向的其实是猎犬对象的引用,所以,当狗调用树皮()方法的时候,就会调用猎犬类中定义的树皮()方法。这就是所谓的动态多态性。

重写的条件

参数列表必须完全与被重写方法的相同,

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

访问级别的限制性一定不能比被重写方法的强;

访问级别的限制性可以比被重写方法的弱;

重写方法一定不能抛出新的检查异常或比被重写的方法声明的检查异常更广泛的检查异常

重写的方法能够抛出更少或更有限的异常(也就是说,被重写的方法声明了异常,但重写的方法可以什么也不声明)

不能重写被标示为最终的方法;

如果不能继承一个方法,则不能重写这个方法。

重载的例子

{类狗
  公共空间树皮(){
  System.out.println(“汪”);
  }//重载方法
  公共空间树皮(int num) {
  for (int i=0;i 

上面的代码中,定义了两个树皮方法,一个是没有参数的树皮方法,另外一个是包含一个int类型参数的树皮方法。在编译期,编译期可以根据方法签名(方法名和参数情况)情况确定哪个方法被调用。

重载的条件

被重载的方法必须改变参数列表;

被重载的方法可以改变返回类型;

被重载的方法可以改变访问修饰符;

被重载的方法可以声明新的或更广的检查异常;

方法能够在同一个类中或者在一个子类中被重载。

Java中重写和重载的深入浅析