Java重载和覆盖

时间:2010-10-03 06:07:19

标签: java oop

假设我在课堂上有两种方法说

public void eat(int i,String s)

public void eat(String s, int i)

那么它是什么样的。超载或覆盖?

10 个答案:

答案 0 :(得分:12)

重载意味着两个或多个具有相同名称但具有不同参数的方法,就像您的示例一样。重写您从接口或抽象类实现方法,以便超类中的方法具有实现,并且在子类中有一个不同的,他们仍然有相同的方法名称和参数。

答案 1 :(得分:7)

这将是方法重载,因为它满足方法重载的条件:

  • 必须有不同的参数列表
  • 可能有不同的退货类型,如果 参数列表也不同
  • 可能有不同的访问修饰符
  • 可能会抛出不同的例外

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

答案 2 :(得分:6)

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

  1. 构造函数可以重载但不会被覆盖。
  2. 抽象方法必须由第一个具体子类覆盖。
  3. 最重要的方法:
    • 必须具有相同的参数列表,
    • 必须具有相同的返回类型(它也可以是父类的'返回类型的子类,
    • 必须没有更严格的访问修饰符,
    • 可能具有限制较少的访问修饰符,
    • 不得抛出新的或更广泛的已检查例外,
    • 可能会抛出更少或更窄的已检查异常或任何未经检查的异常。
  4. 无法覆盖
  5. 最终方法。
  6. 只能重写继承的方法,并记住不会继承私有方法。
  7. 在子类中使用: super.overriddenMethodName()来调用超类'重写方法。
  8. 重载方法:
    • 必须有不同的参数列表,
    • 可能有不同的返回类型,如果参数列表也不同,
    • 可能有不同的访问修饰符,
    • 可能会抛出不同的例外情况。
  9. 超类中的方法可以在子类中重载。
  10. 多态性适用于覆盖但不适用于重载。
  11. 对象类型(不是引用变量的类型)确定在运行时使用哪个重写方法。
  12. 引用类型确定在编译时将使用哪个重载方法。
  13. *取自Kathy Seirra,Bert Bates的Sun认证程序员Java 6学习指南。

答案 5 :(得分:2)

方法重载只是意味着在类中提供两个具有相同名称但不同参数的单独方法,而方法返回类型可能会有所不同,也可能不同,这使我们可以重用相同的方法名称。

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

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

Difference Between Method Overloading and Method Overriding

有关详细信息,请参阅Everything About Method Overloading Vs Method Overriding

答案 6 :(得分:1)

重载:在 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 :这里方法可以被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/

答案 7 :(得分:0)

属性------------------- OverLoading --------------------覆盖

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

Arg类型------------------>必须是不同的(至少arg)---->必须相同(包括订单)

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

退货类型---------------->无限制------------------->无限制

私人,静态,最终------->无限制-------------------->必须相同

访问Modifyer ------------>无限制--------------------相同

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

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

答案 8 :(得分:0)

过载:

  • 在同一类中具有相同名称但参数不同的两个或多个方法。与您的问题情况相同。

    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 :(得分:0)

在这种情况下,它是超载

让我们对这两个术语进行一些区分:

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

  • 两个或更多个方法,其中名称相同但参数不同 同一班。
  • 要扩展类功能时使用重载。
  • 重载是一种编译时多态性。

覆盖(具有相同签名的相同功能):

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

enter image description here

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