重载和重载
超载和重写有什么区别。
超载
重载是指在同一个作用域中有多个方法,名称相同但签名不同。
//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被称为覆盖