内容要求:
一、实验目的
(1)理解和掌握可见性修饰符,使用访问器和修改器对数据域进行封装。
(2)理解和掌握对象作为方法的参数和返回值。
二、实验内容
实验1中的程序能够正常运行了,但是其中的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对象;
代码片段如下:
public class GoodRing {
private double innerRadius;
private double outerRadius;
String fillColor;
public GoodRing(){//无参构造方法
}
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;
}
public double getArea(){//获取面积
return (outerRadius*outerRadius-innerRadius*innerRadius)*Math.PI;
}
public double getInnerCircumference(){//获取内圆周长
return innerRadius*2*Math.PI;
}
public double getOuterCircumference(){//获取外圆周长
return outerRadius*2*Math.PI;
}
}
//(1)构造方法名应该改为什么?用哪个可见性修饰符修饰构造方法比较合理?
//A:构造方法名应与类名一致,改为GoodRing,用public修饰
//(2)3个数据域应该用哪个可见性修饰符修饰?编写对应的访问器和修改器并使用恰当的访问性修饰符。
//A:3个数据域应该用private修饰
//(3)计算方法应该用哪个可见性修饰符修饰比较合理?
//A:计算方法应该用public修饰
public class GoodRingUtil {
public GoodRing[] createGoodRings(int numGoodRing){//构建对象数组并对半径赋值
GoodRing[] arrGoodRing=new GoodRing[numGoodRing];
for(int i=0;i<numGoodRing;i++){
arrGoodRing[i]=new GoodRing();
arrGoodRing[i].setInnerRadius((double)(Math.random()*255));
arrGoodRing[i].setOuterRadius((double)(Math.random()*255));
if(arrGoodRing[i].getInnerRadius()>arrGoodRing[i].getOuterRadius()){//如果随机赋值后内圆半径大于外圆半径,则交换
double temp=arrGoodRing[i].getInnerRadius();
arrGoodRing[i].setInnerRadius(arrGoodRing[i].getOuterRadius());
arrGoodRing[i].setOuterRadius(temp);
}
}
return arrGoodRing;
}
public double totalArea(GoodRing[] arrGoodRing){//遍历对象数组,求面积之和
double allArea=0.0;
for(int i=0;i<arrGoodRing.length;i++){
allArea+=arrGoodRing[i].getArea();
}
return allArea;
}
public void sort(GoodRing[] arrGoodRing){//运用冒泡排序对对象数组按面积从大到小进行排序
for(int i=0;i<arrGoodRing.length;i++)
for(int j=i+1;j<arrGoodRing.length;j++){
if(arrGoodRing[i].getArea()<arrGoodRing[j].getArea()){
GoodRing temp=new GoodRing();
temp=arrGoodRing[i];
arrGoodRing[i]=arrGoodRing[j];
arrGoodRing[j]=temp;
}
}
}
public void outputGoodRings(GoodRing[] arrGoodRing){//输出该对象的半径、颜色、面积和周长
for(int i=0;i<arrGoodRing.length;i++){
System.out.printf("内圆半径:%.2f",arrGoodRing[i].getInnerRadius());
System.out.printf("\t外圆半径:%.2f",arrGoodRing[i].getOuterRadius());
System.out.printf("\t颜色:%s",arrGoodRing[i].getFillColor());
System.out.printf("\t面积:%.2f\n",arrGoodRing[i].getArea());
}
}
}
import java.util.Scanner;
public class TestGoodRing {
public static void main(String[] args) {
GoodRing goodRing = new GoodRing(5, 8, "RED");//创建一个GoodRing类的对象
System.out.println("修改前输出如下:");
System.out.printf("内圆半径:%.2f\n" ,goodRing.getInnerRadius());//输出该对象的半径、颜色、面积和周长
System.out.printf("外圆半径:%.2f\n" , goodRing.getOuterRadius());
System.out.printf("颜色:%s\n" ,goodRing.getFillColor());
System.out.printf("面积:%.2f\n" , goodRing.getArea());
System.out.printf("内圆周长:%.2f\n" , goodRing.getInnerCircumference());
System.out.printf("外圆周长:%.2f\n" , goodRing.getOuterCircumference());
goodRing.setInnerRadius(4);//修改内圆半径和外圆半径为4和9
goodRing.setOuterRadius(9);
System.out.println("\n修改后输出如下:");
System.out.printf("内圆半径:%.2f\n" ,goodRing.getInnerRadius());//输出该对象的半径、颜色、面积和周长
System.out.printf("外圆半径:%.2f\n" , goodRing.getOuterRadius());
System.out.printf("颜色:%s\n" ,goodRing.getFillColor());
System.out.printf("面积:%.2f\n" , goodRing.getArea());
System.out.printf("内圆周长:%.2f\n" , goodRing.getInnerCircumference());
System.out.printf("外圆周长:%.2f\n" , goodRing.getOuterCircumference());
Scanner sc = new Scanner(System.in);
System.out.println("\n请输入GoodRing对象数组容量:");
int numGoodRing = sc.nextInt();//从键盘输入要创建的GoodRing对象的个数n
GoodRingUtil goodRingUnit = new GoodRingUtil();
GoodRing[] arrGoodRing = goodRingUnit.createGoodRings(numGoodRing);//创建n个GoodRing对象的数组;
System.out.printf("所有GoodRing对象的面积之和:%.2f\n",goodRingUnit.totalArea(arrGoodRing));//输出n个GoodRing对象的面积之和
System.out.println("\n排序前输出如下:");
goodRingUnit.outputGoodRings(arrGoodRing);//输出所有GoodRing对象
goodRingUnit.sort(arrGoodRing);//对数组进行排序
System.out.println("\n排序后输出如下:");
goodRingUnit.outputGoodRings(arrGoodRing);//输出所有GoodRing对象
}
}