一、实验目的
(1)理解对象和类,掌握用类创建对象模型。
(2)理解和掌握数据域封装,可见性修饰符的使用
(3)学习如何定义类和创建对象,理解对象引用变量的概念。
(4)理解构造方法的作用,并使用构造方法创建类的对象。
二、实验内容
按照如下步骤完成实验:
步骤1:创建一个Java Project,命名为:exp05
步骤2:所有边长度都相同且所有角的度数都相同的多边形称为“正n边形”。
按下面要求定义一个类表示正n边形:
(1) 类名:RegularPolygon,放置在包exp05.shape中;
(2) 一个名为numberOfSides的int型私有数据域,表示多边形的边数,默认值为3;
(3) 一个名为lengthOfSide的double型私有数据域,表示多边形的边长,默认值为1.0;
(4) 一个名为x的double型私有数据域,表示多边形中心点的横坐标,默认值是0.0;
(5) 一个名为y的double型私有数据域,表示多边形中心点的纵坐标,默认值是0.0;
(6) 一个创建带默认值的正多边形对象的无参构造方法,,使用恰当的可见性修饰符修饰;
(7) 一个能创建指定边数和边长度、中心在(0,0)的正多边形对象的构造方法,,使用恰当的可见性修饰符修饰;
(8) 一个能创建指定边数和边长度、中心在(x,y)的正多边形对象的构造方法,,使用恰当的可见性修饰符修饰;
(9) 所有数据域的访问器和修改器;
(10)一个返回正多边形面积的方法:double getArea(),使用恰当的可见性修饰符修饰,面积公式如下:
其中,n是多边形的边数;s是多边形的边长。
(11)一个返回正多边形中心点到坐标原点距离的方法:double getDistance(),使用恰当的可见性修饰符修饰;
(12)覆盖toString方法,返回 “[边数, 边长]@(x,y)”形式的字符串;
(13)覆盖equals方法,当多边形对象的中心坐标、边数、边长均相同时,返回true,其他情况返回false;
(14)覆盖hashcode方法,要求:r1.equals(r2)返回为true时,r1.hashcode()与r2.hashcode()的返回值相同。
步骤3:定义一个主类Main,放置在包exp05.main中,在主类中完成以下工作:
(1) 从键盘输入需要创建的多边形对象的个数n;
(2) 依次输入每个多边形的:边数、边长度、中心坐标,并创建多边形对象;
(3) 输出所有的多边形对象,以 “[边数, 边长]@(x,y)”形式;
(4)以 “[边数, 边长]@(x,y)”形式输出面积最大的多边形及其面积;
(5)以 “[边数, 边长]@(x,y)”形式输出距离坐标原点最近的多边形及其距离。
分析:按照题目要求完成即可,唯一的难点是equals方法和hashcode方法的重写。这里简单介绍一下这两个方法,object类里定义了这两种方法,equals方法用于判断两个地址是否指向同一对象,是的话返回true,否则返回false。hashcode方法返回一个对象的哈希值,哈希值是通过不唯一的特殊算法计算出的一个对象的int整型值,哈希值用于哈希表的查找。并且equals和hashcode一般都要同时重写。具体参考视频【每天一个技术点】hashCode()到底有什么用,为啥一定要和equals()重写
代码片段如下:
package exp05.shape;
//类表示正n边形
public class RegularPolygon {
private int numberOfSides;
private double lengthOfSide;
private double x;
private double y;
//带默认值的无参构造方法
public RegularPolygon() {
this.numberOfSides=3;
this.lengthOfSide=1.0;
this.x=0.0;
this.y=0.0;
}
//能创建指定边数和边长度、中心在(0,0)的正多边形对象的构造方法
public RegularPolygon(int numberOfSides, double lengthOfSide) {
this.numberOfSides = numberOfSides;
this.lengthOfSide = lengthOfSide;
this.x = 0.0;
this.y = 0.0;
}
//能创建指定边数和边长度、中心在(x,y)的正多边形对象的构造方法
public RegularPolygon(int numberOfSides, double lengthOfSide, double x, double y) {
this.numberOfSides = numberOfSides;
this.lengthOfSide = lengthOfSide;
this.x = x;
this.y = y;
}
//返回正多边形面积的方法
public double getArea(){
return numberOfSides*lengthOfSide*lengthOfSide/4*Math.tan(Math.PI/numberOfSides);
}
//返回正多边形中心点到坐标原点距离的方法
public double getDistance(){
return Math.sqrt(x*x+y*y);
}
//覆盖toString方法,返回 “[边数, 边长]@(x,y)”形式的字符串
@Override
public String toString(){
return "["+numberOfSides+", "+lengthOfSide+"]@("+x+","+y+")";
}
//覆盖equals方法,当多边形对象的中心坐标、边数、边长均相同时,返回true,其他情况返回false
@Override
public boolean equals(Object O){
if(O == null) return false;
if(this.getClass()!= O.getClass()) return false;
RegularPolygon r = (RegularPolygon) O;
if(this.x!=r.x || this.y!=r.y||this.lengthOfSide!=r.lengthOfSide||this.numberOfSides!=r.numberOfSides)
return false;
return true;
}
//覆盖hashcode方法,要求:r1.equals(r2)返回为true时,r1.hashcode()与r2.hashcode()的返回值相同
@Override
public int hashCode(){
int result = hashCode();
if(result == 0){
result = 17;
result = 31*result + (int)this.x;
result = 31*result + (int)this.y;
result = 31*result + (int)this.lengthOfSide;
result = 31*result + this.numberOfSides;
}
return result;
}
//以下是所有数据域的访问器和修改器
public int getNumberOfSides() {
return numberOfSides;
}
public void setNumberOfSides(int numberOfSides) {
this.numberOfSides = numberOfSides;
}
public double getLengthOfSide() {
return lengthOfSide;
}
public void setLengthOfSide(double lengthOfSide) {
this.lengthOfSide = lengthOfSide;
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
}
package exp05.shape;
import java.util.Scanner;
//主类
public class Main {
public static void main(String[] args) {
//(1) 从键盘输入需要创建的多边形对象的个数n;
int n;
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
//(2) 依次输入每个多边形的:边数、边长度、中心坐标,并创建多边形对象;
RegularPolygon[] rp=new RegularPolygon[n];
for(int i=0;i<n;i++){
int numberOfSides;
double lengthOfSide;
double x;
double y;
numberOfSides=sc.nextInt();
lengthOfSide=sc.nextDouble();
x=sc.nextDouble();
y=sc.nextDouble();
rp[i]=new RegularPolygon(numberOfSides,lengthOfSide,x,y);
}
//(3) 输出所有的多边形对象,以 “[边数, 边长]@(x,y)”形式;
System.out.println("所有的多边形对象如下");
for(int i=0;i<n;i++){
System.out.println(rp[i].toString());
}
//(4)以 “[边数, 边长]@(x,y)”形式输出面积最大的多边形及其面积;
//(5)以 “[边数, 边长]@(x,y)”形式输出距离坐标原点最近的多边形及其距离
int areaMax=0;
int distanceMax=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(rp[i].getArea()<rp[j].getArea())areaMax=j;
if(rp[i].getDistance()>rp[j].getDistance())distanceMax=j;
}
}
System.out.println("\n面积最大的多边形为:");
System.out.println(rp[areaMax].toString());
System.out.printf("其面积为%.2f\n",rp[areaMax].getArea());
System.out.println("\n距离坐标原点最近的多边形为:");
System.out.println(rp[distanceMax].toString());
System.out.printf("其距离为%.2f\n",rp[distanceMax].getArea());
}
}