深入明白Java中的重写和重载

重载(Overloading)和重写(Overriding)是Java中两个对照主要的观点。然则对于新手来说也对照容易混淆。本文通过两个简朴的例子说明晰他们之间的区别。

界说


重载

简朴说,就是函数或者方式有同样的名称,然则参数列表不相同的情形,这样的同名差别参数的函数或者方式之间,相互称之为重载函数或者方式。

重写

重写指的是在Java的子类与父类中有两个名称、参数列表都相同的方式的情形。由于他们具有相同的方式署名,以是子类中的新方式将笼罩父类中原有的方式。

重载 VS 重写


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

1、重载是一个编译期观点、重写是一个运行时代观点。

2、重载遵照所谓“编译期绑定”,即在编译时凭据参数变量的类型判断应该挪用哪个方式。

3、重写遵照所谓“运行期绑定”,即在运行的时刻,凭据引用变量所指向的现实工具的类型来挪用方式

4、由于在编译期已经确定挪用哪个方式,以是重载并不是多态。而重写是多态。重载只是一种语言特征,是一种语法规则,与多态无关,与面向工具也无关。(注:严格来说,重载是编译时多态,即静态多态。然则,Java中提到的多态,在不特别说明的情形下都指动态多态)

重写的例子


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

class Dog{
    public void bark(){
        System.out.println("woof ");
    }
}
class Hound extends Dog{
    public void sniff(){
        System.out.println("sniff ");
    }

    public void bark(){
        System.out.println("bowl");
    }
}

public class OverridingTest{
    public static void main(String [] args){
        Dog dog = new Hound();
        dog.bark();
    }
}

输出效果:

bowl

上面的例子中,dog工具被界说为Dog类型。在编译期,编译器会检查Dog类中是否有可接见的bark()方式,只要其中包罗bark()方式,那么就可以编译通过。在运行期,Hound工具被new出来,并赋值给dog变量,这时,JVM是明确的知道dog变量指向的其实是Hound工具的引用。以是,当dog挪用bark()方式的时刻,就会挪用Hound类中界说的bark()方式。这就是所谓的动态多态性。

重写的条件

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

,

以太坊开奖

www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

,

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

接见级别的限制性一定不能比被重写方式的强;

接见级别的限制性可以比被重写方式的弱;

重写方式一定不能抛出新的检查异常或比被重写的方式声明的检查异常更普遍的检查异常

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

不能重写被标示为final的方式;

若是不能继续一个方式,则不能重写这个方式。

重载的例子


class Dog{
    public void bark(){
        System.out.println("woof ");
    }

    //overloading method
    public void bark(int num){
        for(int i=0; i<num; i++)
            System.out.println("woof ");
    }
}

上面的代码中,界说了两个bark方式,一个是没有参数的bark方式,另外一个是包罗一个int类型参数的bark方式。在编译期,编译期可以凭据方式署名(方式名和参数情形)情形确定哪个方式被挪用。

重载的条件

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

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

被重载的方式可以改变接见修饰符;

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

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