【问题标题】:Java overloading and overridingJava重载和覆盖
【发布时间】:2022-01-10 08:51:36
【问题描述】:

假设我在一个类中有两个方法说

public void eat(int i,String s)

public void eat(String s, int i)

那么它是什么样的。重载还是覆盖?

【问题讨论】:

标签: java oop


【解决方案1】:

重载意味着两个或多个具有相同名称但具有不同参数的方法,就像您的示例一样。重载时,您从接口或抽象类实现方法,因此超类中的方法具有实现,而子类中的方法具有不同的一个,它们仍然具有相同的方法名称和参数。

【讨论】:

    【解决方案2】:

    那就是方法重载,因为它满足方法重载的条件:

    • 必须有不同的参数列表
    • 可能有不同的返回类型,如果 参数列表也不同
    • 可能有不同的访问修饰符
    • 可能会引发不同的异常

    只有在涉及继承时才会发生覆盖。由于您的两个方法都在同一个类中,因此不能被覆盖。

    【讨论】:

      【解决方案3】:

      这是超载。当您为相同的方法签名提供不同的实现时,将在继承中使用覆盖。

      【讨论】:

        【解决方案4】:

        那是超载。简而言之:
        覆盖 = 替换
        重载 = 提供更多选择

        【讨论】:

          【解决方案5】:

          方法重载仅仅意​​味着在一个类中提供两个不同的方法,名称相同但参数不同,而方法返回类型可能不同也可能不同,这允许我们重用相同的方法名称。 p>

          方法覆盖是指在子类中定义一个方法,该方法已经在父类中定义,具有相同的方法签名,即相同的名称、参数和返回类型。

          方法重载和方法覆盖的区别

          更多详情可以阅读Everything About Method Overloading Vs Method Overriding

          【讨论】:

          【解决方案6】:

          一种关于重载和覆盖的规则:

          1. 构造函数可以重载但不能被覆盖。
          2. 抽象方法必须被第一个具体子类覆盖。
          3. 重写方法:
            • 必须有相同的参数列表,
            • 必须具有相同的返回类型(也可以是父类的返回类型的子类,
            • 不得有限制性更强的访问修饰符,
            • 可能有一个限制较少的访问修饰符,
            • 不得抛出新的或更广泛的检查异常,
            • 可能会抛出更少或更窄的已检查异常,或任何未经检查的异常。
          4. final 方法不能被覆盖。
          5. 只有继承的方法可以被覆盖,记住私有方法不能被继承。
          6. 在子类中使用:super.overriddenMethodName() 调用超类的重写方法。
          7. 重载方法:
            • 必须有不同的参数列表,
            • 可能有不同的返回类型,如果参数列表也不同,
            • 可能有不同的访问修饰符,
            • 可能会引发不同的异常。
          8. 超类中的方法可以在子类中重载。
          9. 多态适用于覆盖,但不适用于重载。
          10. 对象类型(不是引用变量的类型)决定了在运行时使用哪个被覆盖的方法。
          11. 引用类型确定在编译时将使用哪个重载方法。

          *摘自 Kathy Seirra、Bert Bates 的 Sun Certified Programmer for Java 6 Study Guide。

          【讨论】:

            【解决方案7】:

            重载:在Java中,重载是一个过程,其中一个类通过区分没有参数或参数类型来包含方法或构造函数的多个实现。

            public class TestDemo
            {
            public void disp(String c)
            {
            System.out.println(c);
            }
            public void disp(String c, int n)
            {
                System.out.println(c+" "+n);
            }   }
            class Sample
            {
            
            public static void main(String[] args) 
            {
                // TODO Auto-generated method stub  
                TestDemo obj=new TestDemo();
                obj.disp("a");
                obj.disp("a",2);
            }}

            Overriding :这里的方法可以覆盖。它必须发生在两个班级内。一个是父母,另一个是孩子。在这个父类的同名同签名方法中。

            public class TestDemo
            {
            public void eat()
            {
            System.out.println("Human is Eating");
            }
            }
            class Overriding extends TestDemo
            {
            public void eat()
            {
            System.out.println("Human is Eating");
            }
            public static void main(String[] args)
            {
            Overriding obj=new Overriding();
            obj.eat();
            }
            }

            更多知识请点击此链接:https://arzatechs.com/overloading-and-overriding-in-java/

            【讨论】:

              【解决方案8】:

              过载:

              • 在同一个类中有两个或多个同名但参数不同的方法。和你的问题情况一样。

                public void eat(int i,String s)

                public void eat(String s, int i)

              因此,在您的情况下,它是方法重载。

              覆盖:

              • 覆盖意味着拥有两个具有相同方法名称和参数(即方法签名)的方法。其中一种方法在父类中,另一种在子类中。

              例如

              class Animal{  
                 void eat(){System.out.println("eating...");}  
              }  
              
              class Dog extends Animal{  
                 void eat(){System.out.println("eating bread...");}  
              } 
              

              【讨论】:

                【解决方案9】:

                在这种特定情况下,它是重载

                让我们稍微区分一下这两个术语:

                重载(函数名相同但签名不同):

                • 两个或多个具有同名但参数不同的方法 同一班。
                • 当您想要扩展类功能时使用重载。
                • 重载是一种编译时多态性。

                覆盖(具有相同签名的相同函数):

                • 父类和子类中的两个或多个方法具有相同的方法名称和相同的参数
                • 当您想要重用现有功能时,使用覆盖。
                • 覆盖是一种运行时多态性。

                访问以了解有关overloading and overriding 的更多信息。

                【讨论】:

                  【解决方案10】:

                  属性 ------------------- 重载 -------------------- 覆盖

                  方法名称 -------------->必须相同--------> 必须相同

                  参数类型------------------>必须不同(至少 arg)---->必须相同(包括顺序)

                  方法签名----------->必须不同(至少arg)---->必须相同(包括顺序)

                  返回类型---------------->无限制----------------->无限制

                  Private,Static,Final------->无限制-------------------->必须相同

                  访问修改器------------>无限制--------相同

                  try/Catch----------------->无限制--------抛出异常

                  方法解析-------->编译器时间(参考)--------(JVM)运行时多态

                  【讨论】:

                    猜你喜欢
                    • 2013-04-05
                    • 2012-05-21
                    • 2016-02-08
                    • 2010-10-24
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多