怎么找计算机二级Java真题_计算机二级java有编程题吗

本文详细介绍了Java中子类重写父类方法的规则,包括访问权限、返回值类型等方面的要求。通过示例代码解释了为何重写方法的返回值类型必须是父类返回值类型的子类,以及不重写父类所有方法的情况。通过内存图分析,阐述了如何理解子类对象引用调用重写方法的过程。
摘要由CSDN通过智能技术生成

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

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

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

父类方法为抽象方法时,子类必须重写(实现)所有父类的抽象方法;

父类方法为普通方法时,子类可以重写父类方法,也可以不重写。

举例如下:

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类的代码如下:

package human;

public class Person {

String name;

int age;

//test:重写

public Person overRide() {

Person per = new Person();

per.name = "liu";

return per;

}

}

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

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类的代码如下:

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);

}

输出结果为:

li

li

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

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

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

23cf99b2d7bc7f034b572ac017850339.png

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

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

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

4f6a300a184a55d17665af0720c6e311.png

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

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

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

e5884544c65541e6147015d9991b1d6b.png

修改一下TestMain,如下所示:

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编程关于子类重写父类方法问题的理解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

Java中的静态内部类详解及代码示例

Java源码解析之object类

Java AtomicInteger类的使用方法详解

如有不足之处,欢迎留言指出。

已被899人点赞

二级java 公共基础知识部分30分 专业语言部分 70分 Java语言程序设计 基本要求: 1. 掌握Java语言的特点,实现机制和体系结构。 2. 掌握Java语言中面向对象的特性。 3. 掌握Java语言提供的数据类型和结构。 4. 掌握Java语言编程的基本技术。 5. 会编写Java用户界面程序。 6. 会编写Java简单应用程序。 7. 会编写Java小应用程序(Applet)。 8. 了解Java的应用。 考试内容: 一、 Java语言的特点和实现机制 二、 Java体系结构 1. JDK目录结构。 2. Java的API结构。 3. 开发环境设置。 4. Java程序结构。 三、 Java语言中面向对象的特性。 1. 面向对象编程的基本要领和特征。 2. 类的基本组成和使用。 3. 对象的生成、使用和删除。 4. 接口与包。 5. Java类库中常用类和接口。 四、 Java简单数据类型及运算 1. 变量和常量。 2. 基本数据类型及转换。 3. Java类库中对简单数据类型的类包装。 4. 运算符和表达式运算。 5. 数组和字符串。 五、 Java语言的基本语句 1. 表达式语句。 2. 条件语句。 3. 循环语句。 4. 注释语句。 5. 异常处理。 六、 Java编程技术基础 1. 线程的要领和使用。 2. 同步与共享。 3. 串行化要领和目的。 4. 串行化方法。 5. 串行化的举例。 6. 基于文本的应用。 7. 文件和文件I/O。 8. 汇集(collections)接口。 七、 编写用户界面程序 1. 图形用户界面。 2. AWT库简介。 3. SwingF简介。 4. AWT与Swing比较。 八、 编写小应用程序(Applet) 1. 小应用程序概念。 2. 安全机制。 3. Applet执行过程。 4. Applet的图形绘制。 5. Applet的窗口。 6. Applet的工作环境。 7. Java Application 和Applet。 九、 Java的应用 十、 J2DK的下载和操作。 考试方式: 笔试:90分钟,满分100分,其中含公共基础知识部分的30分。 上机操作:90分钟,满分100分。 上机题目类型要求: (1) 基本操作。 (2) 简单应用。 (3) 综合应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值