实验4 继承、多态、抽象类、接口

更新时间:2023-09-17 04:31:01 阅读量: 高中教育 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验4 继承、多态、抽象类、接口

注意:有些程序由于Word的关系,复制后,tab缩位可能会变成其它符号。需要你去调整一下,删除缩位,重新Tab

一、实验目的 ................................................................................................................................... 1 二、实验要求 ................................................................................................................................... 1 三、实验内容 ................................................................................................................................... 2

1. 类的继承与覆盖练习 .......................................................................................................... 2

1.0 父类的哪些成员可以被继承? .............................................................................. 2 1.1 父类Student(学生)与子类HiStudent(大学生) ............................................ 2 1.2 实例方法为什么需要覆盖 ...................................................................................... 4 1.3 验证成员方法的覆盖方式 ...................................................................................... 5 1.4 this、super和super()的使用 .................................................................................. 6 1.5 变量、静态方法的隐藏。 ...................................................................................... 9 1.6 隐藏与覆盖的综合性实例 ................................................................................. 10 2. 类的多态性练习 ................................................................................................................ 11

2.1 普通方法的重载(实验3,本实验略) ............................................................. 11 2.2 构造方法的重载(实验3,本实验略) ............................................................. 11 2.3 运行时多态与动态绑定 ........................................................................................ 11 3. 抽象类 ................................................................................................................................ 13 4. 接口 .................................................................................................................................... 15

一、实验目的

通过编程和上机实验理解Java语言的面向对象特性,了解类的继承性和多态性的作用,掌握它们的实现方法,了解数据域和静态方法的隐藏,了解抽象类和接口的作用。

二、实验要求

1、 编写体现类的继承性(成员变量、成员方法、成员变量隐藏)的程序; 2、 编写体现类的多态性的程序; 3、 编写体现抽象类和接口功能的程序。

三、实验内容

1. 类的继承与覆盖练习

例如,圆是一种形状。圆类Circle是形状类Shape的子类。父类也叫基类、超类,

子类也叫次类、扩展类、派生类。子类可从父类中产生,保留父类的成员变量和方法,并可根据需要对它们加以修改。新类还可添加新的变量和方法。这种现象就称为类的继承。

当建立一个父类时,不必写出全部成员变量和成员方法。只要简单地声明这个类是从一个已定义的类继承下来的,就可以引用被继承类的全部成员。

Java 提供了一个庞大的类库让开发人员继承和使用。设计这些类是出于公用的目的,因此,很少有某个类恰恰满足你的需要。你必须设计自己的能处理实际问题的类,如果你设计的这个类仅仅实现了继承,和父类一样,那样没什么用。所以,通常要对父类进行扩展,即添加新的属性和方法。这使得子类要比父类大,但更具特殊性,代表着一组更具体的对象。继承的意义就在于此。

1.0 父类的哪些成员可以被继承?

可以访问的成员才能被继承。 具体分2种情况:

* 当父类和子类在同一个包时,子类可以继承父类中的public/protected/无修饰 级别的变量和方法;

* 当父类和子类不在同一个包时,且父类是public的,那么子类可以继承父类的public/protected 级别的变量和方法。如果父类前没有public,那么子类无法访问父类,更谈不上继承的问题。

1.1 父类Student(学生)与子类HiStudent(大学生)

(1) Student.java程序源代码如下。 public class Student //学生类 {

}

protected String xm; //姓名 protected int xh; //学号

void setData(String m,int h) //设置姓名和学号 { }

public void print() //输出姓名和学号 { }

System.out.println(xm+\xm =m; xh = h;

(2) HiStudent.java的描述和代码如下

程序功能:通过Student类产生子类HiStudent,其不仅具有父类的成员变量xm(姓名)、xh(学号),还定义了新成员变量xy(学院)、xi(系)。在程序中调用了父类的print方法,同时可以看出子类也具有该方法。 程序源代码如下

public class HiStudent extends Student{ //大学生类继承自学生类

protected String xy;//所在学院或大学名称 protected String xi;//所在系的名称 public static void main(String args[]){

Student s1 = new Student(); s1.setdata(\李四\s1.print();

HiStudent s2 = new HiStudent() ;

s2.setdata(\张三\调用父类的成员方法 s2.xy=\大学\访问本类的成员变量 s2.xi=\计算机系\访问本类的成员变量

s2.print();//调用父类的方法,就象调用它自己的一样 System.out.print(s2.xm+\

}

}

(3)编译并运行,结果如下图所示。

1.2 实例方法为什么需要覆盖

上例中,s2.print();语句调用父类的方法,只能输出父类的数据(姓名和学号)。如果想用函数输出姓名、学号、学院、系,需要在子类中另外添加一个函数。如果这个函数也叫print(),(嗯,这样好记),并且如果形参、返回类型都一样,并且其可见性修饰符和父类print()方法的一样甚至更开放,并且它们都不是静态的,并且它所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类,或者什么也不抛出,那么,我们可以说子类的print()方法覆盖(override)了父类的print()方法。子类中添加的print()可以这样写:

public void print() //输出姓名、学号、学院、系 { }

可见,子类的覆盖方法重写(修改)了父类的被覆盖方法。实现了不同的功能。当然,父类的被覆盖方法仍然存在,在子类中可以用super.print()来引用。

嗯,如果参数不一样,那也叫重载。如果返回类型不一样,或者一个静态一个非静

System.out.println(xm+\

态,或者子类方法的开放性比父类被覆盖方法的更低,都会编译错。如果两个方法其它一样,又都是静态的,这没问题,叫做隐藏,而非覆盖。另外,父类中用final修饰的方法不能被覆盖。

再重复一下方法覆盖的概念:如果在子类中定义一个方法,其名称、返回类型及参数签名正好与父类中某个方法的名称、返回类型及参数签名相匹配,那么可以说,子类的方法覆盖了父类的方法。 覆盖的说明:

? ? ? ? ?

子类的方法名称返回类型及参数签名 必须与父类的一致 子类方法不能缩小父类方法的访问权限 子类方法不能抛出比父类方法更多的异常

方法覆盖只存在于子类和父类之间,同一个类中只能重载 父类的静态方法不能被子类覆盖为非静态方法

? ? ? ? ? ?

子类可以定义于父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法(满足覆盖约束),

Java虚拟机把静态方法和所属的类绑定,而把实例方法和所属的实例绑定。

父类的非静态方法不能被子类覆盖为静态方法 父类的私有方法不能被子类覆盖

父类的抽象方法可以被子类通过两种途径覆盖(即实现和覆盖) 父类的非抽象方法可以被覆盖为抽象方法

1.3 验证成员方法的覆盖方式

方法覆盖为子类提供了修改父类实例方法的能力。例如,Object类的toString方法返回的字符串是“类名@随机码”这样的。子类可以修改层层继承下来的Object 根类的toString 方法,让它输出一些更有用的信息。下面的程序显示了在子类Circle 中添加toString 方法,用来返回圆半径和圆面积信息。

(1) 编写Circle类,覆盖Object 类的toString方法,Circle类和Test类源代码如下。 class Circle {

private int radius; Circle(int r) { }

public void setRadius(int r) { }

public int getRadius() { }

public double area() { }

public String toString() {//覆盖继承自Object的toString()方法

return Math.PI*radius*radius; return radius; radius=r; setRadius(r);

本文来源:https://www.bwwdw.com/article/etoh.html

Top