精华内容
下载资源
问答
  • 区分重载方法

    2020-09-14 16:09:58
    区分重载方法:每个重载方法都必须有一个独一无二的参数类型列表。甚至参数顺序的不同也足以区分两个方法,不过一般情况下不这么做,因为会使代码难以维护。 基本类型的重载: 5会被当做int处理,如果有某个重载方法...
    1. 为什么要有重载:
      一个原因:方法名,不需要对每个概念都用不同的词汇
      另一个原因:构造器强制重载方法名。因为构造器的名字一定是类的名字,就只能有一个构造器名。想用多种方式创建一个对象,由于都是构造器,所以他们必须有相同的名字,即类名。而他们的参数不同,必须用到方法重载。
    2. 方法签名:方法名+参数列表
    3. 区分重载方法:每个重载方法都必须有一个独一无二的参数类型列表。甚至参数顺序的不同也足以区分两个方法,不过一般情况下不这么做,因为会使代码难以维护。
    4. 基本类型的重载:
      5会被当做int处理,如果有某个重载方法接受int,就会被调用。如果传入的数据类型(实际参数类型)小于声明的形式参数类型,实际数据类型就会被提升。char:如果找不到接受char参数的方法,char直接被提升到int。
      如果传入的实际参数大于重载方法声明的形式参数,需要类型转换,否则编译器就会报错。
    5. 以返回值区分重载方法?
      void f() {}
      int f() {return 1;}
      
      虽然这样你可以区分,比如这样int x = f()
      但如果这样呢:f()
      Java没有办法判断调用哪一个f(),别人也理解不了。所以根据方法的返回值来区分重载方法是行不通的。
    展开全文
  • java区分重载

    2018-04-18 10:20:24
    java区分重载 区分重载方法: 方法名称相同,但参数的数量不同 方法名称相同,方法参数类型不一样 方法名称相同,但不能根据返回值来判断重载 public class PlainString { private String value; public ...

    java区分重载

    区分重载方法:

    • 方法名称相同,但参数的数量不同
    • 方法名称相同,方法参数类型不一样
    • 方法名称相同,但不能根据返回值来判断重载
    public class PlainString {
    
        private String value;
    
        public PlainString(String value) {
            this.value = value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    
        public void f(){ //重载
    
        }
    
        public void f(int b){ //重载
    
        }
    
        public void f(float b){ //重载
    
        }
    
        public void f(String a, int b){ //重载
    
        }
    
        public void f(int b, String a){ //重载
    
        }
    
        public float f(){ //编译失败!!!,不能根据这种方式重载
    
        }
    
    }
    
    展开全文
  • 区分重载方法的时候,为什么只能以类名和方法的形参列表作为标准呢?能否考虑用方法的返回值来区分呢?比如下面两个方法,虽然他们有同样的名字和形式参数,但却很容易区分他们: void f() {} int f() { return ...

    在区分重载方法的时候,为什么只能以类名和方法的形参列表作为标准呢?能否考虑用方法的返回值来区分呢?比如下面两个方法,虽然他们有同样的名字和形式参数,但却很容易区分他们:

    void f() {}

    int f() { return 1;}

    只要编译器可以根据语境明确判断出语义,比如在int x=f()中,那么的确可以据此区分重载方法。不过,有时你并不关心方法的返回值,你想要的是方法调用的其他效果(这常被称为“为了副作用而调用”),这时你可能会调用方法而忽略其返回值。所以,如果像下面这样调用方法:

    f();

    此时java如何才能判断该调用哪一个f()呢?别人该如何理解这种代码呢?因此,根据方法的返回值来区分重载方法时行不通的。

    展开全文
  • 前言重载(Overloade)重载出现的原因重载的规则区分重载方法重写(Override)重写出现的原因重写的规则子类可以重写父类中访问控制权限为private的方法吗?super.方法()和this.方法()的区别重载和重写的区别小结前言在...

    点击蓝字“程序员考拉”欢迎关注!

    e856e403a96af495c73bbd8e8b1c2551.gif

    • 前言

    • 重载(Overloade)

      • 重载出现的原因

      • 重载的规则

      • 区分重载方法

    • 重写(Override)

      • 重写出现的原因

      • 重写的规则

      • 子类可以重写父类中访问控制权限为private的方法吗?

      • super.方法()和this.方法()的区别

    • 重载和重写的区别

    • 小结

    前言

    在程序设计中经常会遇到对对方法的重载或者重写,下面将介绍重载和重写。

    重载(Overloade)

    重载出现的原因

    任何程序设计语言都具备的一项重要特性就是对名字的运用。当创建一个对象时,就给对象的存储空间取了一个名字。方法名就是给某个动作取的名字。通过使用名字,我们可以引用所有对象和方法。名字起的好可以使程序更易于理解和修改。

    在大多数程序设计语言中要求为每个方法提供唯一的标识符。不能使用print()的函数显示了整数之后,又用一个名为print()的函数显示浮点数。即,每个函数(方法)都要有唯一的名称。这是迫使出现重载方法的理由之一。若是print()函数可以被重载了,那么就既可以输出整数也可以输出浮点数。或者又可以举例:我们要计算两个整数相加,我们可以设计方法为int add(int a, int b)。调用add(10,10)我们就可以知道是计算两个整数相加。此时,我们又想计算两个浮点数相加,因为add见名知意所以我们继续使用这个名字,那么就需要方法double add(double a, double c)。于是,add()方法就被重载了。

    在Java(和C++)里,构造器是强制重载方法出现的另一个原因。构造器的名字由类名决定,那么就只能有一个构造器。但是,又想使用多种方式创建对象又该怎么办呢?那么就只有重载构造器,使得同名不同参的构造器同时存在。

    重载的规则

    方法重载是在一个类里面,方法名相同,而参数不同,对返回值没有强制要求可以相同也可以不同。方法重载需要注意一下几点:

    • 被重载的方法必须改变参数列表(参数个数或者类型不一样)

    • 被重载的方法介意改变返回类型和访问修饰符

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

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

    • 不可以返回值类型作为分区重载函数的标准

    区分重载方法

    每个重载的方法都有独一无二的参数类型列表。所以在区分重载方法时,只能以类名和方法的形参列表作为标准。

    那为什么不能使用方法的返回值来区分呢?

    比如下面两个方法,虽然它们有相同的名字和形式参数,但是却很容易区分它们

    void f(){}
    int f() {return 1;}

    只要编译器可以根据语境明确判断出语义,比如在int x = f()中,那么的确可以根据此区分方法。不过,有时你并不关心方法的返回值,你想要的是方法调用的其他效果,这时你可能会调用方法而忽略返回值。所以,向下面这样的调用方法:

    f();

    此时Java该怎样判断调用的是哪个方法呢?别人也无法理解这个代码的含义。因此,依据方法的返回值来区分重载方法是行不通的。

    重写(Override)

    重写出现的原因

    先看一个例子

    class Animal{
        public void printWhoIAm(){System.out.println("Animal")}
    }
    public class Dog extends Animal{
        public static void main(String args[]){
            Dog dog = new Dog();
            dog.printWhoIAm();
        }
    }
    /*
    output:
    Animal
    */

    当dog调用printWhoIAm()方法时,其实希望的是输出“dog”,而不是Animal。要实现输出“Dog”,想到了重载,可是重载要求被重载的方法具有不同的形参列表。这个方法不得行。dog调用的printWhoIAm()是父类中的,在子类中若是可以重写这个方法,那么就可以实现目的了。于是,重写(覆写)便产生了,为了解决父类方法在子类中不适用,而让子类重写方法的方式。我们解决以上代码需求如下:

    class Animal{
        public void printWhoIAm(){System.out.println("Animal")}
    }
    public class Dog extends Animal{
        //加上注解@Override可以强制进行重写的检查 防止自己重写错误
        @Override
        public void printWhoIAm(){System.out.println("Dog")}
        public static void main(String args[]){
            Dog dog = new Dog();
            dog.printWhoIAm();
        }
    }
    /*
    output:
    Dog
    */

    重写的规则

    • 重写是对父类允许访问的方法的实现过程进行重新编写,返回值不变或者为子类、形参列表不能改变并且访问控制权限不能严于父类。父类为default包访问权限,则子类就为public或者default;若父类是public,则子类必须为public。

    • 子类可以重写父类的除了构造器的任何方法。构造器是和类名相同的,不能被子类继承,因此也不可以被重写。

    • 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如:父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。

    子类可以重写父类中访问控制权限为private的方法吗?

    答案是不可以。父类中的private方法对子类来说是不可见的,就算子类中完全按照重写要求定义方法,也不能算重写父类中的方法,实际上只是子类新增的一个方法。所以,只有非private方法才可以被重写。

    super.方法()和this.方法()的区别

    子类若是重写了父类的方法,那么父类原来的这个方法还可以被调用吗?答案是可以的,使用super对父类的方法进行调用。

    class Animal{
        public void printWhoIAm(){System.out.println("Animal")}
    }
    public class Dog extends Animal{
        //加上注解@Override可以强制进行重写的检查 防止自己重写错误
        @Override
        public void printWhoIAm(){System.out.println("Dog")}
        public void print(){
            super.printWhoIAm();
            printWhoIAm();// this.printWhoIAm();
        }
        public static void main(String args[]){
            Dog dog = new Dog();
            dog.print();
        }
    }
    /*
    output:
    Animal
    Dog
    */

    使用this.方法()会先在本类中查找是否存在要调用的方法,如果不存在则查找父类中是否具备此方法。如果有则调用,否则出现编译时错误。使用super.方法()会明确表示调用父类中的方法,直接去父类寻找要调用的方法。

    重载和重写的区别

    区别重载重写
    参数列表必须改一定不能改
    返回类型可以修改一定不能改
    访问控制权限可以修改不能比父类严格
    异常可以修改可以减少或删除,一定不能抛出新的或者更广的异常
    发生范围可以在一个类中也可以在子类中在子类中

    小结

    需要注意的是重载和重写的定义形式。引用菜鸟教程的两句话和一张图结束。

    • 方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。

    • 方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)

    ea3325fb4bbdc89d19ada30c9db1d89f.png

    原文链接:https://www.cnblogs.com/myworld7/p/10398335.html

    8c62f8d83f7eb51e4118cdb9b2b0e489.png

    展开全文
  • 重载:方法名相同,...返回值类型作为函数运行之后的一个状态,他是保持方法的调用者与被调用者进行通信的关键,并不能作为某个方法的标识,所以通过返回类型并不能区分重载的方法,应该根据所要区分的方法的方法...
  • 但为什么不能根据返回类型来区分重载? 首先重载是Java多态的一种体现,它实现的是编译时的多态。 举个例子: float max(int a, int b); int max(int a, int b); 上面两个方法,别人调用的时候,不要返回值,...
  • 你可能会这么想:“在区分重载方法的时候,为什么只能以类名和方法的形参列表作为标准 呢?能否考虑用方法的返回值来区分呢?”比如下面两个方法,虽然它们有同样的名字和形 式参数,但你却可以很容易地区分它们:...
  • 为什么不能根据返回类型来区分重载? 首先重载是Java多态的一种体现,它实现的是编译时的多态。 举个例子: float max(int a, int b); int max(int a, int b); 上面两个方法,别人调用的时候,不要返回值,直接就是...
  • 读者可能会想:“在区分重载方法的时候,为什么只能以类名和方法的形参列表作为标准呢?能否考虑用方法的返回值来区分呢?”  比如下面两个方法,虽然他们有相同的名字和形式参数,但却很容易区分他们: void f...
  • 中,那么的确可以据此区分重载方法。不过,有时你并不关心方法的返回值,你想要的是方法调用的其他效果(这常被称为“为了副作用而调用”),这时你可能会调用方法而忽略其返回值,所以如果像下面的调用:  fun();...
  • 但为什么不能根据返回类型来区分重载?首先重载是Java多态的一种体现,它实现的是编译时的多态。举个例子: float max(int a, int b); int max(int a, int b);上面两个方法,别人调用的时候,不要返回值,直接就是:...
  • 为什么不能根据方法的返回值类型来区分重载? 说一下个人理解吧,如有不对欢迎大佬指正 声明两个方法 int add(int a,int b); long add(int a,int b); 这两个方法除了返回值以外没有任何不同,调用的时候,假设用...
  • 为什么不能根据返回值区分重载的方法? 例: int f(){ return 1;} void f(){} 假设在你的代码中有一行这样的调用: f(); 此时你并不关心该方法的返回值,那么编译器就不能确定你调用的到底是哪个方法,所以不...
  • 深入 -- 为什么不能根据返回类型来区分重载

    万次阅读 多人点赞 2018-06-27 22:49:23
    但为什么不能根据返回类型来区分重载?首先重载是Java多态的一种体现,它实现的是编译时的多态。举个例子:float max(int a, int b); int max(int a, int b);上面两个方法,别人调用的时候,不要返回值,直接就是:...
  • 为什么不能根据返回 类型来区分重载,为什么? 答:方法的重载,即使返回值类型不同,也不能改变实现功能相同或类似这 一既定事实;同时方法的重载只是要求两同三不同,即在同一个类中,相同的方法名称,参数列表当中的...
  • 重载是类里的,重写是父子类的,根据返回类型是无法区分重载的,只有根据参数类型和参数个数来区分!
  • 5.2.1 区分重载方法

    2014-07-15 11:00:06
    返回值虽然是函数签名的一部分,但不能用于区分函数重载,因为有时候调用函数时并不需要接收和处理返回值,故不能区分不同的函数调用.
  • 内容: 今天复习了C++ ...其实还有一种重载,就是由引用限定来区分重载。 问题引出: 这里有两个排序的函数,准备对类的数据成员进行排序,但是当我们的类对象是左值和是右值时,情况是不一样的,因为如果我们...
  • 详见:四一、方法重载简述任何程序设计语言都具备一项重要特性就是对名字的运用。当创建一个对象时,也就给此对象分配到的存储空间取一个名字。所谓方法,则是给某个动作取的名字。通过这个名字,你可以引用所有的...
  • 函数名重载:给多个不同的函数(参数的类型或个数有所不同)取相同的名字注:如果两个函数的参数类型和个数都相同,知识他们的返回值类型不同,不能对其进行函数名重载,因为函数调用时不能区分调用的是哪个函数。...
  • 为什么不能以返回值区分重载方法

    千次阅读 2011-06-11 16:35:00
    我们现在来讨论一下用返回值来区分重载方法的可行性。比如下面两个方法:void fun();int fun();long fun(); 如果编译器可以根据语境来判断执行哪一个方法的话,那么当 执行 int i = fun(); 的时候,我们很容易判
  • 在java中,重载是其一个非常重要的特性。使用重载,我们就好比是用相同的词表达多种...那么对于以返回值来区分重载方法是否可行呢?比如下面两个方法,虽然他们有同样的名字和形式,但却很容易区分它们: Java代码 v
  • 重载(Overload)是让类以统一的方式处理不同类型数据的一种手段,实质表现就是多个具有不同的参数个数或者类型的同名函数(返回值类型可随意,不能以返回类型作为重载函数的区分标准)同时存在于同一个类中,是一个...
  • 为什么不能根据返回类型区分重载

    万次阅读 多人点赞 2017-04-24 09:36:10
    重载(过载)和重写(覆盖)的区别重载的方法能否根据返回类型进行区分。?答:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名...
  • 函数重载函数重载示例:以下代码演示了文件范围内的 print 函数重载。默认参数不被视为函数类型的一部分。 因此,它不用于选择重载函数。 仅在默认自变量上存在差异的两个函数被视为多个定义而不是重载函数。不能为...
  • 一是它的参数没有类型的区分,二是对参数个数也没有检查。虽然语言层面无法自动进行重载,但借助其动态的特性,我们可以在代码中手动检查入参的类型,或者通过 arguments 获取到参数个数,从而实现根据不同的入参做...

空空如也

空空如也

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

区分重载