第1关:深入理解继承与多态涉及到的概念

1、关于Java编程中的继承的理解,不正确的有

A、继承是实现复杂类设计的一种方案。

B、继承,意味着子类不用重复代码,就可以拥有父类定义的方法成员和数据成员,并可以增加新的数据成员和方法成员。

C、子类没有显式地定义构造方法,则会默认继承父类的全部构造方法。

D、一个子类可以继承自多个父类

E、若一个类定义时不带关键字extends,则它继承Object类
2、对如下代码的分析,正确的有:

JAVA题继承多态编程题 java继承和多态例题_抽象类


JAVA题继承多态编程题 java继承和多态例题_多态_02


JAVA题继承多态编程题 java继承和多态例题_JAVA题继承多态编程题_03

A、Test.java中第4行产生的完整输出为“DemoClass2不带参构造方法被调用”

B、Test.java中第4行产生的输出中包含字符串“DemoClass1的不带参构造方法被调用”

C、使用new调用DemoClass2的任何构造方法时,始终会首先自动调用它的父类DemoClass1的不带参数的构造方法,因此,Test.java中第6行产生的输出中包含“DemoClass1的不带参构造方法被调用”

D、成员变量member3不会被DemoClass2继承,因此在DemoClass2中无法直接修改member3
3、下列关于属性隐藏和方法重写的说法,正确的有

A、子类的数据成员的数据类型和变量名与父类都一样,才表示父类的该数据成员(或属性)被子类隐藏。

B、父类被隐藏的数据成员,在子类中再也无法访问了。

C、重写意味着子类可以修改父类同名方法的行为。

D、父类方法被子类重写,父类对象和子类对象在调用该重写方法时,就会表现出不同的行为,这就是多态在继承上的一个体现。
4、super关键字的有关说法正确的有

A、
若父类显式定义的构造方法都是带参数的,则子类在其构造方法的定义中,必须首先使用super显式地调用父类的构造方法。

B、
在子类定义中,可以使用super访问父类的private数据成员和方法成员。

C、
使用super调用父类的构造方法的语句,如果需要,必须是子类构造方法中执行语句的第1条。

D、
父类存在不带参数的构造方法,把“super();”作为子类构造方法的第一条执行语句或不存在语句“super();”,效果是一样的。

E、
子类对象在构造前,它的某个父类的构造方法总会被调用且仅调用1次。
5、关于以下代码,说法错误的有

JAVA题继承多态编程题 java继承和多态例题_抽象类_04

A、speak方法不能被A的子类继承

B、getArea方法能被A的子类重写,而speak方法不能被A的子类重写

C、PI是一个常量,但可以在程序运行过程中修改它的值

D、如果不希望从A派生出子类,则需要在“class A”中间插入final关键字

E、外部可以使用A.PI读取PI的值
6、有关继承、上转型对象、多态的说法,正确的有

A、多态体现在方法名相同,但可以对应多个不同的代码段,程序运行过程中究竟执行哪个代码段,是由Java的多态机制确保的。

B、继承时的多态可以体现在子类对父类重写的方法上

C、假设有代码“ClassA a=new ClassB();”其中ClassB是ClassA的子类,则a为上转型对象变量。

D、若调用上转型对象的方法,而该方法刚好被子类重写,则实际调用的是重写的方法,而不是父类的方法。
7、下面代码的运行结果为:

JAVA题继承多态编程题 java继承和多态例题_多态_05

A、constructor B,fun in B,constructor B,fun in B,constructor A,exception

B、constructor B,fun in B,constructor B,fun in B,constructor A,constructor A,fun in A

C、constructor A,constructor B,fun in B,constructor A,constructor B,fun in B,constructor A,exception

D、以上都不对
8、关于Java抽象类与抽象方法的理解,正确的有

A、抽象类表示抽象的概念,其类声明必须有abstract关键字,抽象类中可以没有抽象方法

B、抽象方法只是一个方法声明,没有方法体。

C、只要某个类中存在抽象方法,就必须声明该类为抽象类

D、无法直接用抽象类创建对象,必须从它派生出子类,才能创建对象。

E、抽象类的子类都可以直接用来创建子类对象
9、有关下面的类的代码(这是一个表示平面上一个封闭区域几何形状的类)的说法,正确的有:

JAVA题继承多态编程题 java继承和多态例题_抽象类_06

A、这是一个抽象类,它既包含了抽象方法,也包含了具体方法(非抽象方法)。

B、如果要定义一个表示圆形的类,可以继承这个Shape类

C、这个类的变量,可以作为构建柱体抽象类的数据成员,表示柱体的横截面形状。

D、若要从这个类派生出非抽象的类,必须实现getArea和getPerimeter方法。

E、由于该类是一个抽象类,因此外部不可以使用表达式“Shape.PI”。
10、下列有关面向抽象编程的理解,正确的有

A、面向抽象编程能较好地适应应用需求的不断变化。

B、面向抽象编程的关键之一是针对具体问题,能进行合理地抽象,构造出层次分明的抽象类。

C、面向抽象编程是面向对象编程思想的扩展,面向对象编程强调对一批具体对象进行抽象,提炼出具体类,而面向抽象编程更进一步,主张对具体类进一步抽象,提炼出“抽象类”。

D、面向抽象编程遵循了软件开发中的“开闭原则”,即:对修改关闭,对扩展开放。说白了,就是当软件需求有所变化,只需要定义新的类,而不需要修改已有的代码。

答案:
1.CD
2.BCD
3.CD
4.ACDE
5.ACDE
6.ABCD
7.C
8.ABCD
9.ABCD
10.ABCD

编程要求
本程序包含三个源文件,详见右上角的目录中的step2文件夹。
主类MainClass已经定义好了,请先打开该文件,在阅读该文件代码的基础上,
按提示,将目录中的其他所有文件中的代码补充完整,使得程序运行时测试的格式满足如下要求:
welcome to using the tool!
Please select one of the following options:
[0]quit
[1]compute perimeter and area of a circle
[2]compute perimeter and area of a triangle
[3]compute perimeter and area of a rectangle
1
input radius:89
perimeter and area of this circle is 559.20, 24884.56
Please select one of the following options:
[0]quit
[1]compute perimeter and area of a circle
[2]compute perimeter and area of a triangle
[3]compute perimeter and area of a rectangle
3
input width and height:45 67.5
perimeter and area of this rectangle is 225.00, 3037.50
Please select one of the following options:
[0]quit
[1]compute perimeter and area of a circle
[2]compute perimeter and area of a triangle
[3]compute perimeter and area of a rectangle
2
input lengths of three sides:89 45 90
perimeter and area of this triangle is 224.00, 1948.60
Please select one of the following options:
[0]quit
[1]compute perimeter and area of a circle
[2]compute perimeter and area of a triangle
[3]compute perimeter and area of a rectangle

简单来说,记得编译看左,运行看右
MainClass.java

import java.util.Scanner;
public class MainClass {
	public static Scanner sc=new Scanner(System.in);
	public static void main(String[] args) {
		System.out.println("welcome to using the tool!");
		while(true) {
			int curChoice = MainClass.showAndSelectChoice();
			Shape shape = null;
			if(curChoice==0) {
				break;
			}
			switch(curChoice) {
			case 1:
				shape=new Circle();break;
			case 2:
				shape=new Triangle();break;
			case 3:
				shape=new Rectangle();break;
			default:
				System.out.println("error choice!");
				continue;
			}
			shape.input(sc);
			double perimeter=shape.getPerimeter();
			double area=shape.getArea();
			System.out.printf("perimeter and area of this %s is %.2f, %.2f\n"
					,shape.shapeName,perimeter,area);		
		}
		sc.close();
		
	}
	private static int showAndSelectChoice() {
		System.out.println("Please select one of the following options:");
		System.out.println("[0]quit");
		System.out.println("[1]compute perimeter and area of a circle");
		System.out.println("[2]compute perimeter and area of a triangle");
		System.out.println("[3]compute perimeter and area of a rectangle");
		int res=sc.nextInt();
		
		return res;
	}

}

Shape.java

//在次完成Shape类的定义
 import java.util.Scanner;

public abstract class Shape {
    String shapeName = "shape";
    double Perimeter;
    double Area;

    public abstract void input(Scanner sc);

    public abstract double getPerimeter();

    public abstract double getArea();
}

Circle.java

//请给出表示圆的类的完整定义
  import java.util.Scanner;

public class Circle extends Shape{
    String shapeName ="circle";
    final double PI = 3.14159269;
    double R;
    double Perimeter;
    double Area;

    @Override
    public void input(Scanner sc) {
        System.out.print("input radius:");
        super.shapeName = this.shapeName;
        this.R = sc.nextDouble();
    }

    @Override
    public double getPerimeter() {
        this.Perimeter = (2*R)*PI;
        return Perimeter;
    }

    @Override
    public double getArea() {
        this.Area = PI*R*R;
        return Area;
    }
}

Rectangle.java

//请在下方给出Rectangle完整定义
  import java.util.Scanner;

public class Rectangle extends Shape{
    String shapeName = "rectangle";
    double width;
    double height;
    double Perimeter;
    double Area;

    @Override
    public void input(Scanner sc) {
        System.out.print("input width and height:");
        super.shapeName = this.shapeName;
        width = sc.nextDouble();
        height = sc.nextDouble();
    }

    @Override
    public double getPerimeter() {
        this.Perimeter = width*2+height*2;
        return Perimeter;
    }

    @Override
    public double getArea() {
        this.Area = width*height;
        return Area;
    }
}

Triangle.java

//请给出三角形类的完整定义
  import java.util.Scanner;

public class Triangle extends Shape{
    String shapeName = "triangle";
    double side1;
    double side2;
    double side3;
    double q;
    double Perimeter;
    double Area;

    @Override
    public void input(Scanner sc) {
        System.out.print("input lengths of three sides:");
        super.shapeName = this.shapeName;
        this.side1 = sc.nextDouble();
        this.side2 = sc.nextDouble();
        this.side3 = sc.nextDouble();
    }

    @Override
    public double getPerimeter() {
        this.Perimeter = side1+side2+side3;
        return Perimeter;
    }

    @Override
    public double getArea() {
        q = Perimeter/2;
        this.Area = Math.sqrt(q*(q-side1)*(q-side2)*(q-side3));
        return Area;
    }
}

仅供参考,不懂答疑去问老师或者群里问助教。