Java中重写和覆盖怎么用

发布时间:2021-12-20 11:40:18 作者:小新
来源:亿速云 阅读:195

小编给大家分享一下Java中重写和覆盖怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

关于类的重写和覆盖,我们很容易把他们搞混淆,在Java中jvm会自动帮我们处理这样的问题,但是在c#中咱们也有相关的关键字和处理方式,我们先来研究一下继承关系中构造函数和方法的执行顺序问题。

下面我们来个简单的代码

class A{    public A()    {        Console.WriteLine("这是a构造函数");    }    public void a()    {        Console.WriteLine("这是a方法");    }}class B : A{    public B()    {        Console.WriteLine("这是b构造函数");    }    public void b()    {        Console.WriteLine("这是b方法");    }}
class Program{    static void Main(string[] args)    {        Console.WriteLine("创建父级===============================================");        A a = new A();        Console.WriteLine("创建子级===============================================");        B b = new B();        Console.WriteLine("父级开始调用a方法======================================");        a.a();        Console.WriteLine("子级开始调用b方法======================================");        b.b();        Console.WriteLine("创建一个像父级的子级===================================");        A a1 = new B();        a1.a();        Console.Read();    }}

输出如下

创建父级===============================================这是a构造函数创建子级===============================================这是a构造函数这是b构造函数父级开始调用a方法======================================这是a方法子级开始调用b方法======================================这是b方法创建一个像父级的子级===================================这是a构造函数这是b构造函数这是a方法

我们可以从上面的返回可以知道,在继承关系中,先执行父级的构造函数,然后是子级构造函数,然后再调用方法。

当然这里注意的是,需要一个父类可以给一个子类或者父类实例,但是反过来不可以,这个是我们后面学的多态,或者可以说是里氏代换原则。

覆盖  

覆盖简单的来说就是子类继承父类,同时也继承了不为私有的成员,如果说子类有一个与父类同方法签名的方法,且没有被重写,那么我们在调用这个方法的时候由于父类的方法优先于子类的方法,子类被父类覆盖。

下面我们来看一段代码

class A{    public void a()    {        Console.WriteLine("这是父级a方法");    }}class B : A{    public void a()    {        Console.WriteLine("这是子级a方法");    }}
class Program{    static void Main(string[] args)    {        A a = new B();        a.a();        Console.Read();    }}
这是父级a方法

此时我们看到调用子类的方法时,被父类覆盖了,调用了父级的方法。

这里我们值得注意的是编译器已经出现了一处警告

Java中重写和覆盖怎么用

那么在c#中,new关键字的另一种用法就是消除覆盖的警告

class B : A{    public new void a(){        Console.WriteLine("这是子级a方法");    }}

虽然我们加上这个new并没有改变执行结果,毕竟我们要达到“0 error,0 warning”

那么有些时候,我父级的一个方法就是为了给子类扩展自己这个方法的特别之处,比如鸟类有翅膀,子类的燕子既有翅膀还飞得贼快,子类鸵鸟虽然有翅膀但它不能飞。别人就说所有的鸟都能飞,那么我给一个鸵鸟给他是不是证明了他说的是错误的。

只要能用到父级的地方,我们都能够用他的子类来代替,因为子类包括父类的特征,这个就是我们面向对象原则里面的里氏代换原则。有些时候父级的一些方法不能实现我们想要的效果,那么我们就重写这个父类的这个方法。

重写  

重写也是在父子继承关系中存在的,重写父级的方法用关键字virtual标记父级的方法,表示这个方法是一个虚方法(有些地方叫虚函数,都差不多),在子级用override重写父级标记的方法,这两个关键字是一起使用的。如果父级virtual标记了但是子级没有使用override重写,那是没有效果的,下面看代码:

class A{    public virtual void a()    {        Console.WriteLine("这是父级a方法");    }}class B : A{    public override void a()    {        Console.WriteLine("这是重写父级a方法");    }}class Program{    static void Main(string[] args)    {        A a = new B();        a.a();    }}
这是重写父级a方法

我们区分重写和覆盖,它真的非常重要,重写是面向对象中一个非常重要的基础。

总结:

覆盖:使用父类创建子类,由于父类的方法先执行,所有子类的方法被覆盖,使用关键字new来消除编译器的警告。

重写:父类的方法需要用virtual标记为虚方法,子类使用override重写父类的虚方法。使用父类对象创建一个子类对象代替,子类方法重写父类方法,每个子类都不一样,我们要灵活使用

以上是“Java中重写和覆盖怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

推荐阅读:
  1. C#中重载重写和覆盖的定义与区别
  2. Java如何重写equals和hashcode

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:如何在iOS 14中修改iPhone充电提示音

下一篇:paramiko 2.4.1源码如何安装

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》