题目描述:
请从下列的抽象类shape类扩展出一个圆形类Circle,这个类圆形的半径radius作为私有成员,类中应包含初始化半径的构造方法。
public abstract class shape {// 抽象类
public abstract double getArea();// 求面积
public abstract double getPerimeter(); // 求周长
}
主类从键盘输入圆形的半径值,创建一个圆形对象,然后输出圆形的面积和周长。保留4位小数。圆形类名Circle
裁判测试程序样例:
import java.util.Scanner;
import java.text.DecimalFormat;
abstract class shape {// 抽象类
/* 抽象方法 求面积 */
public abstract double getArea( );
/* 抽象方法 求周长 */
public abstract double getPerimeter( );
}
/* 你提交的代码将被嵌入到这里 */
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
DecimalFormat d = new DecimalFormat("#.####");// 保留4位小数
double r = input.nextDouble( );
shape c = new Circle(r);
System.out.println(d.format(c.getArea()));
System.out.println(d.format(c.getPerimeter()));
input.close();
}
}
输入样例:
3.1415926
输出样例:
31.0063
19.7392
代码长度限制256 KB 时间限制2000 ms 内存限制64 MB
题目分析:
对裁判测试样例中的主类进行分析,其中主要的是DecimalFormat是一个没有接触过的工具类,查阅资料后得知是用来保留小数(截断)的,其中的方法为format。
具体用法如下:
double num = 11.256;
DecimalFormat df = new DecimalFormat("#.##");
//指定RoundingMode
df.setRoundingMode(RoundingMode.HALF_UP);
String str = df.format(num);
double formatNum = Double.parseDouble(str);
System.out.println(formatNum);
分析主函数:
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);//实例化了一个Scanner类
DecimalFormat d = new DecimalFormat("#.####");// 注意!!这是一个工具类,用法是可以保留4位小数
double r = input.nextDouble( );//输入成员变量r作为圆形半径
shape c = new Circle(r);//实例化circle对象,circle即我们要编写的类
System.out.println(d.format(c.getArea()));
System.out.println(d.format(c.getPerimeter()));//需要编写getArea和getPerimeter两个方法
input.close();
}
}
设计重点:
1.方法的重写:抽象类中的抽象方法打上了public的修饰符,这表明该方法可以在另一个类中被重写。
2.Circle类中的构造方法:值得注意的是,构造方法是没有返回值的。因此没有void,double一类的返回值类型,因此直接这样定义:
public Circle(double R){......}
但是如何让Circle类中的其他方法得到实例化对象时获得的半径值呢?
3.运用this.关键字:在Circle类中也定义一个R,并用this.R=R将构造方法中输入的R转移到类中,让其他方法也能调用R值。(方法可以直接调用该类中的变量)
4.调用圆周率:直接用常量Math.PI。
class Circle extends shape {
//重写求面积的方法
double R;
public double getArea() {
......
}
public double getPerimeter() {
......
}
//用来输入r的构造方法
public Circle(double R) {
this.R = R;
}
}
最终代码:
class Circle extends shape {
//重写求面积的方法
double R;
public double getArea() {
double A= R*R*(Math.PI);
return A;
}
public double getPerimeter() {
double P = R*2*(Math.PI);
return P;
}
//用来输入r的构造方法
public Circle(double R) {
this.R = R;
}
}
总结:重点掌握this关键字、构造方法的定义、方法的重写和圆周率的调用。