内容发布更新时间 : 2025/1/8 5:34:25星期一 下面是文章的全部内容请认真阅读。
第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(); }
//小说类