●
实验目的:
(1)
掌握编写不同包的子类时设置成员访问权限;
(2)
掌握
Object
类与其他类的关系以及
toString()
、
equals(Object o)
方法的作用;
(3)
掌握方法覆盖时必须保证方法原型的一致性;
(4)
掌握类型上转型(上溯)和下转型(下溯)的应用;
●
实验提示:
(1) equals
方法的参数类型必须是
Object
,访问修饰符必须是
public
,返回类型必须是
boolean
,否则该方法不是对从父类继承的
public boolean equals(Object obj)
方法的
覆盖,至多算是该方法的重载。
(2) Circle
类的
equals
方法不能写成如下代码:
public boolean equals(Object obj) {
if(obj instanceof Circle){
Circle c=(Circle)obj;
return c.getRadius()==getRadius() &&
c.getCenter().equals(getCenter()
);
}
return false;
}
以上代码试图通过
c.getCenter().equals(getCenter())
语句调用实验
4.Point
类的
equals
方法,从而判断圆心是否为同一点。这种写法的错误之处在于实验
4.Circle
的
center
变量
是实验
2.Point
类的对象,而实验
2.Point
类的
equals
方法并没有判断
XY
坐标值是否相
同。
●
测试案例:
表
4.1
测试案例(仅用于编码测试)
编号
测试目的
输入或测试数据
期望结果
1
成员的
private
、
public
修饰
构造方法中直接访问
Point
类的
x
、
y
或
Circle
类的
center
、
radius
提示语法错误
2
子类的构造
方法
创建实验
4.Point()
对象
p1
和实验
4.Point(0,10)
对象
p2
p1.getX()
结果为
0
,
p1.getY()
结果为
0
,
p1.distance(p2)
结果为
10
3
子类的构造
方法
创建实验
4.Circle()
对象
c1
和实验
4.Circle(0,0,10)
对象
c2
c1.getCenter().getX()
结果为
0
,
c1.getCenter().getY()
结果为
0
,
c1.area()
为
0
,
c1.perimeter()
结果为
0
,调用
c1.relation(c2)
结果为
“
同心圆
”
4
toString()
方
法
调用
p1.toString()
返回
“(0,0)”
5
toString()
方
法
调用
c1.toString()
返回
“(0,0),0”
6
equals()
方法
创建实验
4.Point()
对象
p1
和实验
4.Point(0,10)
对象
p2
调用
p1.equals(p2)
时返回
false
7
equals()
方法
创建实验
4.Point()
对象
p1
和实验
4.Point(0, 0)
对象
p2
调用
p1.equals(p2)
时返回
true
8
equals()
方法
创建实验
4.Point()
对象
p1
和
实验
2.Point(0, 0)
对象
p2
调用
p1.equals(p2)
时返回
true
9
equals()
方法
创建实验
4.Point()
对象
p1
和
实验
2.Point(0, 0)
对象
p2
调用
p2.equals(p1)
时返回
false
(因为实
验
2.Point
还没有重写
equals
方法)
10
equals()
方法
创建实验
4.Circle()
对象
c1
和实验
4.Circle(0,0,10)
对象
c2
调用
c1.equals(c2)
时返回
false
11
equals()
方法
创建实验
4.Circle()
对象
c1
和实验
4.Circle(0,0,0)
对象
c2
调用
c1.equals(c2)
时返回
true
12
equals()
方法
创建实验
4.Circle()
对象
c1
、实验
4.Point(0,0)
对象
p
和实验
4.Circle(p,0)
对象
c2
调用
c1.equals(c2)
时返回
true
调用
c1.equals(p)
和
p.equals(c1)
皆返回
false
13
equals()
方法
创建实验
4.Circle()
对象
c1
、
实验
2.Point(0,0)
对象
p
和实验
4.Circle(p,0)
对象
c2
调用
c1.equals(c2)
时返回
true
14
equals()
方法
创建实验
4.Circle()
对象
c1
和
实验
2.Circle(0,0,0)
对象
c2
调用
c1.equals(c2)
时返回
true
,
调用
c2.equals(c1)
时返回
false
Circle.java
package 实验4;
public class circle extends 实验2.Circle{
public circle(){
super();
}
public circle(int x,int y,int r){
super(x,y,r);
}
@Override
public boolean equals(Object obj) {
if(obj!=null && obj.getClass()==circle.class){
circle cir=(circle)obj;
return (getCenter().getX()==cir.getCenter().getX() &&
getCenter().getY()==cir.getCenter().getY() &&
getRadius()==cir.getRadius());
}
return false;
}
@Override
public String toString() {
int x=getCenter().getX();
int y=getCenter().getY();
return "("+x+","+y+","+getRadius()+")";
}
}
Point.java
package 实验4;
public class Point extends 实验2.Point {
public Point(){
super();
}
public Point(int x,int y){
super(x,y);
}
@Override
public boolean equals(Object obj) {
if(obj!=null && obj.getClass()== Point.class) {
Point point=(Point)obj;//向下转型object还原为point类
return (getX()==point.getX() && getY()==point.getY());
}
return false;
}
@Override
public String toString() {
return "("+getX()+","+getY()+")";
}
}
Test.java
package 实验4;
import 实验2.Point;
import java.util.Scanner;
public class Test {
static private Point A,B,C;
static private circle D,E,F;
public static void main(String[] args) {
int op;
do{
Scanner s = new Scanner(System.in);
System.out.println("(1)创建三点三圆;");
System.out.println("(2)测试toString()方法;");
System.out.println("(3)测试equals()方法;");
System.out.println("(0)退出程序;");
op=s.nextInt();
switch (op){
case 0:
break;
case 1:
build();
break;
case 2:
testToString();
break;
case 3:
testEquals();
break;
default:
System.out.println("请输入有效数字!");
}
}while (op!=0);
}
public static void build(){
A=new Point();
B=new Point();
C=new Point(1,1);
D=new circle();
E=new circle();
F=new circle(1,1,1);
System.out.println("成功!");
}
public static void testToString(){
System.out.println("Point:");
System.out.println("A:"+A.toString());
System.out.println("B:"+B.toString());
System.out.println("C:"+C.toString());
System.out.println("Circle");
System.out.println("D:"+D.toString());
System.out.println("E:"+E.toString());
System.out.println("F:"+F.toString());
}
public static void testEquals(){
System.out.print("A-B:");
if(A.equals(B)){
System.out.println("相等");
}
else{
System.out.println("不等");
}
System.out.print("B-C:");
if(B.equals(C)){
System.out.println("相等");
}
else{
System.out.println("不等");
}
System.out.print("D-E:");
if(D.equals(E)){
System.out.println("相等");
}
else{
System.out.println("不等");
}
System.out.print("E-F:");
if(E.equals(F)){
System.out.println("相等");
}
else{
System.out.println("不等");
}
}
}