实验目的:
- 掌握包的定义和引用语法;
- 理解封装性的目的:为什么定义private变量、public方法?
- 掌握父子类之间的继承原则:哪些内容可以被继承,哪些内容不可以被继承
- 掌握super关键字的用法:super前缀,super方法
- 掌握方法覆盖的语法、注意事项
- 进一步熟练掌握类的组合关系:Color和ColoredCircle之间也是组合关系
●参考学时:2学时
●基本要求:
- 创建项目“Java实验”,将实验一、实验二分别组织到“实验1”、“实验2”包中,并合理设置实验2中的属性、方法的访问权限修饰符;
- 在“实验3”包中编写颜色类“实验3.Color”,其实现要求包括:
- 包含三个颜色分量red、green和blue(取值范围必须为0-255);
- 构造方法Color()和Color(int r,int g,int b):注意取值范围规定
- 设置颜色值方法
- void setRed(int v):注意取值范围规定
- void setGreen(int v) :注意取值范围规定
- void setBlue(int v) :注意取值范围规定
- 获取颜色值方法
- int getRed();int getGreen();int getBlue()
- 编写“实验2.Circle”类的子类“实验3.ColoredCircle”类,该类的圆心、半径等属性均使用Circle中的定义。其余实现要求包括:
- 表示圆周颜色的Color类对象borderColor和圆心颜色对象centerColor
- 至少定义如下几个ColoredCircle构造方法:
- ColoredCirle():将半径赋为0,将圆心赋为(0,0)点,将两个颜色赋为Color(0,0,0)对象
- ColoredCirle(Point center,int radius):半径为radius,圆心为center,颜色为(0,0,0)
- ColoredCirle(Color centerColor,Color borderColor):半径为0,圆心为(0,0)点,颜色分别为centerColor和borderColor
- ColoredCirle(Point center, int radius, Color centerColor, Color borderColor):圆心为center,半径为radius,圆心颜色为centerColor,边框颜色为borderColor
- 设置颜色方法:
- void setCenterColor(Color c)
- void setBorderColor(Color c)
- 获取颜色方法:
- Color getCenterColor()
- Color getBorderColor()
- 重新定义的relation(Circle c)方法(方法覆盖)
- 在“实验3”包中编写测试ColoredCircle类的测试类Test,并在该类的main方法中调用ColoredCircle类的所有方法(包括从Circle继承来的方法),输出返回值(如有必要),以验证其正确性
●实验提示:
- 创建“Java实验”项目的目的是将之前的实验1、实验2的内容,以及今后的所有实验文件统一组织在一个项目内,不同的实验具有不同的包名,实验与实验之间可跨包复用。完整的项目结构应符合图3.1所示内容:
图3.1实验项目文件夹的浏览效果
- Color类所表示的对象是“红绿蓝颜色模型”的简单抽象,即用三个整数(0-255范围)代表某颜色的三种原色取值。比如(red=0,green=0,blue=0)代表黑色,(red=255,green=0,blue=0)代表红色,(red=255,green=255,blue=255)代表白色。
- ColoredCircle是具有额外属性和方法的Circle子类,但是其本质仍然是“圆”,因为ColoredCircle同样具有圆心、半径属性(隐藏于父类Circle中)和计算面积、计算周长的方法。
- ColoredCircle类中唯一需要重写的父类方法是relation(Circle c)(注意relation(Circle c)方法的形参类型),因为在当前的抽象层次上,带颜色圆和一般圆的唯一不同点是圆和圆的关系不同,面积方法、周长方法、setter、getter方法无需改变。
- relation(Circle c)方法首先应判断c是Circle对象还是ColoredCircle对象。如果c不是ColoredCircle对象,则调用父类的relation方法,并把同一圆关系调整为同心圆(即带颜色的圆和不带颜色的圆不可能是同一圆,最多是同心圆)。如果c是ColoredCircle对象,则可以在同一个圆的基础上进一步判断颜色是否一样(即首先调用父类的relation方法,并根据返回值判断是否为同一圆。如果是,则进一步判断颜色是否相同。只有圆心重合、半径相同,且颜色相同,则两个带颜色圆的关系才是同一圆;颜色不同的圆心重合、半径相同圆归类为同心圆。父类的relation方法返回值为非同一圆,则无需判断颜色)。
- 任何一个类的缺省、无参构造方法将自动调用父类的无参构造方法。另一方面,任何子类都不能继承父类的构造方法。因此,在ColoredCircle类中编写上述若干构造方法,并在这些方法的开始处通过super()或super(…)调用父类的构造方法,以达到初始化父类中定义的成员变量目的。
表3.1 测试案例(仅用于编码测试)
编号 | 测试目的 | 输入或测试数据 | 期望结果 |
1 | 成员的private、public修饰 | 创建实验2.Point()对象p和实验2.Circle()对象c | p.x、p.y、c.center、c.radius提示语法错误 |
2 | Color类构造方法 | 创建Color() | getRed()、getGreen()和getBlue()皆返回0 |
3 | Color类构造方法 | 创建Color(255,255,255) | getRed()、getGreen()和getBlue()皆返回255 |
4 | Color类构造方法 | 创建Color(355,355,355) | getRed()、getGreen()和getBlue()皆返回0 |
5 | Color类getter、setter方法 | 调用setRed(355)、setGreen(355)、setBlue(355) | getRed()、getGreen()和getBlue()皆返回创建颜色对象时的原始red、green、blue值 |
6 | ColoredCircle类构造方法 | 调用ColoredCirle()创建圆; 调用ColoredCirle(null,-1); 调用ColoredCirle(null,null) | getRadius()、area()、perimeter()、getCenter().getX()、getCenter(). getY()、getBorderColor().getRed()、getCenterColor().getRed()等值皆为0 |
7 | ColoredCircle类构造方法 | 调用ColoredCirle(new Point(0,0), 10); | getRadius()为10,area()为314.159,perimeter()为62.831,getCenter().getX()、getCenter(). getY()、getBorderColor().getRed()、getCenterColor().getRed()等值皆为0 |
8 | ColoredCircle类构造方法 | 调用ColoredCirle( new Color(0,0,0), new Color(1,1,1) ) | getRadius()为0;area()为0;perimeter()为0;getCenter(). getX()为0;getCenter().getY()为0;centerColor的所有get方法返回值皆为0;borderColor的所有get方法返回值皆为1 |
9 | ColoredCircle类构造方法 | 调用ColoredCirle(Point center, int radius, Color centerColor, Color borderColor) 创建圆:center为(1,1),radius为10,centerColor为(0,0,0),borderColor为(1,1,1) | getRadius()为10;area()为314.159;perimeter()为62.831;getCenter(). getX()为1;getCenter().getY()为1;centerColor的所有get方法返回值皆为0;borderColor的所有get方法返回值皆为1 |
10 | ColoredCircle类构造方法 | 调用ColoredCirle(Point center, int radius, Color centerColor, Color borderColor) 创建圆:center为null,radius为-10,centerColor为null,borderColor为null | getRadius()为0;area()为0;perimeter()为1;getCenter(). getX()为0;getCenter().getY()为0;centerColor的所有get方法返回值皆为0;borderColor的所有get方法返回值皆为0 |
11 | ColoredCircle类setter方法 | setCenterColor(null) | 创建ColoredCircle时的原始centerColor值不变 |
12 | ColoredCircle类setter方法 | setBorderColor(null) | 创建ColoredCircle时的原始borderColor值不变 |
13 | 子类中编写的方法覆盖 | 调用Circle()创建圆c1,调用ColoredCircle()创建圆c2,并调用c2.relation(c1) | 显示“同心圆” |
14 | 子类中编写的方法覆盖 | 调用ColoredCircle()创建圆c1,调用ColoredCircle()创建圆c2,并调用c2.relation(c1) | 显示“同一圆” |
15 | 子类中编写的方法覆盖 | 调用ColoredCircle(centerColor, borderColor)创建圆c1,其中centerColor为(1,1,1),borderColor为(1,1,1);调用ColoredCircle()创建圆c2,并调用c2.relation(c1) | 显示“同心圆” |
代码部分
Color类
package shiyan3;
public class Color {
private int red, green, blue;
Color() {
this.red = 0;
this.green = 0;
this.blue = 0;
}
public Color(Color a) {
if (a == null) {
this.red = 0;
this.green = 0;
this.blue = 0;
return;
}
this.red = a.getRed();
this.green = a.getGreen();
this.blue = a.getBlue();
}
public Color(int r, int g, int b) {
this.red = r;
this.green = g;
this.blue = b;
}
public void setRed(int v) {
if (v >= 0 && v <= 255) {
this.red = v;
}
}
public void setGreen(int v) {
if (v >= 0 && v <= 255) {
this.green = v;
}
}
public void setBlue(int v) {
if (v >= 0 && v <= 255) {
this.blue = v;
}
}
public int getRed() {
if (red >= 0 && red <= 255) {
return red;
} else {
return 0;
}
}
public int getGreen() {
if (green >= 0 && green <= 255) {
return green;
} else {
return 0;
}
}
public int getBlue() {
if (blue >= 0 && blue <= 255) {
return blue;
} else {
return 0;
}
}
}
ColoredCircle类
package shiyan3;
import shiyan2.Circle;
import shiyan2.Point;
public class ColoredCircle extends Circle {
private Color borderColor;
private Color centerColor;
public ColoredCircle() {
super(0, 0, 0);
borderColor = new Color(0, 0, 0);
centerColor = new Color(0, 0, 0);
}
public ColoredCircle(Point center, int radius) {
super(center, radius);
this.borderColor = new Color();
this.centerColor = new Color();
}
public ColoredCircle(Color centerColor, Color borderColor) {
super(0, 0, 0);
if (centerColor == null || borderColor == null) {
this.centerColor = new Color();
this.borderColor = new Color();
return;
}
this.centerColor = centerColor;
this.borderColor = borderColor;
}
public ColoredCircle(Point center, int radius, Color centerColor, Color borderColor) {
super(center, radius);
this.centerColor = centerColor;
this.borderColor = borderColor;
}
public void setCenterColor(Color c) {
if (c == null) {
return;
}
this.centerColor = c;
}
public void setBorderColor(Color c) {
if (c == null) {
return;
}
this.borderColor = c;
}
public Color getCenterColor() {
return centerColor;
}
public Color getBorderColor() {
return borderColor;
}
public int relation(Circle c) {
int i = super.relation(c);
if (c instanceof ColoredCircle) {
ColoredCircle a = (ColoredCircle) c;
if (i == 0) {
if (this.borderColor.getRed() == a.borderColor.getRed() && this.borderColor.getGreen() == a.borderColor.getGreen() && this.borderColor.getBlue() == a.borderColor.getBlue()) {
return 0;
} else {
return 1;
}
} else {
return i;
}
} else {
if (i == 0) {
return 1;
} else {
return i;
}
}
}
}
Test类
package shiyan3;
import shiyan2.Circle;
import shiyan2.Point;
public class Test {
public static void main(String[] args) {
System.out.println("--------分割线1-----------");
Point p = new Point();
Circle c = new Circle();
//p.x;p.y;c.center;c.radius;
System.out.println("--------分割线2-----------");
Color c1 = new Color();
System.out.println(c1.getRed());
System.out.println(c1.getGreen());
System.out.println(c1.getBlue());
System.out.println("--------分割线3-----------");
Color c2 = new Color(255, 255, 255);
System.out.println(c2.getRed());
System.out.println(c2.getGreen());
System.out.println(c2.getBlue());
System.out.println("--------分割线4-----------");
Color c3 = new Color(355, 355, 355);
System.out.println(c3.getRed());
System.out.println(c3.getGreen());
System.out.println(c3.getBlue());
System.out.println("--------分割线5-----------");
Color c5 = new Color();
c5.setRed(355);
c5.setGreen(355);
c5.setBlue(355);
System.out.println(c5.getRed());
System.out.println(c5.getGreen());
System.out.println(c5.getBlue());
System.out.println("--------分割线6.1-----------");
ColoredCircle c6 = new ColoredCircle();
System.out.println(c6.getRadius());
System.out.println(c6.area());
System.out.println(c6.perimeter());
System.out.println(c6.getCenter().getX());
System.out.println(c6.getCenter().getY());
System.out.println(c6.getBorderColor().getRed());
System.out.println(c6.getCenterColor().getRed());
System.out.println("--------分割线6.2-----------");
ColoredCircle c7 = new ColoredCircle(null, -1);
System.out.println(c7.getRadius());
System.out.println(c7.area());
System.out.println(c7.perimeter());
System.out.println(c7.getCenter().getX());
System.out.println(c7.getCenter().getY());
System.out.println(c7.getBorderColor().getRed());
System.out.println(c7.getCenterColor().getRed());
System.out.println("--------分割线6.3-----------");
ColoredCircle c8 = new ColoredCircle(null, null);
System.out.println(c8.getRadius());
System.out.println(c8.area());
System.out.println(c8.perimeter());
System.out.println(c8.getCenter().getX());
System.out.println(c8.getCenter().getY());
System.out.println(c8.getBorderColor().getRed());
System.out.println(c8.getCenterColor().getRed());
System.out.println("--------分割线7-----------");
ColoredCircle c9 = new ColoredCircle(new Point(0, 0), 10);
System.out.println(c9.getRadius());
System.out.println(c9.area());
System.out.println(c9.perimeter());
System.out.println(c9.getCenter().getX());
System.out.println(c9.getCenter().getY());
System.out.println(c9.getBorderColor().getRed());
System.out.println(c9.getCenterColor().getRed());
System.out.println("--------分割线8-----------");
ColoredCircle c10 = new ColoredCircle(new Color(0, 0, 0), new Color(1, 1, 1));
System.out.println(c10.getRadius());
System.out.println(c10.area());
System.out.println(c10.perimeter());
System.out.println(c10.getCenter().getX());
System.out.println(c10.getCenter().getY());
System.out.println(c10.getCenterColor().getRed() + " " + c10.getCenterColor().getBlue() + " " + c10.getCenterColor().getGreen());
System.out.println(c10.getBorderColor().getRed() + " " + c10.getBorderColor().getBlue() + " " + c10.getBorderColor().getGreen());
System.out.println("--------分割线9-----------");
Point center = new Point(1, 1);
int radius = 10;
Color centerColor = new Color(0, 0, 0);
Color borderColor = new Color(1, 1, 1);
ColoredCircle c11 = new ColoredCircle(center, radius, centerColor, borderColor);
System.out.println(c11.getRadius());
System.out.println(c11.area());
System.out.println(c11.perimeter());
System.out.println(c11.getCenter().getX());
System.out.println(c11.getCenter().getY());
System.out.println(c11.getCenterColor().getRed() + " " + c11.getCenterColor().getBlue() + " " + c11.getCenterColor().getGreen());
System.out.println(c11.getBorderColor().getRed() + " " + c11.getBorderColor().getBlue() + " " + c11.getBorderColor().getGreen());
System.out.println("--------分割线10-----------");
center = new Point(null);
radius = -10;
centerColor = new Color(null);
borderColor = new Color(null);
ColoredCircle c12 = new ColoredCircle(center, radius, centerColor, borderColor);
System.out.println(c12.getRadius());
System.out.println(c12.area());
System.out.println(c12.perimeter());
System.out.println(c12.getCenter().getX());
System.out.println(c12.getCenter().getY());
System.out.println(c12.getCenterColor().getRed() + " " + c12.getCenterColor().getBlue() + " " + c12.getCenterColor().getGreen());
System.out.println(c12.getBorderColor().getRed() + " " + c12.getBorderColor().getBlue() + " " + c12.getBorderColor().getGreen());
System.out.println("--------分割线11-----------");
Color c13 = new Color(12, 12, 12);
Color c14 = new Color(13, 13, 13);
ColoredCircle c15 = new ColoredCircle(c13, c14);
c15.setCenterColor(null);
System.out.println(c15.getCenterColor().getRed() + " " + c15.getCenterColor().getGreen() + " " + c15.getCenterColor().getBlue());
System.out.println("--------分割线12-----------");
c15.setBorderColor(null);
System.out.println(c15.getBorderColor().getRed() + " " + c15.getBorderColor().getGreen() + " " + c15.getBorderColor().getBlue());
System.out.println("--------分割线13-----------");
Circle c16 = new Circle();
ColoredCircle c17 = new ColoredCircle();
int a = c17.relation(c16);
if (a == 0) {
System.out.println("同一个圆");
} else if (a == 1) {
System.out.println("同心圆");
} else if (a == 2) {
System.out.println("相交的圆");
} else if (a == 3) {
System.out.println("分离的圆");
} else if (a == 4) {
System.out.println("包含的圆");
}
System.out.println("--------分割线14-----------");
ColoredCircle c18 = new ColoredCircle();
ColoredCircle c19 = new ColoredCircle();
int b = c19.relation(c18);
if (b == 0) {
System.out.println("同一个圆");
} else if (b == 1) {
System.out.println("同心圆");
} else if (b == 2) {
System.out.println("相交的圆");
} else if (b == 3) {
System.out.println("分离的圆");
} else if (b == 4) {
System.out.println("包含的圆");
}
System.out.println("--------分割线15-----------");
centerColor = new Color(1, 1, 1);
borderColor = new Color(1, 1, 1);
ColoredCircle c20 = new ColoredCircle(centerColor, borderColor);
ColoredCircle c21 = new ColoredCircle();
int d = c21.relation(c20);
if (d == 0) {
System.out.println("同一个圆");
} else if (d == 1) {
System.out.println("同心圆");
} else if (d == 2) {
System.out.println("相交的圆");
} else if (d == 3) {
System.out.println("分离的圆");
} else if (d == 4) {
System.out.println("包含的圆");
}
}
}