Java实验三、封装性、继承性与包

实验目的:

  1. 掌握包的定义和引用语法;
  2. 理解封装性的目的:为什么定义private变量、public方法?
  3. 掌握父子类之间的继承原则:哪些内容可以被继承,哪些内容不可以被继承
  4. 掌握super关键字的用法:super前缀,super方法
  5. 掌握方法覆盖的语法、注意事项
  6. 进一步熟练掌握类的组合关系:Color和ColoredCircle之间也是组合关系

●参考学时:2学时

●基本要求:

  1. 创建项目“Java实验”,将实验一、实验二分别组织到“实验1”、“实验2”包中,并合理设置实验2中的属性、方法的访问权限修饰符;
  2. 在“实验3”包中编写颜色类“实验3.Color”,其实现要求包括:
  1. 包含三个颜色分量red、green和blue(取值范围必须为0-255);
  2. 构造方法Color()和Color(int r,int g,int b):注意取值范围规定
  3. 设置颜色值方法
  • void setRed(int v):注意取值范围规定
  • void setGreen(int v) :注意取值范围规定
  • void setBlue(int v) :注意取值范围规定
  1. 获取颜色值方法
  • int getRed();int getGreen();int getBlue()
  1. 编写“实验2.Circle”类的子类“实验3.ColoredCircle”类,该类的圆心、半径等属性均使用Circle中的定义。其余实现要求包括:
  1. 表示圆周颜色的Color类对象borderColor和圆心颜色对象centerColor
  2. 至少定义如下几个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
  1. 设置颜色方法:
  • void setCenterColor(Color c)
  • void setBorderColor(Color c)
  1. 获取颜色方法:
  • Color getCenterColor()
  • Color getBorderColor()
  1. 重新定义的relation(Circle c)方法(方法覆盖)
  1. 在“实验3”包中编写测试ColoredCircle类的测试类Test,并在该类的main方法中调用ColoredCircle类的所有方法(包括从Circle继承来的方法),输出返回值(如有必要),以验证其正确性

●实验提示:

  1. 创建“Java实验”项目的目的是将之前的实验1、实验2的内容,以及今后的所有实验文件统一组织在一个项目内,不同的实验具有不同的包名,实验与实验之间可跨包复用。完整的项目结构应符合图3.1所示内容:

图3.1实验项目文件夹的浏览效果

  1. Color类所表示的对象是“红绿蓝颜色模型”的简单抽象,即用三个整数(0-255范围)代表某颜色的三种原色取值。比如(red=0,green=0,blue=0)代表黑色,(red=255,green=0,blue=0)代表红色,(red=255,green=255,blue=255)代表白色。
  2. ColoredCircle是具有额外属性和方法的Circle子类,但是其本质仍然是“圆”,因为ColoredCircle同样具有圆心、半径属性(隐藏于父类Circle中)和计算面积、计算周长的方法。
  3. ColoredCircle类中唯一需要重写的父类方法是relation(Circle c)(注意relation(Circle c)方法的形参类型),因为在当前的抽象层次上,带颜色圆和一般圆的唯一不同点是圆和圆的关系不同,面积方法、周长方法、setter、getter方法无需改变。
  4. relation(Circle c)方法首先应判断c是Circle对象还是ColoredCircle对象。如果c不是ColoredCircle对象,则调用父类的relation方法,并把同一圆关系调整为同心圆(即带颜色的圆和不带颜色的圆不可能是同一圆,最多是同心圆)。如果c是ColoredCircle对象,则可以在同一个圆的基础上进一步判断颜色是否一样(即首先调用父类的relation方法,并根据返回值判断是否为同一圆。如果是,则进一步判断颜色是否相同。只有圆心重合、半径相同,且颜色相同,则两个带颜色圆的关系才是同一圆;颜色不同的圆心重合、半径相同圆归类为同心圆。父类的relation方法返回值为非同一圆,则无需判断颜色)。
  5. 任何一个类的缺省、无参构造方法将自动调用父类的无参构造方法。另一方面,任何子类都不能继承父类的构造方法。因此,在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("包含的圆");
        }
    }
}

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值