实验:类的继承、抽象类、接口.doc
文本预览下载声明
实验: 类的继承、抽象类、接口
一、课后习题(思考、简要回答、举例)
1、 什么是继承?什么是父类?什么是子类?继承的特性可给面向对象编程带来
什么好处?什么是单重继承?什么是多重继承?
2、 “子类的域和方法的数目一定大于等于父类的域和方法的数目”,这种说法是否
正确?为什么?
3、什么是方法的覆盖?方法的覆盖与域的隐藏有何不同?与方法的重载有何不同?
4、 什么是多态?面向对象程序设计为什么要引人多态的特性?使用多态有什么优点?
5、 父类对象与子类对象相互转化的条件是什么?如何实现它们的相互转化?
6、什么是包?它的作用是什么?
7、 一个类如何实现接口?实现某接口的类是否一定要重载该接口中的所有抽象
方法?
二、基本实验
1. 进一步理解继承的含义
新类可从现有的类中产生,并保留现有类的成员变量和方法并可根据需要对它们加以修改。新类还可添加新的变量和方法。这种现象就称为类的继承。
当建立一个新类时,不必写出全部成员变量和成员方法。只要简单地声明这个类是从一个已定义的类继承下来的,就可以引用被继承类的全部成员。被继承的类称为父类或超类(superclass),这个新类称为子类。
Java 提供了一个庞大的类库让开发人员继承和使用。设计这些类是出于公用的目的,因此,很少有某个类恰恰满足你的需要。你必须设计自己的能处理实际问题的类,如果你设计的这个类仅仅实现了继承,则和父类毫无两样。所以,通常要对子类进行扩展,即添加新的属性和方法。这使得子类要比父类大,但更具特殊性,代表着一组更具体的对象。继承的意义就在于此。
2. 创建公共类test
(1)编写程序文件test.java,源代码如下。
public class test
{
protected String xm; //具有保护修饰符的成员变量
protected int xh;
void setdata(String m,int h) //设置数据的方法
{
xm =m;
xh = h;
}
public void print() //输出数据的方法
{
System.out.println(xm+, +xh);
}
}
3.创建继承的类
(1)程序功能:通过test 类产生子类subtest,其不仅具有父类的成员变量xm(姓名)、xh(学号),还定义了新成员变量xy(学院)、xi(系)。在程序中调用了父类的print 方法,同时可以看出子类也具有该方法。
(2)编写subtest.java 程序,源代码如下。
class test extends subtest{
protected String xy;
protected String xi;
public static void main(String args[])
{
test p1 = new test();
p1.setdata(zhang,12321) ;
p1.print();
subtest s1 = new subtest() ;
s1.setdata(郭丽娜,12345); //调用的成员方法是哪个类的?
s1.xy=信息工程学院; //访问的成员变量是哪个类的?
s1.xi=软件工程系; //访问的成员变量是哪个类的?
s1.print();
System.out.print(s1.xm+, +s1.xy+, +s1.xi);
}
}
3.了解成员变量的隐藏方式
所谓隐藏是指子类重新定义了父类中的同名变量,请定义Point类和Line类,在子类Line 中重新定义x,y,隐藏父类Point 中的两个成员变量x 和y。并编写测试程序验证子类执行自己的方法时,操作的是子类的变量,子类执行父类的方法时,操作的是父类的变量。给出执行结果和自己的解释。并通过本实验注意:
在子类中要特别注意成员变量的命名,防止无意中隐藏了父类的关键成员变量,这有可能给程序带来麻烦。
4.了解成员方法的覆盖方式
(1)方法覆盖的定义与作用
通过继承子类可以继承父类中所有可以被子类访问的成员方法,但如果子类的方法与父类方法同名,则不能继承,此时称子类的方法覆盖了父类的方法,简称为方法覆盖(override)。方法覆盖为子类提供了修改父类成员方法的能力。例如,子类可以修改层层继承下来的Object 根类的toString 方法,让它输出一些更有用的信息。下面的程序显示了在子类Circle 中添加toString 方法,用来返回圆半径和圆面积信息。
(2)编写覆盖Object 类toString 方法的程序文件LX.java,源代码如下。
class Circle {
private int radius;
Circle(int r) {
setRadius(r);
}
public void setRadius(int
显示全部