实验目的
掌握类继承的实现;掌握方法的继承、重载与覆盖;理解子类构造方法与父类构造方法之间的关系;理解抽象类和抽象方法;理解接口的定义;掌握接口的实现。
实验性质
验证性实验+设计性实验
实验内容
(1)分析调试教材的第4章中的实例
(2)根据下面的要求实现圆类Circle
- 成员变量:radius
- 方法:
- 构造方法: Circle(),将半径置为0;
Circle(int r),将半径置初始化为r; - 修改器/访问器:对半径进行操作;
- double getPerimeter();获得圆的周长;
- double getArea();获得圆的面积;
- void show();将圆的半径、周长、面积输出
- 构造方法: Circle(),将半径置为0;
import java.math.BigDecimal;
public class Exercises2 {
public static void main(String[] args) {
Circle user = new Circle();
user=new Circle(3);
System.out.println("圆的半径为"+user.get()); //调用get方法,获取半径
user.set(5); //调用set方法,设置半径
System.out.println("圆的半径更改为"+user.get()); //调用get方法,获取更改后的半径
System.out.println("该半径圆的周长为"+user.getPerimeter()); //调用getPerimeter方法,获取周长
System.out.println("该半径圆的面积为"+user.getArea()); //调用getArea方法,获取面积
System.out.println("show方法:");
user.show(user.getPerimeter()); //调用show方法
}
}
class Circle{
private static final double PI = 3.14;
int r;
double perimeter;
double area;
public Circle() {
r=0;
}
public Circle(int r) {
this.r=r;
}
void set(int r) {
this.r=r;
}
double get() {
return r;
}
BigDecimal getPerimeter() {
//计算面积
BigDecimal a = BigDecimal.valueOf(2*r); //高精度计算使用BigDecimal类
BigDecimal b = BigDecimal.valueOf(PI);
BigDecimal c = a.multiply(b);
return c;
}
double getArea() {
area=r*r*PI;
return area;
}
void show(BigDecimal perimeter) {
System.out.println("半径:"+r);
System.out.println("周长:"+perimeter);
System.out.println("面积:"+area);
}
}
(3)编写一个程序,用于创建一个名为Employee的父类和两个名为Manager和Director的子类。要求创建Manager和Director的对象,并显示其详细信息。
- Employee类:属性(name,sex,address)
- 方法show()显示这些属性
- Manager类:属性(department),重写show方法
- Director类:属性(lengthOfService),重写show方法
public class Exercises3 {
public static void main(String[] args) {
Employee user1 = new Employee();
user1.show();
Employee user2 = new Manager();
user2.show();
Employee user3 = new Director();
user3.show();
}
}
class Employee{
String name = "轩轩同学";
String sex = "男";
String address = "XXXXX";
void show(){
System.out.println("姓名:"+name);
System.out.println("性别:"+sex);
System.out.println("地址:"+address);
}
}
class Manager extends Employee{
String department = "XXX工程";
void show(){
System.out.println("部门:"+department);
}
}
class Director extends Employee{
String lengthOfService = "XXXX";
void show() {
System.out.println("职务:"+lengthOfService);
}
}
(4)定义如下的类
1.Point类:用于描述坐标系中的一个点
- 属性:x、y,int类型,分别描述x坐标值和y坐标值;
- 方法:int distanceTo(Point p):计算两点之间的距离;
Point centerPoint(Point p):求两点之间的中心点; - Graphic抽象类:描述图形信息
- 属性:color(String类型,图形颜色)
- 方法:
构造方法:2个
无参的(颜色为空)
有参的(根据参数设置颜色信息)
void printInfo():显示图形信息
抽象方法:double getArea() 功能:计算图形面积
抽象方法:double getCircum() 功能:计算图形周长
2.Rect类:继承了Graphic类,用于描述矩形图形
- 添加属性: lefttop和rightbottom,均为Point类型,分别描述矩形的左上角和右下角点的坐标信息;
方法:
- 构造方法3个;
- 无参格式:利用基类无参构造方法设置基类部分信息,将两个点均设置为坐标原点;
- Rect(String color, Point lefttop, Point rightbottom)
- Rect(String color, int x_left, int y_top, int x_right, int y_bottom)
- 重写方法:getArea(),getCircum(),printInfo() 根据矩形信息进行相关处理;
- 添加方法:int getHeight(),求出矩形的高;
- int getWidth(),求出矩形的宽;
- boolean isRect():基于两点信息判断是否构成矩形;
3.Circle类继承了Graphic类,用于描述圆形图形
-
添加属性:center,为Point类型,描述圆形的圆心;
-
r,int类型,描述圆形半径
-
方法:
- 构造方法:根据实际需要,自行设定;
- 重写方法:getArea(),getCircum(), printinfo()根据圆形信息进行相关处理;
- 添加方法:
- void setinfo (string color, point center, int r):根据参数设置圆形的属性
- void changeSize(int):根据参数缩放圆形大小(提示:对半径进行修改)
- 定义主程序类,分别创建矩形对象和圆形对象,并对其操作验证类定义是否正确;同时练习向上转型和向下转型,加深对面向对象的多态性的理解。
public class Exercises4 {
public static void main(String[] args) {
Point a = new Point(1,1);
Point b = new Point(3,3);
Point x = new Point();
x.printPoint(a, b); System.out.println("间隔距离为"+b.distanceTo(a));
x=b.centerPoint(a);
x.printPoint(a, b); System.out.println("中心点为"+"("+x.x+","+x.y+")");
//矩形
Rect c = new Rect("红色",a,b);
x.printPoint(a, b); System.out.println("是否可以围成矩形? "+c.isRect());
x.printPoint(a, b); System.out.println("围成矩形的面积为"+c.getArea());
x.printPoint(a, b); System.out.println("围成矩形的周长为"+c.getCircum()+" 长为"+c.getHeight()+" 宽为"+c.getWidth()+" "+c.getHeight()+" "+c.getWidth());
Point a1=new Point(5,5);
Point b1=new Point(7,7);
Point x1=new Point(6,6);
Rect c1 = new Rect("绿色",a1,b1);
Graphic example2;
example2=c1;
x.printPoint(a, b);System.out.print("围成的矩形 与");
x.printPoint(a1, b1);System.out.println("围成的矩形 "+c.compareTo(example2));
System.out.print("("+x1.x+","+x1.y+")是否在");x.printPoint(a, b);System.out.println("围成的矩形里?"+c.pointIsIn(x1));
//圆形
Graphic example1;
Point first = new Point(0,0);
Circle2 d =new Circle2(first,4);
Point second = new Point(51,51);
Circle2 d2 = new Circle2(second,3);
System.out.println("以("+first.x+","+first.y+")为圆心,半径为4的圆的面积为"+d.getArea()+" 周长为"+d.getCircum());
example1=d2;
System.out.println("“圆心为("+d.Center.x+","+d.Center.y+") 半径为"+d.r+"的圆” 与 "
+ "“圆心为("+d2.Center.x+","+d2.Center.y+") 半径为"+d2.r+"的圆” "+d.compareTo(example1));
System.out.print("("+second.x+","+second.y+")是否在以("+first.x+","+first.y+")为圆心,半径为4的圆里");System.out.println(d.pointIsIn(second));
//向上转型
Graphic e =c;
e.printInfo();
//向下转型
Graphic f = null;
if(e instanceof Rect) {
c=(Rect)e;
System.out.println("c=(Rect)e "+"向下转型成功");
}
else {
}
if(f instanceof Rect) {
c=(Rect)f;
}
else
System.out.println("c=(Rect)f "+"向下转型失败");
}
}
//点类
class Point{
double x;
double y;
Point(){
}
public Point(int x,int y) {
this.x=x;
this.y=y;
}
double distanceTo(Point p) {
return Math.sqrt((this.x-p.x)*(this.x-p.x)+(this.y-p.y)*(this.y-p.y));
}
Point centerPoint(Point p) {
Point x = new Point();
x.x=(p.x+this.x)/2;
x.y=(p.y+this.y)/2;
return x;
}
public void printPoint(Point a,Point b) {
System.out.print("("+a.x+","+a.y+")与("+b.x+","+b.y+")");
}
public boolean equals(Point x2) {
if(this.x==x2.x&&this.y==x2.y)
return false;
return true;
}
}
//图形类
abstract class Graphic{
String color;
public Graphic() {
color="无色";
}
public Graphic(String color) {
this.color=color;
}
void printInfo() {
};
abstract double getArea();
abstract double getCircum();
}
//矩形类
class Rect extends Graphic implements GraphicOperate{
Point lefttop=new Point();
Point rightbottom = new Point();
public Rect(){
lefttop.x=0;
lefttop.y=0;
rightbottom.x=0;
rightbottom.y=0;
}
public Rect(String color, Point lefttop, Point rightbottom) {
this.color=color;
this.lefttop=lefttop;
this.rightbottom=rightbottom;
}
public Rect(String color, int x_left, int y_top, int x_right, int y_bottom){
this.color=color;
this.lefttop.x=x_left;
this.lefttop.y=y_top;
this.rightbottom.x=x_right;
this.rightbottom.y=y_bottom;
}
double getArea(){
//返回矩形面积
return (lefttop.x-rightbottom.x)*(lefttop.y-rightbottom.y);
}
double getCircum(){
//返回矩形周长
return Math.abs((lefttop.x-rightbottom.x)*2+(lefttop.y-rightbottom.y)*2);
}
void printInfo(){
//输出矩形信息
System.out.print("调用输出函数输出结果:");
System.out.print("面积:"+getArea());
System.out.print(" 周长:"+getCircum());
System.out.print(" 颜色:"+this.color); System.out.println();
};
double getHeight() {
//获取高
return Math.abs(lefttop.y-rightbottom.y);
}
double getWidth() {
//获取宽
return Math.abs(lefttop.x-rightbottom.x);
}
boolean isRect() {
//判断是否能够成矩形 两点不同能构成 两点相同则不能
if(this.lefttop.equals(this.rightbottom))
return true;
return false;
}
public String compareTo(Graphic example) {
Rect p = new Rect();
if(example instanceof Rect) {
p=(Rect)example;
Point center1 = new Point();
center1.x=Math.abs((p.rightbottom.x+p.lefttop.x)/2);
center1.y=Math.abs((p.rightbottom.y+p.lefttop.y)/2);
Point center2 = new Point();
center2.x=Math.abs((this.rightbottom.x+this.lefttop.x)/2);
center2.y=Math.abs((this.rightbottom.y+this.lefttop.y)/2);
if((Math.abs(center1.x-center2.x)>=(p.getWidth()/2+this.getWidth()/2))&&(Math.abs(center1.y-center2.y)>=(p.getHeight()/2+this.getHeight()/2))) {
return "不相交";
}
else {
return "相交";
}
}
return "转型失败";
}
public boolean pointIsIn(Point example) {
if(example.x>this.lefttop.x&&example.x<this.rightbottom.x&&example.y>this.lefttop.y&&example.y<this.rightbottom.y) {
return true;
}
return false;
}
}
//圆形类
class Circle2 extends Graphic implements GraphicOperate{
Point Center = new Point();
int r;
Circle2(){
}
public Circle2(Point Center2,int r) {
//构造函数设置初始化r
this.r=r;
Center=Center2;
}
double getArea() {
//计算圆的面积
return 3.14*r*r;
}
double getCircum() {
//计算圆的周长
return 3.14*2*r;
}
void changeSize(int r) {
//修改r
this.r=r;
}
public String compareTo(Graphic example) {
Circle2 p= new Circle2();
if(example instanceof Circle2) {
p=(Circle2)example;
if(((this.Center.x)-(p.Center.x))*((this.Center.x)-(p.Center.x))+((this.Center.y)-(p.Center.y))*((this.Center.y)-(p.Center.y))>this.r+p.r)
return "相离";
else if(((this.Center.x)-(p.Center.x))*((this.Center.x)-(p.Center.x))+((this.Center.y)-(p.Center.y))*((this.Center.y)-(p.Center.y))==this.r+p.r)
return "相切";
else
return "相交";
}
return "转型失败";
}
public boolean pointIsIn(Point example) {
if(((this.Center.x)-(example.x))*((this.Center.x)-(example.x))+((this.Center.y)-(example.y))*((this.Center.y)-(example.y))<=this.r) {
return true;
}
return false;
}
}
//接口
interface GraphicOperate {
String compareTo(Graphic example);
boolean pointIsIn(Point example);
}
(5)对(4)题进一步补充:
- 定义接口:GraphicOperate,用于完成图形对象的操作
- 成员有:int compareTo(Graphic):比较两个图形的关系(重合、相交、不相交)
- boolean pointIsIn(Point):判断参数点坐标是否在图形区域中
- 要求Rect和Circle两个类实现该接口。
- 编写程序,验证正确性。
已经将代码整合到(4)中