Java语言程序设计教程(第二版)翁 凯 肖少拥 王行言-第6章--继承与多态

内容发布更新时间 : 2024/5/17 13:39:10星期一 下面是文章的全部内容请认真阅读。

第6章 继承与多态

思考题与习题

一、概念思考题

1.父类和子类之间的关系是怎样的? 解答:

是继承关系,子类继承父类。有public,protected,private三种继承方式。

2.继承如何支持了软件重用? 解答:

在继承中,新的类是基于一个已经存在的基础雷尔定义出来的,通过继承,新的类自动获得了基础类中的所有成员,包括成员变量、方法和各种访问属性的成员,无论时public还是private。在继承后,程序员还可以加入自己定义的新的成员,包括变量和方法。通过继承来定义新的类,远比从头开始写一个新的类要简单快捷和方便,以上便是对代码的重用。

3.protected的含义是什么? 解答:

含义:只有包内其他类、自己和子类可以访问。

4.super有什么作用? 解答:

super表示超类或父类,其只能在子类中使用,可以访问父类中的实例变量、实例方法、还可以访问父类的构造方法(这个super()必须写在构造方法的第一行,而且每个构造方法只能有一个super())。

5.interface与class有什么异同之处? 解答:

相同点:

1)都可以定义抽象方法; 2)都不能实例化对象;

3)定义的抽象方法都需要被重写;

4)都可以定义public static方法, public static final常量。

不同点: 1)意义不同

抽象类是对事物更高层级的抽象; 接口是对功能的封装。 2)定义方式不同

抽象类用 abstract class定义; 接口用interface定义。 3)内容不同

抽象类中除了抽象方法外,还可以定义构造方法等普通类中定义的所有成员。

接口除了public abstract方法, public static final常量 , public static 方法, public default方法等这四个内容外, 不能定义构造方法等内容

4)使用方式不同

抽象类需要被子类extends继承; 接口需要被实现类implements实现。 5)类只支持单继承, 接口支持多继承。 6)应用场景不同

一般情况下, 对类进行功能的扩展,优先选择接口。

除了扩展功能外, 还需要保存不同的数据,只能选择抽象类;抽象类的抽象方法需要子类重写, 抽象类还可以约束所有的子类都具有相同的功能。

6.覆盖与重载有什么关系? 解答:

--方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系

--覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。

--覆盖要求参数列表相同;重载要求参数列表不同。

--覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调 用时的实参表与形参表来选择方法体的。

7.Java缺省使用何种绑定方式? 解答:

动态绑定,缺省意味着它不属于程序执行前的编译阶段确定的绑定。

8.什么样的方法会被静态绑定调用? 解答:

final、static、private等方法在程序执行前已经被绑定,也就是说在编译过程中就已经知道这个方法是哪个类的方法,故这三种方法会被静态绑定调用。

9.绑定方式是由方法自身所决定的还是在调用方法的时候决定的? 解答:

方法自身所决定的,不同的方法在编译时决定了不同的绑定类型。

二、程序理解题

1.写出下面程序的输出结果。 class A{

public int data = 5; public void print() {

System.out.println(data);

} }

class B extends A{ public int data = 2; public void print() {

System.out.println(data); } }

public class TestAB{

public static void main(String[] args) { A a = new B(); a.print();

System.out.println(a.data); } }

解答: 2 5

2.写出以下程序的运行结果 public class A{

public void m(int i) { System.out.println(10); } }

public class B extends A{ public void m(int k) { System.out.println(20); }

public static void main(String[] args) { A p1 = new A(); B p2 = new B(); p1.m(1); p2.m(2); } }

解答: 10 20

三、编程题

1.设计一个程序,表达各种读物,如小说、杂志、期刊、课本等,每种读物有相同的属性,如页数、价格等,也有不同的属性,如杂志和期刊都有出版周期,而课本有适合对象。写一个测试类的main()来产生一系列随机的读物,并输出它

们的信息。 解答:

package work06; //抽象类book,方法 abstract class Book { //共同属性

int pages; // 页数 double price; // 价格

public abstract void Info(); }

//小说类

class Fiction extends Book {

public Fiction(int pages, double price) { this.pages = pages; this.price = price; }

public void Info() {

System.out.println(\is a fiction, which has \+ pages + \pages,\costs \ } }

//杂志类

class Magazing extends Book {

private String publishing_time; // 出版时间

public Magazing(int pages, double price, String publishing_time) { this.pages = pages; this.price = price;

this.publishing_time = publishing_time; }

public void Info() {

System.out.println(\pages,\publishing_time + \ } }

//期刊类

class Journal extends Book {

private String publishing_time; // 出版时间

public Journal(int pages, double price, String publishing_time) { this.pages = pages; this.price = price;

this.publishing_time = publishing_time; }

public void Info() {

System.out.println(\is a journal, which has \+ pages + \pages,\costs \\ } }

//课本类

class Textbook extends Book {

private String applicable_object; // 适用对象

public Textbook(int pages, double price, String applicable_object) { this.pages = pages; this.price = price;

this.applicable_object = applicable_object; }

public void Info() {

System.out.println(\pages,\applicable_object +\ } }

public class Test {

public static void main(String[] args) { Fiction f = new Fiction(199, 12); f.Info();

Magazing m = new Magazing(3, 30, \ m.Info();

Journal j = new Journal(274, 36, \ j.Info();

Textbook t = new Textbook(187, 10.19, \ t.Info(); } }

2.将上题中的基础类“读物”改写成一个接口,并修改相应的代码。 解答:

package work06; //读物接口

interface Book { public void Info(); }

//小说类

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4 ceshi