一、习题介绍
Check Point:P416 11.1,11.6,11.7,11.8,11.12,11.17,11.24
Programming Exercise:11.1
二、习题及答案
Check Point:
11.1
True or false? A subclass is a subset of a superclass.
11.1 对还是错?子类是超类的子集。
答:错误。子类是超类的一个特定类型,但它不表示子类是超类的一个子集。子类继承了超类的属性和方法,但子类可以有自己的特定属性和方法。
11.6 True or false? When invoking a constructor from a subclass, its superclass’s no-arg constructor is always invoked.
11.6 对还是错?从子类调用构造函数时,总是调用父类的无参数构造函数。
答:错误。子类构造函数可以通过 super() 显式调用父类的构造函数,可以是带参数的,也可以是无参数的。如果子类构造函数中没有显式调用父类构造函数,Java编译器会自动插入一个无参数的 super() 调用。
11.7 True or false? You can override a private method defined in a superclass.
11.7 对还是错?您可以覆盖在超类中定义的私有方法。
答:错误。私有方法不能被子类覆盖,因为它们在子类中不可见。
11.8 True or false? You can override a static method defined in a superclass.
11.8 对还是错?您可以覆盖在超类中定义的静态方法。
答:错误。静态方法是与类相关联的,而不是与类的实例相关联的,因此它们不能被子类覆盖。但是,子类可以隐藏父类的静态方法。
11.12 Explain the difference between method overloading and method overriding.
11.12 解释方法重载和方法重写的区别。
答:方法重载(Overloading)发生在同一个类中,当有多个方法具有相同的名称但不同的参数列表时。编译器根据方法调用时提供的参数来决定调用哪个方法。 方法重写(Overriding)发生在继承体系中,当子类有一个与父类中具有相同名称、相同参数列表和相同返回类型的方法时。运行时,调用将基于对象的实际类型来解析。
11.17 What is polymorphism? What is dynamic binding?
11.17 什么是多态性?什么是动态绑定?
答:多态性是面向对象编程的一个特性,它允许不同类的对象对同一消息做出响应,但响应的方式取决于对象的实际类型。这使得代码可以对不同类型的对象执行不同的操作,而不需要知道对象的具体类。 动态绑定,也称为晚期绑定,是指在程序运行时确定方法调用的确切版本的过程。这是多态性的关键部分,允许Java虚拟机在运行时选择正确的方法实现。
11.24
Indicate true or false for the following statements:
■ You can always successfully cast an instance of a subclass to a superclass.
■ You can always successfully cast an instance of a superclass to a subclass.
11.24 为下列语句指明真或假:
您总是可以成功地将子类的实例强制转换为超类。真。
你总是可以成功地将父类的实例强制转换为子类。假。这可能会导致 ClassCastException ,因为父类实例不一定是子类类型。
Programming Exercise:
11.1
(The Triangle class) Design a class named Triangle that extends
GeometricObject. The class contains:
■ Three double data fields named side1, side2, and side3 with default values 1.0 to denote three sides of the triangle.
■ A no-arg constructor that creates a default triangle.
■ A constructor that creates a triangle with the specified side1, side2, and side3.
■ The accessor methods for all three data fields.
■ A method named getArea() that returns the area of this triangle.
■ A method named getPerimeter() that returns the perimeter of this triangle.
■ A method named toString() that returns a string description for the triangle.
For the formula to compute the area of a triangle, see Programming Exercise 2.19.
The toString() method is implemented as follows:
return "Triangle: side1 = " + side1 + " side2 = " + side2 + " side3 = " + side3;
Draw the UML diagrams for the classes Triangle and GeometricObject and implement the classes. Write a test program that prompts the user to enter three sides of the triangle, a color, and a Boolean value to indicate whether the triangle is filled. The program should create a Triangle object with these sides and set the color and filled properties using the input. The program should display the area, perimeter, color, and true or false to indicate whether it is filled or not.
11.1设计一个名为Triangle的类来扩展GeometricObject。这个类包含:
三个双数据字段,默认命名为side1, side2和side3值1.0表示三角形的三条边。
一个无参数构造函数,创建一个默认三角形。
创建一个具有指定的边1、边2和边的三角形的构造函数side3。
■三个数据字段的访问方法。
一个名为getArea()的方法返回三角形的面积。
一个名为getPerimeter()的方法返回三角形的周长。
一个名为toString()的方法,返回三角形的字符串描述。
计算三角形面积的公式请参见编程练习2.19。
toString()方法的实现如下:
返回"三角形:side1 = " + side1 + " side2 = " + side2 + "" Side3 = " + Side3;
为类Triangle和GeometricObject和绘制UML图实现类。
编写一个测试程序,提示用户输入三角形的边长、颜色和布尔值,以指示三角形是否是填满。程序应该用这些边创建一个三角形对象,并设置使用输入的颜色和填充属性。
程序应该显示面积、周长、颜色和true或false表示是否填充。
// 假设GeometricObject类已经存在,并且具有color和filled属性
public abstract class GeometricObject {
protected String color;
protected boolean filled;
public GeometricObject() {
}
public GeometricObject(String color, boolean filled) {
this.color = color;
this.filled = filled;
}
public String getColor() {
return color;
}
public boolean isFilled() {
return filled;
}
public abstract double getArea();
public abstract double getPerimeter();
}
public class Triangle extends GeometricObject {
private double side1;
private double side2;
private double side3;
public Triangle() {
this(1.0, 1.0, 1.0);
}
public Triangle(double side1, double side2, double side3) {
super(); // 调用GeometricObject的无参数构造函数
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
}
public double getSide1() {
return side1;
}
public double getSide2() {
return side2;
}
public double getSide3() {
return side3;
}
public double getArea() {
// 使用海伦公式或其他公式计算面积
// 示例公式:area = sqrt(s * (s - a) * (s - b) * (s - c))
// 其中s是半周长
double s = (side1 + side2 + side3) / 2;
return Math.sqrt(s * (s - side1) * (s - side2) * (s - side3));
}
public double getPerimeter() {
return side1 + side2 + side3;
}
@Override
public String toString() {
return "Triangle: side1 = " + side1 + ", side2 = " + side2 + ", side3 = " + side3;
}
}
// 测试程序
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Enter the lengths of the sides of the triangle:");
double side1 = scanner.nextDouble();
double side2 = scanner.nextDouble();
double side3 = scanner.nextDouble();
System.out.println("Enter the color of the triangle:");
String color = scanner.next();
System.out.println("Is the triangle filled? (true/false)");
boolean filled = scanner.nextBoolean();
Triangle triangle = new Triangle(side1, side2, side3);
triangle.setColor(color);
triangle.setFilled(filled);
System.out.println("Area of the triangle: " + triangle.getArea());
System.out.println("Perimeter of the triangle: " + triangle.getPerimeter());
System.out.println("Color of the triangle: " + triangle.getColor());
System.out.println("Filled: " + (triangle.isFilled() ? "true" : "false"));
}
}
运行结果:
结语
对命运承诺
对承诺负责
!!!