第1关:深入理解继承与多态涉及到的概念
1、关于Java编程中的继承的理解,不正确的有
A、继承是实现复杂类设计的一种方案。
B、继承,意味着子类不用重复代码,就可以拥有父类定义的方法成员和数据成员,并可以增加新的数据成员和方法成员。
C、子类没有显式地定义构造方法,则会默认继承父类的全部构造方法。
D、一个子类可以继承自多个父类
E、若一个类定义时不带关键字extends,则它继承Object类
2、对如下代码的分析,正确的有:
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、关于以下代码,说法错误的有
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、下面代码的运行结果为:
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、有关下面的类的代码(这是一个表示平面上一个封闭区域几何形状的类)的说法,正确的有:
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;
}
}
仅供参考,不懂答疑去问老师或者群里问助教。