`
包涵
  • 浏览: 35825 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Java中重载(overload)和重写(override)的区别

    博客分类:
  • OOP
阅读更多
重载(overload):重载构成的条件:方法的名称相同,但参数类型或参数个数不同,才能构成方法的重载。

重写(override)在子类中定义一个与父类同名、返回类型、参数类型均相同一个方法,称为方法的覆盖。
覆盖发生在子类与父类之间。通常应用于多态中。




首先我们来讲讲:

一、重载(Overloading)
    (1)       方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时
    存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。
    (2)       Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具
    有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型
    来决定具体使用哪个方法, 这就是多态性。
    (3)       重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同
    也可以不相同。无法以返回型别作为重载函数的区分标准。
    下面是重载的例子:
    package c04.answer;//这是包名
    //这是这个程序的第一种编程方法,在main方法中先创建一个Dog类实例,然后在Dog类的构造方法中利用this关键字调用不同的bark方法。不同的重载方法bark是根据其参数类型的不同而区分的。

    //注意:除构造器以外,编译器禁止在其他任何地方中调用构造器。
    package c04.answer;

    public class Dog {
         Dog()
         {
                this.bark();
         }
         void bark()//bark()方法是重载方法
         {
                System.out.println(/"no barking!/");
                this.bark(/"female/", 3.4);
         }
         void bark(String m,double l)//注意:重载的方法的返回值都是一样的,
         {
                System.out.println(/"a barking dog!/");
                this.bark(5, /"China/");
         }
         void bark(int a,String n)//不能以返回值区分重载方法,而只能以“参数类型”和“类名”来区分
         {
                System.out.println(/"a howling dog/");
         }

         public static void main(String[] args)
         {
                Dog dog = new Dog();
                //dog.bark(); [Page]
                //dog.bark(/"male/", /"yellow/");
                //dog.bark(5, /"China/");


二、 重写(Overriding)
    (1)    父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某

    方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,
    子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不
    动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又
    称方法覆盖。
    (2)    若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,
    则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键
    字引用了当前类的父类。
    (3)    子类函数的访问修饰权限不能少于父类的;
    下面是重写的例子:


    概念:即调用对象方法的机制。

    动态绑定的内幕:

    1、编译器检查对象声明的类型和方法名,从而获取所有候选方法。试着把上例Base
    类的test注释掉,这时再编译就无法通过。

    2、重载决策:编译器检查方法调用的参数类型,从上述候选方法选出唯一的那一个
    (其间会有隐含类型转化)。如果编译器找到多于一个或者没找到,此时编译器就会
    报错。试着把上例Base类的test(byte b)注释掉,这时运行结果是1 1。

    3、若方法类型为priavte static final ,java采用静态编译,编译器会准确知道该调用哪
    个方法。

    4、当程序运行并且使用动态绑定来调用一个方法时,那么虚拟机必须调用对象的实
    际类型相匹配的方法版本。在例子中,b所指向的实际类型是TestOverriding,所以
    b.test(0)调用子类的test。但是,子类并没有重写test(byte b),所以b.test((byte)0)调用
    的是父类的test(byte b)。如果把父类的(byte b)注释掉,则通过第二步隐含类型转化为
    int,最终调用的是子类的test(int i)。



学习总结:多态性是面向对象编程的一种特性,和方法无关,
     简单说,就是同样的一个方法能够根据输入数据的不同,做出不同的处理,即方法的
    重载——有不同的参数列表(静态多态性)

      而当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你
    就要覆盖父类方法,即在子类中重写该方法——相同参数,不同实现(动态多态性)

      OOP三大特性:继承,多态,封装。 [Page]

    public class Base
    {
        void test(int i)
        {
            System.out.print(i);
        }
        void test(byte b)
        {
            System.out.print(b);
        }
    }
    public class TestOverriding extends Base
    {
        void test(int i)
        {
            i++;
            System.out.println(i);
        }
          public static void main(String[]agrs)
        {
            Base b=new TestOverriding();
            b.test(0)
            b.test((byte)0)
        }
    }
    这时的输出结果是1     0,这是运行时动态绑定的结果。

分享到:
评论

相关推荐

    重写(override)和重载(overload)的区别

    C#中方法的重写(override)和重载(overload)的区别

    Java重写(Override)&重载(Overload).pdf

    Java面向对象编程中的重写(override)指的是子类可以重写其父类中的非private方法,使得子类在调用该方法时会使用自己的实现而不是父类的实现。 重写(Override)讲解 定义一个名为 Animal 的父类和一个名为 Cat 的...

    java 重载(overload)与重写(override)详解及实例

    主要介绍了java 重载(overload)与重写(override)详解及实例的相关资料,并附实例代码,需要的朋友可以参考下

    Java重写(Override)与重载(Overload)区别原理解析

    主要介绍了Java重写(Override)与重载(Overload)区别原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java重载和重写的区别--源码实例

    // 不能Override父类中的方法,因为它定义了不同的异常类型和 // 返回值。 //public int fun() throws TestException1 { // System.out.println("method fun in Test"); // return 1; //} // 不能Override...

    Java 重写(Override)与重载(Overload).pdf

    java

    Java overload和override的区别分析

    方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现,想要了解更多请参考本

    PHP中overload与override的区别

    override(重写,覆盖) 1、方法名、参数、返回值相同...方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现。 重写(Overriding)是父类与子类之间多态性的一种表现,而重载(Overloading)是一个类中多态

    C++中overload,override,overwrite的区别详细解析

    Overload(重载):在C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型、顺序不同),即函数重载。(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;...

    Java复习大纲面试题.doc

    方法重载与方法重写的区别? 方法重载(Overload):是指方法名字相同,参数的个数、类型、次序不同。 方法重写(Override/Overwrite):是指子类重写了从父类继承过来的方法。 区别:方法重载没有继承、属于一种静态联编...

    java面试题

    Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?  方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一...

    java笔试题

    20、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分? 21、描述一下JVM加载class文件的原理机制? 22、char 型变量中能不能存贮一个中文汉字,为什么? 23、抽象类(abstract class...

    java 接口 类 继承 多态的简单实例

    实现重载(overload)和重写(override) 调用中用到多态,向上转换,强制转换 所有被创建的类,都各自创建两个实现接口 最底层的类中创建内部类,并在外部类中调用内部类的方法

    SCJP考试题集 有详细解析

    方法重写发生在类继承时,子类可以重写一个父类中已有的方法,必须在返回类型和参数列表一样时才能说是重写,否则就是重载,java中方 法重写的一个重要而且容易被忽略的规则是重写的方法的访问权限不能比被重写的...

    JAVA基础课程讲义

    方法的重载(overload),构造方法的重载 63 this关键字 65 static 关键字 66 静态初始化块(经常用来初始化类,加载类信息时执行!) 67 package 68 JDK中的主要包 68 import 68 eclipse的使用 69 继承(extend, ...

    Java面试宝典2020修订版V1.0.1.doc

    13、Overload和Override的区别。 16 14、构造器可不可以被重载或重写? 16 15、Java中有没有多继承? 16 16、抽象类和接口的区别? 17 17、java中实现多态的机制是什么? 17 19、String和StringBuffer的区别?...

    PHP重载基础知识回顾

    先区分一下重载(overload)和重写(override):重载指多个名字相同,但参数不同的函数在同一作用域并存的现象;重写出现在继承中,指子类重定义父类功能的现象,也被称为覆盖。重载中说的参数不同有三种情况:参数个...

    java 面试题 总结

    14、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一...

    JAVA面试题最全集

    9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能存在的错误,并说明原因: 二、JSP&Servlet技术 1.描述JSP和Servlet的区别、共同点、各自应用的范围 2.在Web开发中...

Global site tag (gtag.js) - Google Analytics