首页 > 其他分享 >第六章-继承和多态

第六章-继承和多态

时间:2024-11-10 20:19:58浏览次数:3  
标签:继承 子类 多态 接口 抽象 第六章 抽象类 方法 public

一、单项选择题

1. 有如下的类及对象的定义:

 class parentclass []

 class subclassl extends parentclass |}

 parentclass a = new parentclass ();

subclass1 b= new subclass1();

当执行语句a=b; 时,结果是                                                  【  】

A. 编译时出错                    B. 编译时正确,但执行时出错

C. 执行时完全正确                  D. 不确定

2. 有如下的类及对象的定义:

 class ParentClass {}

 class SubClass1 extends ParentClass {}

 class SubClass2 extends ParentClass {}

ParentClass a = new ParentClass ();

SubClass1 b= new SubClass1 ();

SubClass2 c= new SubClass2 ();

当执行语句b=(SubClass1)c; 时, 结果是                                           【  】

A. 编译时出错                     B. 编译时正确,但执行时出错

C. 执行时完全正确                  D. 不确定

3. Java 接口中可能包含的内容是                                              【  】

Ⅰ. 没有赋初值的成员变量             Ⅱ. 已赋初值的成员变量

Ⅲ. 抽象方法                     Ⅳ. 构造方法

A. Ⅰ和Ⅱ        B. Ⅰ和Ⅲ        C. Ⅱ和Ⅲ          D. Ⅱ、 Ⅲ和Ⅳ

4. 下列关于抽象类的叙述中,正确的是                                            【  】

A. 只能含有抽象方法,不能含有普通方法

B. 不一定要有抽象方法,必须要有普通方法

C. 必须含有抽象方法,也可以有普通方法

D. 既可以有抽象方法,也可以有普通方法

5. 下列的定义正确的是                                            【  】

A. class alarmclock { abstract void alarm();}

B. abstract alarmelock | abstract void alarm();|

C. class abstract alarmclock { abstract void alarm();}

D. abstract class alarmclock | abstract void alarm();}

二、填空题

1. Java中,处在类层次中最高层的是object。

2. Java 中实现多重继承的机制是 使用接口。

3. Java 中表示抽象类的关键字是 abstract。

4. Java 中 String类不能被继承, 所以它是一个终极类。

5. 如果类 A继承和扩展类B,则子类 A和父类B之间的关系是is a 关系。

6. 用于定义抽象类的关键字是 abstract。

7. 使用关键字 final 修饰的类是不能被扩展的类。

8. 接口上的所有变量都默认为是 public属性。

三、简答题

1. 请写出接口体中可能包含的内容。

答:抽象方法、常量、注解类型、泛型、私有方法

  1. 什么是抽象类? 什么是抽象方法? 它们有什么特点和用处?

答:抽象类是一种特殊的类,它不能被实例化,也就是说,您不能直接创建一个抽象类的对象。抽象类的主要用途是作为一个基类,用来派生其他类。抽象类中可以包含抽象方法和其他成员(如普通方法、构造函数、字段等)。

特点

抽象关键字:抽象类使用 abstract 关键字声明。

不能实例化:不能直接创建抽象类的实例。

包含抽象方法:可以包含一个或多个抽象方法,也可以包含非抽象方法。

继承:一个非抽象类继承抽象类时,必须实现抽象类中所有的抽象方法。

普通成员:除了抽象方法之外,还可以包含普通方法、构造函数、字段等成员。

用处

定义标准:抽象类可以定义一套标准的方法签名,供子类实现。

模板方法模式:抽象类可以实现模板方法模式,定义算法的骨架,让子类实现具体步骤。

代码重用:抽象类可以提供一些公共的方法和属性,供子类重用。

封装变化:通过抽象类来封装变化的部分,保持稳定的部分不变。

抽象方法是一种没有具体实现的方法,只在抽象类或接口中声明,没有方法体。子类必须实现抽象方法才能成为一个非抽象类。

特点

抽象关键字:使用 abstract 关键字声明。

无方法体:抽象方法没有大括号 {} 来包含方法体。

强制实现:任何继承了包含抽象方法的类的子类必须实现这些抽象方法。

多态性:抽象方法的存在允许实现多态性,即父类引用指向子类对象。

用处

强制实现:确保派生类实现某些特定的行为。

多态性:通过抽象方法实现多态性,使得父类引用可以指向子类对象,并调用子类的具体实现。

定义接口:抽象方法定义了一个类的公共接口,子类必须遵循这个接口

  1. 什么是终极类、终极方法和终极变量? 定义终极类型的目的是什么?

答:在 Java 中,“终极”(Final)是一个关键字,用于定义最终类、最终方法和最终变量。

一个类被声明为 final 后,它就变成了一个终极类,这意味着这个类不能被继承。换句话说,任何试图继承这个类的尝试都会导致编译错误。

一个方法被声明为 final 后,它就变成了一个终极方法,这意味着这个方法不能被子类重写。

一个变量被声明为 final 后,它就变成了一个终极变量,这意味着这个变量的值不能被改变。对于引用类型的变量,被声明为 final 后,虽然不能改变引用本身,但是引用的对象仍然可以改变。

  1. 什么是接口? 接口的作用是什么? 它与抽象类有何区别?

答:接口(Interface)是一种引用类型,它完全由抽象方法组成(从 Java 8 开始,接口可以包含默认方法和静态方法)。接口用于定义一组行为规范,这些规范可以被多个类共同实现。接口中的方法默认是 public 的,并且没有具体的实现(即没有方法体)。

接口的作用

定义行为标准:接口定义了一组需要实现的方法,从而定义了实现该接口的类的行为规范。

多继承的替代方案:Java 不支持多重继承,但一个类可以实现多个接口,这样就可以从多个接口中继承行为。

多态性:接口允许实现多态性,即一个接口可以有多个不同的实现类,通过接口引用可以指向任何实现了该接口的类的对象。

松耦合:接口使得类的设计更加灵活,可以轻松地添加新的实现而无需修改现有的代码。

代码复用:虽然接口本身不能提供代码复用(除非使用默认方法或静态方法),但多个类可以通过实现同一个接口来共享相同的行为规范。

接口与抽象类的区别

抽象方法 vs. 具体实现

接口:接口中的方法默认是抽象的,没有具体实现。从 Java 8 开始,接口可以包含默认方法和静态方法,这些方法有具体实现。

抽象类:抽象类可以包含抽象方法,也可以包含具体实现的方法。

继承数量

接口:一个类可以实现多个接口,实现接口时需要提供所有抽象方法的具体实现。

抽象类:一个类只能继承一个抽象类或其他非抽象类。

成员变量

接口:接口中的变量默认是 public static final 的,通常用于定义常量。

抽象类:抽象类可以拥有各种类型的成员变量,包括实例变量。

访问修饰符

接口:接口中的方法默认是 public 的,不允许使用其他访问修饰符。

抽象类:抽象类中的方法可以有不同的访问级别,例如 protected 或 private。

实现细节

接口:接口主要用于定义行为规范,不提供实现细节。

抽象类:抽象类可以提供部分实现细节,子类可以选择继承或覆盖这些方法。

构造函数

接口:接口没有构造函数。

抽象类:抽象类可以有构造函数,用于初始化抽象类中的成员变量。

  1. 关键字 super在成员方法中的特殊作用是什么?

答:在 Java 中,super 关键字用于引用当前对象的父类(超类)的对象。它在成员方法中有多种用途,主要作用是在子类中调用父类的方法或访问父类的属性。

super 关键字在成员方法中的主要作用是:

调用父类中被重写的方法。

访问父类中的属性。

在构造器中调用父类的构造器。

在多态情况下,通过类型转换来调用子类中重写的父类方法。

  1. 什么叫作方法重载? 什么叫作方法重写? 它们之间的区别是什么?

答:方法重载是指在一个类中定义多个同名方法,但这些方法的参数列表不同(参数的数量、类型或顺序不同)。

方法重写是指在子类中重新定义父类中的方法,以便改变或扩展父类的行为。

方法重载(Overloading)

方法签名不同:方法的名称相同,但参数列表不同。

编译时绑定:在编译时根据方法签名确定调用哪个方法。

类内实现:重载发生在同一个类内部。

返回类型无关:返回类型可以不同。

方法重写(Overriding)

方法签名相同:方法的名称、参数列表和返回类型都相同。

运行时绑定:在运行时根据对象的实际类型动态绑定。

子类覆盖父类:重写发生在子类覆盖父类的方法。

访问修饰符限制:子类的方法不能比父类的方法有更严格的访问级别。

返回类型相同:子类重写的方法的返回类型必须与父类相同或更具体。

  1. 什么是对象转型?

答:对象转型是指在面向对象编程中,将一个对象从一种类型转换为另一种类型的过程。这种转换通常发生在继承层次中,涉及父类引用和子类对象之间的转换。对象转型可以分为两种类型:向上转型(Upcasting)和向下转型(Downcasting)。向上转型是指将一个子类对象赋值给一个父类引用。这种类型的转换是自动的,不需要显式地使用 cast 操作符。向下转型是指将一个父类引用转换为一个子类引用。这种类型的转换需要显式地使用 cast 操作符,因为它可能会导致类型转换异常(ClassCastException)。

  1. Java 如何实现多重继承?

答:Java 支持一个类实现多个接口,这可以用来实现类似于多重继承的效果。接口可以包含多个抽象方法,实现这些接口的类需要提供这些方法的具体实现。

  1. 什么是多态?

答:多态是面向对象编程(OOP)的一个核心特性,它允许使用一个接口来表示不同类型的对象。简单来说,多态意味着“多种形式”,它允许程序在运行时根据对象的实际类型来调用合适的方法。多态性使得代码更加灵活、可扩展和可维护。

四、程序分析题

阅读下列程序,请写出该程序的输出结果。

import java. util. Vector;

 import java. util. Vector;

 class Person{

 private String name =" John";

 public String getName(){ return name; }

 public void setName( String n){ name =n; }

 }

 class Employee extends Person {

 private int employeeNumber;

 public int getEmployeeNumber(){ return employeeNumber; }

 public void setEmployeeNumber( int number){ employeeNumber = number; }

 }

 class Manager extends Employee {

 public Vector < String > responsibilities;

 public Vector< String >getResponsibilities( ){ return responsibilities; }

 }

 public class PersonTest4{

 public static void main( String[] args){

 Employee jim= new Manager();

 jim. setName(" Jim");

 Manager unknown=( Manager) jim;

 unknown. setEmployeeNumber(543469);

 unknown. responsibilities = new Vector < String>();

 unknown. responsibilities. add(" Internet project");

 unknown. responsibilities. add(" Internet project1 ");

 System. out. println( jim. getName());

 System. out. println( jim. getEmployeeNumber());

 System. out. println( unknown. getName());

 System. out. println( unknown. getEmployeeNumber());

 System. out. println( unknown. getResponsibilities());

 }

}

答: Jim

543469

 Jim

543469

[ Internet project,  Internet project1 ]

五、程序设计题

1. 设计并实现一个MyGraphic类及其子类,它们代表一些基本的图形,这些图形包括矩形、三角形、圆、椭圆、菱形、梯形等。试给出能描述这些图形所必需的属性及必要的访问方法。

答:/ 导入必要的包

import java.awt.geom.Point2D;

// 抽象基类 MyGraphic

abstract class MyGraphic {

    protected Point2D center;

    

    public MyGraphic(Point2D center) {

        this.center = center;

    }

    

    public abstract double getArea();

    public abstract double getPerimeter();

    

    public Point2D getCenter() {

        return center;

    }

    

    public void setCenter(Point2D center) {

        this.center = center;

    }

}

// 矩形类 Rectangle

class Rectangle extends MyGraphic {

    private double width;

    private double height;

    

    public Rectangle(Point2D center, double width, double height) {

        super(center);

        this.width = width;

        this.height = height;

    }

    

    public double getWidth() {

        return width;

    }

    

    public void setWidth(double width) {

        this.width = width;

    }

    

    public double getHeight() {

        return height;

    }

    

    public void setHeight(double height) {

        this.height = height;

    }

    

    @Override

    public double getArea() {

        return width * height;

    }

    

    @Override

    public double getPerimeter() {

        return 2 * (width + height);

    }

}

// 圆形类 Circle

class Circle extends MyGraphic {

    private double radius;

    

    public Circle(Point2D center, double radius) {

        super(center);

        this.radius = radius;

    }

    

    public double getRadius() {

        return radius;

    }

    

    public void setRadius(double radius) {

        this.radius = radius;

    }

    

    @Override

    public double getArea() {

        return Math.PI * radius * radius;

    }

    

    @Override

    public double getPerimeter() {

        return 2 * Math.PI * radius;

    }

}

// 其他类(省略实现细节)

class Triangle extends MyGraphic {

    // 属性

    // 构造函数

    // 访问方法

    // 重写 getArea 和 getPerimeter 方法

}

class Ellipse extends MyGraphic {

    // 属性

    // 构造函数

    // 访问方法

    // 重写 getArea 和 getPerimeter 方法

}

class Diamond extends MyGraphic {

    // 属性

    // 构造函数

    // 访问方法

    // 重写 getArea 和 getPerimeter 方法

}

class Trapezoid extends MyGraphic {

    // 属性

    // 构造函数

    // 访问方法

    // 重写 getArea 和 getPerimeter 方法

}

2. 设计并实现一个 Vehicle 类及其子类, 比如汽车 automobile、船 ship 及飞机 aircraft,它们代表主要的交通工具,定义必要的属性信息、构造方法及访问方法。可选择的属性包括名称、类型、自重、尺寸、燃料、使用目的、载客人数、载货吨数、最大时速等。可选择的访问方法包括显示自身信息、设置及读取某一属性的方法等。

标签:继承,子类,多态,接口,抽象,第六章,抽象类,方法,public
From: https://blog.csdn.net/qq_43601339/article/details/143644437

相关文章

  • windows C#-多态性
    多态性常被视为自封装和继承之后,面向对象的编程的第三个支柱。Polymorphism(多态性)是一个希腊词,指“多种形态”,多态性具有两个截然不同的方面:在运行时,在方法参数和集合或数组等位置,派生类的对象可以作为基类的对象处理。在出现此多形性时,该对象的声明类型不再与运行时类型......
  • windows C#-继承
    继承(以及封装和多态性)是面向对象的编程的三个主要特征之一。通过继承,可以创建新类,以便重用、扩展和修改在其他类中定义的行为。其成员被继承的类称为“基类”,继承这些成员的类称为“派生类”。派生类只能有一个直接基类。但是,继承是可传递的。如果ClassC派生自ClassB......
  • C++17 多态内存管理 pmr
    C++17多态内存管理pmr概念C++17开始,增加特性PolymorphicMemoryResources多态内存资源,缩写PMR。提供新的内存分配策略,更灵活地控制内存的分配与回收——适用于嵌入式和高并发服务器场景。对内存资源的抽象抽象基类std::pmr::memory_resource定义了用于内存的分......
  • C++代码优化(二): 区分接口继承和实现继承
    目录1.引言2.接口继承3.实现继承4.如何选择接口继承与实现继承5.完整实例6.总结1.引言        在C++中,区分接口继承和实现继承是一种良好的编程实践,有助于提高代码的可维护性、可读性和可扩展性。接口继承通常指的是从基类继承纯虚函数(purevirtualfunctions......
  • 深入Java多态机制:从原理到实现
    目录1.什么是多态?2.如何在Java中实现多态?2.1方法重写实现多态2.2接口实现多态3.Java接口中方法实现的支持3.1默认方法4.总结多态(Polymorphism)是面向对象编程(OOP)的核心概念之一。多态允许对象在不同的上下文中执行不同的行为,即同一操作可以在不同的对象中产生不......
  • c++学习:封装继承多态
    目录封装封装的定义封装的好处封装的实例继承继承的定义继承的好处继承的实例多态多态的定义多态的好处多态的实例封装封装的定义封装是面向对象编程(OOP)中的一个核心概念,它指的是将数据(属性)和操作这些数据的函数(方法)结合在一起的过程,以此来模拟现实世界中的实......
  • 多态(c++)
    一、概念多态分为编译时多态(静态多态)和运行时多态(动态多态),函数重载和函数模板就是编译时多态,它们传不同的类型的参数就可以调用不同的函数,通过参数不同达到多种形态,因为它们实参传给形参的参数匹配是在编译时完成的,所以叫编译时多态运行时多态,在完成某个行为(函数),可以传不同......
  • JAVA (继承+多态)创建一个父类Monster
    题目描述  (继承+多态)创建一个父类Monster,父类带有一个boolean返回值的方法frighten,用于打印输出"arrrgh";创建一个继承于Monster父类的子类Dragon,重写frighten方法,用于打印输出"breathfire";创建一个继承于Monster父类的子类Vampire,重写frighten方法,用于打印输出"a......
  • C++中的继承
    在C++中,继承的方式有三种:public、protected 和 private。它们控制了基类成员在派生类中的访问权限。以下是这三种继承方式的区别:1. public 继承基类的 public 成员在派生类中保持 public。基类的 protected 成员在派生类中保持 protected。基类的 private 成员......
  • C++中类和结构体的互相继承
    在C++中,struct可以继承类,反之,类也可以继承struct。struct和类的唯一区别在于访问级别,默认情况下,struct的成员是public,而类的成员是private。以下是一个简单的例子:classBaseClass{public:voidBaseFunction(){std::cout<<"FunctioninBaseClass"<<std::endl;......