精华内容
下载资源
问答
  • 1:重载是指一个类定义多个方法名相同但参数列表不同方法,编译时根据方法参数个数类型来决定绑定哪个方法;重写是指子类定义父类方法签名完全一样方法,程序运行时根据对象类型不同而调用不同...

    1:重载是指一个类中定义多个方法名相同但参数列表不同的方法,在编译时根据方法参数的个数和类型来决定绑定哪个方法;

    重写是指在子类中定义和父类方法签名完全一样的方法,在程序运行时根据对象的类型不同而调用不同的方法。(注意不是对象的引用)

    看如下代码:

    publicclassTest {

    public static void main(String args[]) {

    SuperF obj = new Sub();

    Goo goo = new Goo();

    goo.g(obj);

    }

    }

    class SuperF{

    publicvoidf() {

    System.out.println("Super.f()");

    }

    }

    class Sub extends SuperF{

    publicvoidf() {

    System.out.println("Sub.f()");

    }

    }

    class Goo{

    public void g(SuperF obj) {

    System.out.println("g(SuperF)");

    obj.f();

    }

    public void g(sub obj) {

    System.out.println("g(sub)");

    obj.f();

    }

    }

    结果输出:

    g(SuperF)

    Sub.f()

    2:重载遵循所谓的“编译期绑定”,即在编译期根据参数变量的类型决定该调用哪个方法。上面代码中obj的类型为SuperF,因此Goo的g(SuperF obj)被调用

    重写遵循所谓的“运行期绑定”,即在运行时根据引用指向的实际对象来决定调用哪个方法。上面代码中obj指向的实际对象为Sub类型,因此会调用Sub重写后的f()方法。

    展开全文
  • Java中重载和重写的区别 重载 overloading 1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载是一个类中多态性的一种表现。 2) Java的...

    Java中重载和重写的区别


    重载 overloading
    1) 
    方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载是一个类中多态性的一种表现。
    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();
                //dog.bark("male", "yellow");
                //dog.bark(5, "China");
               
               
    重写overriding
    1) 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。

    2) 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。

    3) 子类函数的访问修饰权限不能少于父类的;

    例子
    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,这是运行时动态绑定的结果。

    总结:重载和重写(覆盖)

    方法的重写
    Overriding和重载OverloadingJava多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,

    将调用子类中的定义,对它而
    言,父类中的定义如同被屏蔽了,而且如果子类的方法名和参数类型和个数都和父类相同,那么子类的返回值类型必须和父类的相同;如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载Overloaded的方法

    是可以改变返回值的类型。也就是说,重载的返回
    值类型可以相同也可以不同。


    附录:动态绑定即调用对象方法的机制

    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)

    展开全文
  • JAVA 中重载和重写的区别

    千次阅读 2017-07-28 23:16:10
    Java中重载和重写的区别这两个知识的用处各不同,初学者容易混淆。 首先,要弄清楚何为重载。方法名相同,参数列表不同的方法,这两个要素要谨记,参数列表不同即参数数据类型、参数数量、参数排列顺序不同。 如:...

    Java中重载重写的区别

    这两个知识的用处各不同,初学者容易混淆。
    首先,要弄清楚何为重载。方法名相同参数列表不同的方法,这两个要素要谨记,参数列表不同即参数数据类型参数数量参数排列顺序不同
    如:void print(int age,String name)和void print(String name,int age)
    重写就是发生在父类子类关系的类中,子类定义了与父类的完全相同的方法,只是方法体不同。注意定义中提到了继承(父类、子类)。所以,还有一个不同之处就是重写不在同一个类中,而重载在同一个类中发生。
    如:
    父类:

        public class Animal{
                String name;
                public void eat(){
                    System.out.println("动物具有吃的能力");
                }
            }
        子类:
    
        public class Cat extends Animal{
                public void eat(){
                    System.out.println("猫喜欢吃鱼");
                }
            }
        `
    
    展开全文
  • 在java中重载是由静态类型确定,在类加载时候即可确定,属于静态分派;而重写由动态类型确定,是在运行时确定,属于动态分派,动态分派是由虚方法表实现,虚方法表中存在着各个方法实际入口地址,如果父类...

    在java中重载是由静态类型确定的,在类加载的时候即可确定,属于静态分派;而重写由动态类型确定,是在运行时确定的,属于动态分派,动态分派是由虚方法表实现的,虚方法表中存在着各个方法的实际入口地址,如果父类中的某个方法子类没有重写,则父类与子类的方法表中的方法地址相同,若重写了,则子类方法表的地址指向重写后的地址。

      一般重写针对与子类继承父类,重写父类的方法,通过动态绑定实现的;而重载是同一个方法名,但是参数类型或个数不同,重载可以理解为是一个类中的多态。

      若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。子类函数的访问修饰权限不能少于父类的。

    转载于:https://my.oschina.net/u/4177395/blog/3086276

    展开全文
  • Java的方法重载,就是可以创建多个方法,它们具有相同名字,但具有不同参数不同定义。调用方法时通过传递给它们不同参数个数参数类型来决定具体使用哪个方法, 这就是多态性。重载的时候,方法名要...
  • 1.重载允许多个同名但是形式参数个数或参数类型不同方法存在同一个类调用时根据形式参数列表来调用对应方法。2.判断(1):方法名必须相同。(2):形式参数个数不同或者参数类型不同(满足其中一个条件就行)。...
  • 一、方法重写(0verride)在Java 程序,类继承关系可以产生一个子类,子类继承父类,它具备了父类所有特征,继承了父类所有方法变量。子类可以定义新特征,当子类需要修改父类一些方法进行扩展,增大...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,293
精华内容 517
关键字:

在java中重载和重写的区别

java 订阅