内容要求:

一、实验目的

(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对象
    }
}