实验目的:掌握面向对象继承和多态

1. 运行例 4-1 到 4-6。

例 4-1:

JAVA

例 4-2:

JAVA

例 4-3:

JAVA

例 4-4:

JAVA

例 4-5:

JAVA

例 4-6:

JAVA

2. 运行案例 4-1 到 4-3。

案例 4-1:

JAVA

案例 4-2:

JAVA

案例 4-3:

JAVA

3. 问答题

(1)阅读下面的程序(或程序片段),回答问题 。

现有类说明如下:

JAVA
class A {
    int x = 10;
    int GetA() {
        return x;
    }
}

class B extends A {
    int x = 100;
    int GetB() {
        return x;
    }
}

问题:

(1)类 A 与类 B 是什么关系?

类 B 继承 类 A,B 是 A 的子类(派生类),A 是 B 的父类(基类)。

(2)类 B 是否能继承类 A 的属性 x?

能。Java 中子类会继承父类的非私有成员变量和方法,本题中父类 A 的属性 x 没有私有修饰。

(3)若 b 是类 B 的对象,则 b.GetA() 的返回值是什么?

返回值:10。原因:GetA() 是父类 A 的方法,方法中访问的 x 是父类自身的 x,不受子类同名变量影响。

(4)若 b 是类 B 的对象,则 b.GetB() 的返回值是什么?

返回值:100。原因:GetB() 是子类 B 的方法,方法中访问的 x 是子类自身定义的 x。

(5)类 A 和类 B 都定义了 x 属性,这种现象称为什么?

称为属性隐藏(成员变量隐藏):子类定义了和父类同名的成员变量,子类的变量会隐藏父类的同名变量。

子类重新定义了和父类一模一样名字的成员变量,不是覆盖父类的,而是自己另造一个,把父类的那个给 “藏起来” 看不见了。

不是把父类 x 删掉,是两个 x 都存在:

父类空间:x = 10

子类自己空间:x = 100

就近原则:在子类方法里直接写 x,默认用子类自己的。

(2)构造方法在类中的作用是什么?
  • 创建对象时初始化对象的成员变量,为对象赋初始值;

  • 完成对象创建时的必要初始化操作(如资源加载、参数配置);

  • 是创建类对象的必须步骤,new 关键字创建对象时会自动调用构造方法。

(3)在创建派生类的对象的时候,基类与派生类中构造方法的调用顺序怎样?
  • 默认情况下,子类构造方法会自动先调用父类的无参构造方法;

  • 如果父类没有无参构造,子类必须手动通过 super(参数) 调用父类有参构造,且必须放在子类构造方法第一行。

(4)什么是方法的重载?

方法重载:在同一个类中,定义多个方法名相同,但参数列表不同的方法。

重载的核心规则:

  • 方法名必须完全相同;

  • 参数列表必须不同(参数个数、参数类型、参数顺序任意一项不同);

  • 方法的返回值、访问修饰符不影响重载;

  • 编译器根据传入的参数自动匹配调用对应的方法。

4. 编程题

编写一个完整的 Java Application 程序。包含类 Circle,类 Cylinder, 类 Test,具体要求如下:

(1)类 Circle

① 属性

radius:double 型,表示圆的半径。

② 方法

Cirle( double r):构造函数,将半径初始化为 r。

double findArea():返回圆的面积。

double getRadius():返回圆的半径。

(2)类 Cylinder

继承Circle类,并有以下属性和方法:

①属性

length:double 型,表示圆柱体的高。

②方法

Cylinder(double r,double l):构造函数,给圆柱体的半径和高赋初值。

double findVolume():返回圆柱体的体积。

toString():返回圆柱体的半径、高、体积等信息。

(3)主类Test

① 生成 Cylinder 对象。

② 调用对象的 toString 方法,输出对象的描述信息。

评论