重写和重载的区别
重载的条件: 1.必须在同一个类中2.方法名必须相同3.参数列表不能相同。 重写的条件: 1. 在不同的类中 2. 发生方法重写的两个方法返回值,方法名,参数列表必须完全一致 3. 子类抛出的异常不能超过父类相应的方法抛出的异常 4. 子类方法的访问级别不能低于父类相应方法的访问级别(public,package,protected, private) 5.方法体不同 super()调用父类构造,super.只能调用父类的实例方法 this()调用该类的其他构造方法,this.调用类的属性,方法 如果父类有有参构造,子类必须定义构造方法 ### 重写与重载的区别 #### 一、概述 在面向对象编程中,方法的重写(Overriding)和重载(Overloading)是非常重要的概念。这两种机制可以帮助程序员更灵活地管理和组织代码,提高代码的复用性和可扩展性。 #### 二、重载(Overloading) **定义:** 重载指的是在一个类中定义多个同名方法,但这些方法的参数列表有所不同(参数的数量、类型或者顺序不同)。重载允许程序员在同一类中定义多个功能相似但细节有所不同的方法,这些方法可以通过方法签名(即方法名加上参数列表)的不同来进行区分。 **特点:** 1. **同一类内**:重载发生在同一个类中。 2. **方法名相同**:所有被重载的方法名称必须完全一致。 3. **参数列表不同**:重载的方法之间参数列表必须不相同,包括参数的数量、类型或顺序上的差异。 4. **返回类型可不同**:虽然通常情况下返回类型不影响方法的重载判断,但在某些语言(如C#)中,仅改变返回类型而不改变参数列表是不被允许的,这会导致编译错误。 **示例代码**: ```csharp class OverLoadTest { public void Hello() { } public void Hello(string str) { } // C# 不允许仅通过返回类型来实现重载 // public string Hello() { } } ``` #### 三、重写(Overriding) **定义:** 重写是指子类重新定义父类中的方法,以便提供特定于子类的行为。子类可以通过覆盖父类的方法来实现自己的逻辑。为了支持重写,父类的方法通常会被声明为`virtual`、`abstract`或`override`。 **特点:** 1. **不同类间**:重写发生在继承关系中,即子类重写父类的方法。 2. **方法签名完全相同**:子类重写的方法与父类中对应的方法必须具有相同的返回类型、方法名和参数列表。 3. **异常限制**:子类重写的方法抛出的异常不能比父类方法抛出的异常更加广泛。 4. **访问级别**:子类重写的方法的访问级别不能低于父类方法的访问级别。 5. **方法体不同**:子类方法的具体实现可以不同于父类。 **示例代码**: ```csharp class OverWriteTest { public virtual void Hello() { Console.WriteLine("hello"); } } class OverWriteTestTT : OverWriteTest { public override void Hello() { Console.WriteLine("No hello world"); } } class OverWriteTestTTT : OverWriteTestTT { public override void Hello() { base.Hello(); Console.WriteLine("No No hello world"); } } ``` 在这个例子中,`OverWriteTestTT`和`OverWriteTestTTT`都重写了`OverWriteTest`中的`Hello()`方法,实现了不同的行为。 #### 四、总结 - **重载**强调的是在同一个类中定义多个同名方法,这些方法通过不同的参数列表来区分。 - **重写**则是在继承关系中,子类对父类中方法的重新定义,以适应子类特有的需求。 了解并正确应用这两个概念对于编写高效、易维护的面向对象程序至关重要。