服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - JAVA教程 - Java编程关于子类重写父类方法问题的理解

Java编程关于子类重写父类方法问题的理解

2021-02-14 22:35蝉蝉 JAVA教程

这篇文章主要介绍了Java编程关于子类重写父类方法问题的理解,分享了有关子类重写父类的实例,具有一定参考价值,需要的朋友可以了解下。

子类重新实现父类的方法称重写;重写时可以修改访问权限修饰符和返回值,方法名和参数类型及个数都不可以修改;仅当返回值为类类型时,重写的方法才可以修改返回值类型,且必须是父类方法返回值的子类;要么就不修改,与父类返回值类型相同。那么,该如何理解呢?为什么要是父类返回值类型的子类?

提出问题:子类必须重写父类所有方法吗?

java,子类不是必须重写父类所有方法的,分为以下两种情况:

父类方法为抽象方法时,子类必须重写(实现)所有父类的抽象方法;
父类方法为普通方法时,子类可以重写父类方法,也可以不重写。
举例如下:

?
1
2
3
4
5
6
7
8
9
10
abstract class a{
    public void a(){
    }
    public abstract void b();
}
public class b extends a{
    //必须重写b方法,a方法可以不重写
    public void b(){
    }
}

还是先看示例,详见下文。

包human中定义了三个类,person类、student类和testmain类,其中student类是person类的子类。代码分别如下:

person类的代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
package human;
public class person {
    string name;
    int age;
    //test:重写
    public person override() {
        person per = new person();
        per.name = "liu";
        return per;
    }
}

student类重写了父类的override()方法,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
package human;
public class student extends person {
    string stunumber;
    int score;
    //test:重写
    public student override() {
        student stu = new student();
        stu.name = "li";
        return stu;
    }
}

testmain类的代码如下:

?
1
2
3
4
5
6
7
8
9
10
package human;
public class testmain {
    public static void main(string[] args) {
        student stu = new student();
        person per = new person();
        per = stu.override();
        system.out.println(per.name);
        per = per.override();
        system.out.println(per.name);
    }

输出结果为:

?
1
2
li
li

有没有人跟我一样,第一反应输出应该为“li liu”呢,怎么两个都是“li”?

仔细分析一下,看下面的几张内存图就明白了。

第1、第2条语句分别创建一个子类对象和一个父类对象,其中,stu指向子类对象,per指向父类对象。如下面图1所示:

Java编程关于子类重写父类方法问题的理解

接着执行第3条语句:per = stu.override();;

stu先调用override(),方法体里创建了一个子类对象,并让临时变量stu指向该对象,其存储位置就是以c为首地址的内存块;

然后把该对象的变量name赋值为“li”;最后返回stu的值并赋给per,也就是说,虽然per是父类对象引用,但最后指向了override()里创建的子类对象,这里以蓝色箭头表示; 原先指向的以b为首地址的父类对象这时没有引用指向它,这里把红色箭头变为虚线表示。此时访问per的name,显然是“li”。内存结构见图2:

Java编程关于子类重写父类方法问题的理解

再接着要执行per = per.override();,调用override()方法;

由于子类重写了父类的override()方法,虽然per为父类对象引用,此时父类的该方法被覆盖,所以此时要调用子类的方法;执行过程同上,per不再指向以c为首地址的子类对象,改为指向新创建的子类对象,以d为首地址,如图3所示。

同上面一样的道理,此时访问per的name仍然为“li”,因为父类的override()两次压根都没有被调用到。

Java编程关于子类重写父类方法问题的理解

修改一下testmain,如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package human;
public class testmain {
    public static void main(string[] args) {
        student stu = new student();
        person per = new person();
        person per2 = per;
        //    per = stu.override();
        system.out.println(per.name);
        per = per.override();
        system.out.println(per.name);
        per2 = per2.override();
        //
        system.out.println(per2.name);
        //
    }

此时定义了一个父类对象引用per2,并让它与per指向同一个对象;最后两行,由per2调用override()方法,很显然要调用父类的方法,所以方法体中创建的也是父类的对象,再把结果返回给per2,此时per2指向新创建的父类对象,该父类对象的name就为“liu”了。

说了这么多,貌似还没解决开头的问题,为什么是父类返回值类型的子类?为方便说明,记父类的返回值类型为a。

我的理解是,这是为了向上转型;既然子类重写了父类的方法,有时候就需要用父类对象引用来调用子类重写的方法,在上面例子的情况下,也就是说要把a的子类对象引用赋给a的对象引用,如果此时返回值类型不是a类或a的子类,其他类的对象引用是不能赋给a的对象引用的,这样就会出错;所以说,子类重写的方法,如果返回值为类类型,其返回值类型必须与父类返回值类型相同或为父类返回值类型的子类。

不知道有没有说清楚。

ps:例子选得不是特别好,如果返回值类型是与person和student不相干的类,可能更好理解,不然容易把返回值的类与方法所属的类混淆。

总结

以上就是本文关于java编程关于子类重写父类方法问题的理解的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。

原文链接:http://www.cnblogs.com/chanchan/p/7796472.html

延伸 · 阅读

精彩推荐
  • JAVA教程java实现连接mysql数据库单元测试查询数据的实例代码

    java实现连接mysql数据库单元测试查询数据的实例代码

    下面小编就为大家带来一篇java实现连接mysql数据库单元测试查询数据的实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小...

    jingxian4902020-06-26
  • JAVA教程Java中的Web MVC简介_动力节点Java学院整理

    Java中的Web MVC简介_动力节点Java学院整理

    MVC模型是一种架构型的模式,本身不引入新功能,只是帮助我们将开发的结构组织的更加合理,使展示与模型分离、流程控制逻辑、业务逻辑调用与展示逻...

    动力节点6492020-12-26
  • JAVA教程Java用Cookie限制点赞次数(简版)

    Java用Cookie限制点赞次数(简版)

    最近做了一个项目,其中有项目需求是,要用cookie实现限制点赞次数,特此整理,把实现代码分享给大家供大家学习 ...

    mrr2842020-03-26
  • JAVA教程浅谈Java反射与代理

    浅谈Java反射与代理

    下面小编就为大家带来一篇浅谈Java反射与代理。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    java教程网2662020-05-31
  • JAVA教程java图片压缩工具类

    java图片压缩工具类

    这篇文章主要为大家详细介绍了java图片压缩工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Joker_Ye1722020-08-02
  • JAVA教程详解Java中的JDK、JRE、JVM

    详解Java中的JDK、JRE、JVM

    本文主要介绍了Java中的JDK、JRE、JVM的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧...

    %阳阳羊%3822020-07-30
  • JAVA教程java为移动端写接口开发实例

    java为移动端写接口开发实例

    本篇文章主要介绍了java如何为移动端写接口,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    廖海的博客5092020-12-18
  • JAVA教程spring mybatis多数据源实例详解

    spring mybatis多数据源实例详解

    本文主要介绍sping mybatis多数据源处理,在开发过程中经常会遇到多个数据库,这里给大家举例说明如何处理,希望能帮助有需要的小伙伴 ...

    lqh4102020-05-29