重载和重载

超载和重写有什么区别。

超载

重载是指在同一个作用域中有多个方法,名称相同但签名不同。

//Overloading public class test { public void getStuff(int id) {} public void getStuff(string name) {} } 

重写

重写是一个原则,允许您更改子类中方法的function。

 //Overriding public class test { public virtual void getStuff(int id) { //Get stuff default location } } public class test2 : test { public override void getStuff(int id) { //base.getStuff(id); //or - Get stuff new location } } 

简单的定义为重载和重载

重载 (编译时间多态)::具有相同名称和不同参数的函数

 public class A { public void print(int x, int y) { Console.WriteLine("Parent Method"); } } public class B : A { public void child() { Console.WriteLine("Child Method"); } public void print(float x, float y) { Console.WriteLine("Overload child method"); } } 

覆盖 (运行时多态性)::扩展类中的函数具有与基类中相同的名称和相同的参数,但具有不同的行为。

 public class A { public virtual void print() { Console.WriteLine("Parent Method"); } } public class B : A { public void child() { Console.WriteLine("Child Method"); } public override void print() { Console.WriteLine("Overriding child method"); } } 
  • 重载=多个方法签名,方法名称相同
  • 重写=相同的方法签名(声明为虚拟),在子类中实现

一个精明的面试官会跟进:

压倒一切和阴影有什么区别?

我想分享一个在我学习的时候对我很有意义的例子:

这只是一个不包含虚拟方法或基类的例子。 只是提供一个关于主要想法的暗示。

假设有一台洗车机,它有一个称为“洗车”的function,并接受汽车作为一种types。

获取汽车input并清洗汽车。

 public void Wash(Car anyCar){ //wash the car } 

让我们重载Wash()函数

重载:

 public void Wash(Truck anyTruck){ //wash the Truck } 

洗车function只是洗车前,但现在超载洗车也是如此。

  • 如果提供的input对象是一辆汽车,它将执行洗车(汽车anyCar)
  • 如果提供的input对象是卡车,则将执行清洗(Truck anyTruck)

让我们重写Wash()函数

重写:

 public override void Wash(Car anyCar){ //check if the car has already cleaned if(anyCar.Clean){ //wax the car } else{ //wash the car //dry the car //wax the car } } 

清洗function现在有一个条件来检查车是否已经干净,不需要再次清洗。

  • 如果汽车是干净的,那就把它打蜡。

  • 如果不干净,那么先洗车,然后擦干,然后蜡

所以这个function已经被添加一个新的function或完全不同的东西覆盖。

正如迈克尔所说:

  • 重载=多个方法签名,方法名称相同
  • 重写=相同的方法签名(声明为虚拟),在子类中实现

  • Shadowing =如果将其视为DerivedClass,则使用派生方法,如果使用BaseClass,则使用base方法。

拥有多个名称相同但参数不同的方法/构造函数称为重载。 这是一个编译时间事件。

 Class Addition { int add(int a, int b) { return a+b; } int add(int a, int b, int c) { return a+b+c; } public static main (String[] args) { Addition addNum = new Addition(); System.out.println(addNum.add(1,2)); System.out.println(addNum.add(1,2,3)); } } 

O / P:

 3 6 

重写是一个运行时事件,意思是根据你的代码在运行时改变输出。

 class Car { public int topSpeed() { return 200; } } class Ferrari extends Car { public int topSpeed() { return 400; } public static void main(String args[]) { Car car = new Ferrari(); int num= car.topSpeed(); System.out.println("Top speed for this car is: "+num); } } 

注意在两个类topSpeed()中都有一个通用的方法。 由于我们实例化了法拉利,我们得到了不同的结果。

O / P:

 Top speed for this car is: 400 

在C#中没有Java像隐藏覆盖,没有关键字覆盖重写方法! 请参阅这些C#实现:

变体1没有覆盖 :结果是200

  class Car { public int topSpeed() { return 200; } } class Ferrari : Car { public int topSpeed(){ return 400; } } static void Main(string[] args){ Car car = new Ferrari(); int num= car.topSpeed(); Console.WriteLine("Top speed for this car is: "+num); Console.ReadLine(); } 

变体2与覆盖关键字:结果是400

  class Car { public virtual int topSpeed() { return 200; } } class Ferrari : Car { public override int topSpeed(){ return 400; } } static void Main(string[] args){ Car car = new Ferrari(); int num= car.topSpeed(); Console.WriteLine("Top speed for this car is: "+num); Console.ReadLine(); } 

Car类上的关键字virtual在Java上是final的 ,意思是不是最终的 ,如果Car是抽象的,你可以重写或实现

shadowing =在派生类中维护两个定义,以便投影映射(隐藏)派生类定义的基类定义,反之亦然。

还有一点要补充。

重载多个具有相同名称的方法。 相同或不同的返回types。 不同的参数或不同types的参数。 在相同的类或派生类。

int Add(int num1,int num2)int Add(int num1,int num2,int num3)double Add(int num1,int num2)double Add(double num1,double num2)

可以在同一个类或派生类中使用。 一般比较喜欢同一class。 例如Console.WriteLine()有19个重载的方法。

可以重载类的构造函数,方法。

可以考虑为编译时(静态/早期绑定)多态。

================================================== ================================================== =

在同一个class上, 重写是不可能的。 可以覆盖类方法,属性,索引器,事件。

有一些限制,如重写的基本方法必须是虚拟的,抽象的,或重写。 您不能使用新的,静态的或虚拟的修饰符来修改覆盖方法。

可以考虑运行时(dynamic/后期绑定)多态性。

有助于版本化http://msdn.microsoft.com/en-us/library/6fawty39.aspx

================================================== ================================================== =

有用的url

http://msdn.microsoft.com/en-us/library/ms173152.aspx 编译时间多态性与运行时多态性

当我们inheritance基类和派生类时重写,那么如果在派生类中有一个方法与方法(相同名称,相同的参数,相同的返回types)相同的名称在基类中定义,那么它的称为覆盖..

 class Vehicle{ void run() { System.out.println("Vehicle is running"); } } class Bike2 extends Vehicle{ void run() { System.out.println("Bike is running safely"); } public static void main(String args[]){ Bike2 obj = new Bike2(); obj.run(); } 

输出:自行车正在安全运行……..要更清楚地了解覆盖,请访问: http : //javabyroopam.blogspot.in/

重载只是两个名称相同,但参数列表不同的方法称为重载。

 class Calculation{ void sum(int a,int b){System.out.println(a+b);} void sum(int a,int b,int c){System.out.println(a+b+c);} public static void main(String args[]){ Calculation obj=new Calculation(); obj.sum(10,10,10); obj.sum(20,20); } } 

输出30,20

重载是静态多态的一部分,用于实现名称相同但签名不同的不同方法。 重写是用来完成不完整的方法。 在我看来,这两个概念之间没有任何比较,唯一相似的是两个词汇都是一样的。

方法重载和方法重写是完全不同的两个概念。 方法重载具有相同的方法名称,但具有不同的签名。 方法重写正在改变派生类中基类方法的默认实现。 下面你可以find2个优秀的video教程来解释这些概念。

方法重写Vs隐藏

方法重载

重载是一个概念,其中你有相同的签名或方法名称相同,但参数不同和重写,我们有相同的名称方法与不同的参数也有inheritance被称为覆盖