重载和重写

    面向对象的三大特性:继承、封装、多态。重载和重写是多态的两种表现形式。

    重载和重写又有什么区别呢?

    1、层次不同:

    重写 :    发生在父类和子类之间。

    是子类重写父类的方法,具有相同的方法名和方法参数。比如说,父子两人都去吃饭(相同的方法),吃的是面条(参数),父亲饭量大,吃两碗,儿子饭量小,就能吃一碗(实现了吃饭的多态)。

    重载:   发生在同一个类当中。

    同一个类当中相同的方法名,不同的参数,而且必须是不同的参数或者不同的方法返回值(如果两个函数仅返回值不同,那么它不能重载,必须要有参数不同才可以)。这里的方法参数不同包括:参数个数、类型、对应位置不同,至少要有三种情况中的任何一种不同才可。举个例子:父亲跟其他的同事在同一个工地打工(同一个类),中午下工后大家都去吃饭(相同的方法名),但是有的人喜欢吃面条、有的人喜欢吃油条(参数类型不同),同样吃面条,有的人吃两碗,有的人吃一碗(参数个数不同),监工吃完饭后跟老板去KTV了,而苦命的打工仔,吃晚饭还要去工地继续搬砖(不同的返回值),当然了老板不会每天叫你去KTV,吃完饭后大家都去休息,也可以是相同的返回值,只是不同的人吃下去的饭是有差别的(吃的数量、吃的东西)。

     2、代码中的不同

 

重写:

 

     MustInherit关键字声明一个抽象类

     抽象类中MustOverride关键字声明一个必须重写的方法

    子类中Overrides 关键字的两层含义:   

         指明某方法重写了父类的方法 

         这个方法可以在它的子类中被隐式重写

    子类中Overridable关键字声明可以被重写的函数

     NotOverridable 指明该方法不可被重写

下面看一下,给网上找的一段相关代码:

'MustInherit关键字声明一个抽象类
Public MustInherit Class People
    'MustOverride关键字声明一个必须重写的吃饭方法
    Public MustOverride Sub Eat(ByVal foodName As String, ByVal num As Integer)
End Class 

  

'声明一个父亲类,继承自People类
Public Class Father : Inherits People
    '这里必须要重写People类的吃饭方法,Overrides关键字会自动生成。
    'Overrides 关键字的两层含义:
    '1、它重写了抽象父类People的Eat(抽象)方法
    '2、这个方法可以在它的子类中被隐式重写,因此它不包含overridable关键字
    Public Overrides Sub Eat(ByVal foodName As String, ByVal num As Integer)
        Console.WriteLine("父亲吃{0},他可以吃{1}碗!", foodName, num)
    End Sub
    ' Overridable关键字声明一个可以被重写的函数
    Public Overridable Function GetByName() As String
        Return "父亲"
    End Function
    '声明另外一个方法,用来说明子类中使用NotOverridable
    Public Overridable Sub ShowMyFatherClass()
        Console.WriteLine("我的父类是People")
    End Sub
End Class


 

Public Class Son : Inherits Father
    '因为Father类中没有用mustoverride 关键字生命的方法,所以,继承的子类不会自动添加父类中的方法
    '要想重写父类中的方法,这里就需要手动实现。

    '子类重写父类的Eat方法
    '做两点说明:
    '抽象类的抽象方法只需要在其直接子类中强制实现,不用在其他子类中(包括孙类)中实现
    Public Overrides Sub Eat(ByVal foodName As String, ByVal num As Integer)
        Console.WriteLine("孩子吃{0},他能吃{1}碗", foodName, num)
    End Sub


    '重写父类Father中定义的GetByName方法
    Public Overrides Function GetByName() As String
        '如果要实现父类的实现过程,则使用MyBase关键字
        'Return MyBase.GetByName()
        Return "孩子"
    End Function

    '重写Father类中的ShowMyFatherClass方法(Overrides关键字指明),但是如果Son类,还有子类的话,子类不可以重写该方法(NotOverridable关键字说明)。
    Public NotOverridable Overrides Sub ShowMyFatherClass()
        MyBase.ShowMyFatherClass()
    End Sub


End Class


 

重载:

 

    重载的代码规定相对比较容易,做几点说明:

    1、同一个类中,如果一组同名的方法、函数可加关键字Overloads 也可不加,但是这一组的函数、方法格式应该保持一致

    2、如果该方法是重载父类中的方法,那么必须加上关键字Overloads

    3、如果两个同名函数仅返回值类型不同,那么他们不能重载,必须要在参数上有所不同

 

 

 

### 三级标题:面向对象编程中重载重写的区别 在面向对象编程中,**重载(Overload)****重写(Override)**是两个核心概念,它们分别作用于不同的上下文,并具有显著的区别。 #### 定义范围 重载发生在**同一个类**中,允许存在多个同名方法,但这些方法的参数列表不同。而重写则发生在**继承关系**中,子类可以重新定义父类中的方法[^1]。 #### 参数要求 重载要求方法的**参数列表必须不同**,可以是参数类型、数量或顺序的差异。例如,`sum(int a, int b)` 与 `sum(double x, double y)` 是两个重载方法。而重写要求**参数列表必须完全相同**,包括参数的类型、数量顺序[^2]。 #### 返回类型 在重载中,方法的**返回类型可以不同**,只要参数列表不同即可。而在重载中,返回类型不是区分方法的依据。对于重写来说,子类方法的返回类型必须**兼容父类方法的返回类型**,即支持协变返回类型(covariant return types)[^3]。 #### 访问权限 重载允许**自由修改访问修饰符**,即可以在不同访问权限下定义重载方法。而重写时,子类方法的访问权限**不能比父类方法更严格**。例如,如果父类方法是 `protected`,则子类不能将其改为 `private`。 #### 多态表现 重载是**编译时多态**的体现,即方法的绑定发生在编译阶段。而重写是**运行时多态**的基础,方法的绑定发生在运行时,根据对象的实际类型来决定调用哪个方法[^2]。 #### 其他特性 值得注意的是,**final、static abstract** 方法都可以被重载,但只有非 `private` 的方法可以被重写。例如,一个 `final` 方法可以在同一个类中被重载,但不能在子类中被重写[^4]。 ```java public abstract class Demo { // 静态方法可以重载 public static void testA() {} public void testA(int a) {} // final方法可以重载 public final void testB() {} public void testB(int b) {} // 抽象方法可以重载 public abstract void testC(); public void testC(int c) {} } ``` ### 三级标题:总结 重载重写分别体现了面向对象编程中的**静态多态****动态多态**机制。重载通过参数的不同来区分方法,适用于同一类中的功能相似但输入不同的场景;而重写则通过继承机制实现方法的覆盖,支持子类对父类行为的扩展修改。理解它们的差异对于掌握面向对象编程的核心思想至关重要[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值