题目类别: 实验
关键字: 类、对象、封装
内容要求:
一、实验目的
(1)理解和掌握可见性修饰符,使用访问器和修改器对数据域进行封装。
(2)理解和掌握对象作为方法的参数和返回值。
二、实验内容
实验5 中的程序能够正常运行了,但是其中的Ring类的定义不是一个好的形式,因为它允许直接对过对象引用访问和修改圆环类的数据域,这样做使类难于维护并且不易调试。
本实验首先通过访问修饰符对其的数据域和方法进行修饰,使其成为一个结构更好的类。
步骤1:
目前Ring类中包含3个数据域、2个构造方法和相应的计算方法。
在该类的基础上定义一个新圆环类GoodRing,文件名命名为:GoodRing.java。
回答下面的问题,并按照问题答案重新编写、编译GoodRing类。
(1)构造方法名应该改为什么?用哪个可见性修饰符修饰构造方法比较合理?
(2)3个数据域应该用哪个可见性修饰符修饰?编写对应的访问器和修改器并使用恰当的访问性修饰符。
(3)计算方法应该用哪个可见性修饰符修饰比较合理?
步骤2:
参照TestRing.java编写GoodRing类的测试类程序TestGoodRing.java,编译并运行。
main方法中完成如下工作:
(1)创建一个GoodRing类的对象。
(2)输出该对象的半径、颜色、面积和周长。
(3)修改该对象的半径,重新输出半径、颜色、面积和周长。
编译并运行。
步骤3:
编写一个GoodRingUtil类,其中按下面要求定义static方法:
(1) createGoodRings方法,
形式参数为int,表示创建GoodRing类对象的个数;
返回值为 GoodRing[],存放生成的多个GoodRing类对象;
随机生成各个GoodRing对象的内外半径。
(2) totalArea方法,
形式参数为 GoodRing[],表示传入的数组;
返回值为double, 表示数组中所有GoodRing对象的面积之和。
(3) sort方法,
形式参数为 GoodRing[],表示传入的数组;
返回值为void
将数组中的GoodRing对象按面积从大到小排序。
(4) outputGoodRings方法,
形式参数为 GoodRing[],表示传入的数组;
返回值为void
输出数组中所有的GoodRing对象,包括内外半径、颜色和面积。每行输出一个GoodRing对象。
步骤4:
main方法中添加代码,调用GoodRingUtil类中的static方法完成如下工作:
(1)从键盘输入要创建的GoodRing对象的个数n;
(2)创建n个GoodRing对象的数组;
(3)输出n个GoodRing对象的面积之和;
(4)输出所有GoodRing对象;
(5)对数组进行排序;
(6)输出所有GoodRing对象;
编译并运行。
备注
提交:打包为可以执行的JAR文档,其中要包含源程序文件。
实现代码:
GoodRing类
package ex01;
/**
* 步骤1:
* 目前Ring类中包含3个数据域、2个构造方法和相应的计算方法。
* 在该类的基础上定义一个新圆环类GoodRing,文件名命名为:GoodRing.java。
* 回答下面的问题,并按照问题答案重新编写、编译GoodRing类。
* (1)构造方法名应该改为什么?用哪个可见性修饰符修饰构造方法比较合理?
* (2)3个数据域应该用哪个可见性修饰符修饰?编写对应的访问器和修改器并使用恰当的访问性修饰符。
* (3)计算方法应该用哪个可见性修饰符修饰比较合理?
*
*
*答:
* (1)构造方法名应该改为GoodRing 用public修饰构造方法比较合理
* (2)3个数据域应该用private修饰
* (3)计算方法应该用public修饰比较合理
*
*/
public class GoodRing {
private double innerRadius; //内半径
private double outerRadius; //外半径
private String fillColor; //填充颜色
/**
* 无参构造
*/
public GoodRing() {
innerRadius=1;
outerRadius=2;
fillColor="WHITE";
}
/**
* 全参构造
* @param innerRadius 内半径
* @param outerRadius 外半径
* @param fillColor 填充颜色
*/
public GoodRing(double innerRadius, double outerRadius, String fillColor) {
this.innerRadius = innerRadius;
this.outerRadius = outerRadius;
this.fillColor = fillColor;
}
/**
* 编写对应的访问器和修改器
*/
public double getInnerRadius() {
return innerRadius;
}
public void setInnerRadius(double innerRadius) {
this.innerRadius = innerRadius;
}
public double getOuterRadius() {
return outerRadius;
}
public void setOuterRadius(double outerRadius) {
this.outerRadius = outerRadius;
}
public String getFillColor() {
return fillColor;
}
public void setFillColor(String fillColor) {
this.fillColor = fillColor;
}
/**
* @return 计算并返回环面积的方法
*/
public double getArea(){
return (outerRadius*outerRadius-innerRadius*innerRadius)*Math.PI;
}
/**
* 计算环的内圆周长
*/
public double getInnerPerimeter(){
return 2*innerRadius*Math.PI;
}
/**
* @return 计算环的外圆周长
*/
public double getOuterPerimeter(){
return 2*outerRadius*Math.PI;
}
}
TestGoodRing类
package ex01;
/**
* 步骤2:
* 参照TestRing.java编写GoodRing类的测试类程序TestGoodRing.java,编译并运行。
* main方法中完成如下工作:
* (1)创建一个GoodRing类的对象。
* (2)输出该对象的半径、颜色、面积和周长。
* (3)修改该对象的半径,重新输出半径、颜色、面积和周长。
* 编译并运行。
*/
public class TestGoodRing {
public static void main(String[] args) {
GoodRing ring = new GoodRing(5, 8, "RED");
System.out.println("内半径:"+ring.getInnerRadius());
System.out.println("外半径:"+ring.getOuterRadius());
System.out.println("填充颜色:"+ring.getFillColor());
System.out.println("环的面积:"+ring.getArea());
System.out.println("环的内圆周长:"+ring.getInnerPerimeter());
System.out.println("环的外圆周长:"+ring.getOuterPerimeter());
System.out.println(); //分隔行
//修改该对象的半径
ring.setInnerRadius(3); //修改该对象的内圆半径
ring.setOuterRadius(7); //修改该对象的外圆半径
//重新输出半径、颜色、面积和周长
System.out.println("内半径:"+ring.getInnerRadius());
System.out.println("外半径:"+ring.getOuterRadius());
System.out.println("填充颜色:"+ring.getFillColor());
System.out.println("环的面积:"+ring.getArea());
System.out.println("环的内圆周长:"+ring.getInnerPerimeter());
System.out.println("环的外圆周长:"+ring.getOuterPerimeter());
}
}
GoodRingUtil类
package ex01;
import java.util.Arrays;
import java.util.Random;
/**
* @author Administrator
*/
public class GoodRingUtil {
/**
*
* @param num 创建GoodRing类对象的个数
* @return GoodRing[],存放生成的多个GoodRing类对象
*/
public static GoodRing[] createGoodRings(int num){
GoodRing[] goodRings=new GoodRing[num];
Random random=new Random();
for(int i=0;i<num;i++){
goodRings[i]=new GoodRing(random.nextInt(5)+1,
random.nextInt(5)+5,"RED");
}
return goodRings;
}
/**
*
* @param goodRings GoodRing[],表示传入的数组
* @return double 表示数组中所有GoodRing对象的面积之和
*/
public static double totalArea(GoodRing[] goodRings){
double ans=0;
for(GoodRing ring:goodRings){
ans+=ring.getArea();
}
return ans;
}
/**
*
* @param goodRings GoodRing[],表示传入的数组
*
* 将数组中的GoodRing对象按面积从大到小排序
*/
public static void sort(GoodRing[] goodRings){
Arrays.sort(goodRings, (o1, o2) -> Double.compare(o2.getArea(), o1.getArea()));
}
/**
*
* @param goodRings GoodRing[],表示传入的数组
* 输出数组中所有的GoodRing对象,包括内外半径、颜色和面积。每行输出一个GoodRing对象
*/
public static void outputGoodRings(GoodRing[] goodRings){
for(GoodRing ring:goodRings){
System.out.print("内半径:"+ring.getInnerRadius()+" ");
System.out.print("外半径:"+ring.getOuterRadius()+" ");
System.out.print("填充颜色:"+ring.getFillColor()+" ");
System.out.println("环的面积:"+ring.getArea());
}
}
}
Main类:
package ex01;
import java.util.Scanner;
/**
* @author Administrator
*/
public class Main {
public static void main(String[] args) {
// (1)从键盘输入要创建的GoodRing对象的个数n
Scanner sc=new Scanner(System.in);
System.out.print("输入要创建的GoodRing对象的个数n:");
int n=sc.nextInt();
sc.close();
// (2)创建n个GoodRing对象的数组
GoodRing[] goodRings=GoodRingUtil.createGoodRings(n);
System.out.println();
// (3)输出n个GoodRing对象的面积之和
System.out.println(n+"个GoodRing对象的面积之和为:"+GoodRingUtil.totalArea(goodRings));
System.out.println();
// (4)输出所有GoodRing对象
System.out.println("所有GoodRing对象分别为:");
GoodRingUtil.outputGoodRings(goodRings);
System.out.println();
// (5)对数组进行排序
GoodRingUtil.sort(goodRings);
// (6)输出所有GoodRing对象
System.out.println("排序后,所有GoodRing对象分别为:");
GoodRingUtil.outputGoodRings(goodRings);
}
}
若有错误,欢迎大家指出 ^ _ ^