实验4 继承、多态、抽象类、接口
更新时间:2023-09-17 04:31:01 阅读量: 高中教育 文档下载
- 实验4推荐度:
- 相关推荐
实验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);
正在阅读:
实验4 继承、多态、抽象类、接口09-17
安全管理资料-公司管理流程图(1)106-11
今日基督徒普遍的可怜的光景01-26
实验5 IO03-13
2018年物流大学生实习报告3000字03-21
2013北师大版四年级上学期数学期末试卷06-11
科振实业钢结构厂房施工方案 - 图文04-18
党员批评与自我批评优秀讲话稿2022年最新精编多篇08-03
炎德英才大联考·师大附中届高三考试卷(一)理科数学04-08
中英文成绩单08-15
- 上海大众、一汽大众、东风日产车型与VIN代号对照表
- 第2章服装原型及原型制作
- 江苏省工商行政管理系统经济户口管理办法及四项制度
- 纪检监察业务知识试题2
- 传感器综合题答案
- 北京第二外国语学院翻硕招生人数及学费
- 初三新编英语教材下册
- 公司庆中秋、迎国庆联欢会客串词
- 向区委常委会汇报安全生产工作材料
- 2006年GCT英语模拟试题(三)及答案解析
- 经济法概念的早期使用
- 我爱做家务课堂教学设计
- 学校安全工作月报表、消防安全排查表、消防隐患排查台账
- 成本会计毕业论文
- 班级文化建设论文
- 2018年天津市高考文科试题与答案汇总(Word版) - 图文
- 铁路论文
- 2017年嵌入式系统设计师考试时间及地点
- 1.111--灾害与突发公共卫生事件应急预案
- 起爆点主图 注意买入 拉升 逃顶源码指标通达信指标公式源码
- 多态
- 抽象
- 继承
- 接口
- 实验