实验四 接口

(1.定义一个ReList接口,并使用数组的方法来实现接口。

要求

1. ReList接口包含六个方法:

void add(Object obj):往列表尾部添加对象

Object get(int index):从列表中获取索引为i的对象

void clear():清空所有的对象

boolean isEmpty():判断列表中是否有对象

int size():获取列表中对象的个数

int capacity():所分配的空间大小

2. ReArrayList类实现ReList接口,内部以数组的方式实现,要求:

构造函数ReArrayList(int incSize):参数incSize为数组初始化大小和空间的增量。若用户调用incSize非法,则设为默认值5。

当调用add()方法往试图往ReArrayList中增加对象时,如果内部数组已满,则增加数组大小,增量为incSize。

调用clear()方法可以清空所有通过add()方法加入的对象。

调用get()方法时,如果传入的参数非法,则返回null对象,并使用System.err提示用户参数错误。

3. ReDoubledArrayList类也实现ReList接口,内部依旧通过数组实现,要求:

构造函数ReDoubledArrayList(int initSize):参数initSize表示数组的初始化大小。若用户调用initSize非法,则设为默认值10。

当调用add()方法往ReDoubledArrayList列表里面增加对象时,如果其内部数组已满,则将数组的长度变为当前长度的2倍。

其他方法和ReArrayList一致

最后设计一个类来测试你的ReArrayList和ReDoubledArrayList类,看看这两个类是否能在不破坏使用者代码的情况下相互替换。

提示

1. 增加数组长度的方法:使用java.util.Arrays.copyOf()方法,用法请查阅Java API文档。



运行结果


Stuednt.java

package shiyan3_4;

public class Stuednt {

       publicString toString() {

              return "Stuednt [name=" + name + ",

age=" + age + "]";

       }

       privateString name;

       private int age;

       publicStuednt(String name,int age) {

              this.name=name;

              this.age=age;

       }

       publicString getName() {

              return name;

       }

       public void setName(String name) {

              this.name = name;

       }

       public int getAge() {

              return age;

       }

       public void setAge(int age) {

              this.age = age;

       }

}


ReList.java

package shiyan3_4;

public interface ReList {

 public void add(Object obj);

 public Object get(int index);

 public void clear();

 public booleanisEmpty();

 public int size();

 public int capacity();

}


ReArrayList.java

package shiyan3_4;

import java.util.Arrays;

public class ReArrayList implementsReList{

private int size;

private Object[] example;

       publicReArrayList(int incSize) {

              if(incSize<0){

                     this.size=5;

              }else{

                     this.size=incSize;

              }

              this.example = new Object[size];

              System.out.println("数组初始化成功,增量为=:"+size);

       }

       public void add(Object obj) {

       System.out.println("执行add函数,添加元素:"+obj);

       for(int i=0;i<example.length;i++){

              if(example[i]==null){

                     example[i]=obj;

                     return;

              }

       }

       System.out.println("数组已满,增加容量"+size);

       this.example= Arrays.copyOf(example,  example.length+size);

       System.out.println("新数组长度为:="+example.length);

       System.out.println("数组内部元素:="+this);/*那么 System.out.println(this) 将打印A类自身引用的toString方法, 如果自身没有实现,则打印的是父类Object的toString方法;getClass().getName()+

"@" +Integer.toHexString(hashCode());  打印的是“类名@hascode”*/

              this.add(obj);

       }


       publicObject get(int index) {

       System.out.println("执行查找指定脚标元素:");

       if(index>=example.length){

              System.err.println("参数错误!"+index);

              return null;

       }

              return example[index];

       }


       public void clear() {

       this.example = new Object[size];

       System.out.println("数组已清空,当前数组长度为:="+example.length);

       }

       public boolean isEmpty() {

              System.out.println("isEmpty判断非空,数组元素:"+this);

              for(Objecto : example){

                     if(o!=null)

              return false;

              }

              return true;

       }

       public int size() {

              System.out.println("数组大小为:=");

              return (int)Arrays.stream(example).filter(e->e!=null).count();//过滤

       }


       public int capacity() {

              System.out.println("分配的大小为:=");

              return example.length;

       }

       publicString toString() {

              return "ReArrayList [size=" + size + ",

example="+ Arrays.toString(example) + "]";

       }


}


Ceshi.java

package shiyan3_4;

public class ceshi {

       public static void main(String[] args) {

              ReArrayListar = new ReArrayList(2);

              ar.add(new Stuednt("小红",14));

              ar.add(new Stuednt("小白",17));

              ar.add(new Stuednt("小黄",11));

              ar.add(new Stuednt("小蓝",13));

              ar.add(new Stuednt("小青",14));

              ar.add(new Stuednt("小紫",12));

              System.out.println(ar);

              System.out.println(ar.get(3));

              System.out.println(ar.size());

              System.out.println(ar.isEmpty());

              System.out.println(ar.capacity());

              ar.clear();

              System.out.println(ar);

              System.out.println(ar.size());

              System.out.println(ar.isEmpty());

              System.out.println(ar.capacity());

       }

}

(2.假设默认长度单位为米,编写一个计算为各种形状着色花费的程序。

要求

1. 编写BorderColorable接口,要求:

具有方法void paintBorder(),在实现类中该方法需要输出“已经将什么形状的边着色”。

方法boolean isBorderPainted(),返回形状的边是否已经着色。

2. 编写SolidColorable接口,要求:

具有方法void paintShape(),在实现类中该方法需要输出“已经将什么形状进行着色”。

方法boolean isShapePainted(),返回形状是否已经着色。

3. Shape2D是所有形状的父类:

其中圆(Circle),三角形(Triangle)和长方形(Rectangle)均继承自Shape2D类,而Square继承自Rectangle类。

Circle实现了BorderColorable接口,Triangle实现了SolidColorable接口,而Rectangle同时实现了BorderColorable接口和SolidColorable接口。

4. CostCalculator类用来计算为边着色和为形状着色所消耗的花费。

构造函数CostCalculator(double

borderCost, double solidCost),其中borderCost表示画1米的边需要的单价,solidCost表示画一平方米的边需要消耗的单价。

double calculate(Shape2D shape)用来计算实际为形状shape着色需要的花费。

形状着色的花费计算值计算已经着色的部分,且花费总额为边着色和为形状着色的花费的总和

5. 写一个测试类测试你的程序。

提示

1. 实现了BorderColorable的形状只为边着色,实现了SolidColorable的形状为整个形状着色。

2. 总体类图如下图所示。


运行结果


工程截图


BorderColorable.java

package shiyan4_2;

public interface BorderColorable {

public void paintBorder();

public boolean isShapeBorder();

}

Circle.java

package shiyan4_2;

public class Circle extendsShape2D implements BorderColorable{

       private double r;

       private boolean flag1 = false;

       private boolean flag2 = false;

       private double Area;

       private double Perimeter;

       public double getArea() {

              return Area;

       }

       public void setArea(double area) {

              Area = area;

       }

       public double getPerimeter() {

              return Perimeter;

       }

       public void setPerimeter(double perimeter) {

              Perimeter = perimeter;

       }

       publicCircle(Double radius) {

              r=radius;

       }

  public double getR() {

              return r;

       }

       public void setR(double r) {

              this.r = r;

       }

       public void area() {

              double PI =

(float) Math.PI;

    System.out.println("圆的面积为:"+PI*getR()*getR()

);

    setArea(PI*getR()*getR());

}


public void perimeter() {

       double PI =(float) Math.PI;

    System.out.println("圆的周长为:"+2*PI*getR());

    setPerimeter(2*PI*getR());

}

       public void paintBorder(){

              flag1=true;

              System.out.println("正在为圆形的边着色~~");

       }

       public void paintShape(){

              flag2=true;

              System.out.println("正在为圆形的内部着色~~");

       }

       public boolean isShapeBorder() {

    if (flag1)

        return true;

    else

        return false;

}

       public boolean isShapePainted() {

    if (flag2)

        return true;

    else

        return false;

}

}

CostCalculator.java

package shiyan4_2;

public class CostCalculator {

       private double borderCost,soliderCost;

public double getBorderCost() {

              return borderCost;

       }

       public void setBorderCost(double borderCost) {

              this.borderCost = borderCost;

       }

       public double getSoliderCost() {

              return soliderCost;

       }

       public void setSolidCost(double solidCost) {

              this.soliderCost = solidCost;

       }

public CostCalculator(double borderCost, double solidCost) {

       this.borderCost=borderCost;

       this.soliderCost=solidCost;

}

public double calculate(Shape2D shape){

       double s1=0,s2=0;

       if(shape.isShapeBorder()){

              s1=shape.getPerimeter()*this.borderCost;

       }

       if(shape.isShapePainted()){

              s2=shape.getArea()*this.soliderCost;

       }

       return s1+s2;

}

}

Rectangle.java

package shiyan4_2;

public class Rectangle extendsShape2D implements SoliderColorable ,BorderColorable{

       private boolean flag1 = false;

       private boolean flag2 = false;

       private double Area;

       private double Perimeter;

       private double l,h;

       publicRectangle(double l,double h) {

              this.h=h;

              this.l=l;

       }

       public double getL() {

              return l;

       }

       public void setL(double l) {

              this.l = l;

       }

       public double getH() {

              return h;

       }

       public void setH(double h) {

              this.h = h;

       }

       public double getArea() {

              return Area;

       }

       public void setArea(double area) {

              Area = area;

       }

       public double getPerimeter() {

              return Perimeter;

       }

       public void setPerimeter(double perimeter) {

              Perimeter = perimeter;

       }

       public void paintBorder(){

              flag1=true;

              System.out.println("正在为长方形的边着色~~");

       }

       public void paintShape(){

              flag2=true;

              System.out.println("正在为长方形的内部着色~~");

       }

       public boolean isShapeBorder() {

    if (flag1)

        return true;

    else

        return false;

}

       public boolean isShapePainted() {

    if (flag2)

        return true;

    else

        return false;

}


       public void perimeter() {

              double ll =

2*getH()+2*getL();

              System.out.println("长方形周长为:"+ll);

    setPerimeter(ll);

       }


       public void area() {

              System.out.println("长方形面积为:"+getH()*getL());

    setArea(getH()*getL());

       }

}

Shape2D.java

package shiyan4_2;

public abstract class Shape2D {

       public abstract void perimeter();

       public abstract void area();

       public abstract boolean isShapeBorder() ;

       public abstract boolean isShapePainted();

       public abstract double getArea() ;

       public abstract double getPerimeter();

}


SoliderColorable.java

package shiyan4_2;

public interface SoliderColorable {

public void paintShape();

public boolean isShapePainted();

}

Square.java

package shiyan4_2;

public class Square extendsRectangle {

    private double a = 0;

      private boolean flag1 = false;

      private boolean flag2 = false;

      private double Area;

      private double Perimeter;

    public double getArea() {

                     return Area;

              }

              public void setArea(double area) {

                     Area = area;

              }

              public double getPerimeter() {

                     return Perimeter;

              }

              public void setPerimeter(double perimeter) {

                     Perimeter = perimeter;

              }

              publicSquare(double width) {

        super(width,width);

        if (width>0) {

            this.a = width;

            System.out.println("构成了一个边长为:"+this.a+"的正方形");

            setSuccess(true);

        }else {

            setSuccess(false);

        }

    }

              private void setSuccess(boolean b) {

       if(b){

       }else{

              System.out.println("创建失败,输入有问题。");

       }

              }

    public double getA() {

        return a;

    }


    public void setA(double a) {

        this.a = a;

    }


    public void area() {

        this.setArea(getA()

* getA());

        System.out.println("正方形面积为:" +

getA() * getA());

    }


    public void perimeter() {

        this.setPerimeter(getA() * 4);

        System.out.println("正方形周长为:" +

getA() * 4);

    }

      public void paintBorder(){

             flag1=true;

             System.out.println("正在为正方形的边着色~~");

      }

      public void paintShape(){

             flag2=true;

             System.out.println("正在为正方形的内部着色~~");

      }

      public boolean isShapeBorder() {

      if (flag1)

          return true;

      else

          return false;

  }

      public boolean isShapePainted() {

      if (flag2)

          return true;

      else

          return false;

  }


}

Test.java

package shiyan4_2;

import java.util.Scanner;

public class Test {

    public static void main(String[] agrs){

        Scannerinput=new Scanner(System.in);

        CostCalculatorcost=new CostCalculator(1.0,2.0);//边的花费,内部的花费

        System.out.println("着色一米的边长需要:"+cost.getBorderCost()+"RMB      "+"着色l平方米需要:"+cost.getSoliderCost()+"RMB");

        double radius=0;

        double height=0,width=0;

        double left=0,right=0,boom=0;

        //*******圆*******

        System.out.print("请输入圆的半径:");

        radius=input();

        Circlecircle=new Circle(radius);

        circle.area();

        circle.perimeter();

        circle.paintBorder();//为边着色

        System.out.println("花费为:"+cost.calculate(circle));


        //*******长方形*******

        System.out.print("请输入长方形的长:");

        height=input();

        System.out.print("请输入长方形的宽:");

        width=input();

        Rectanglerectangle=new Rectangle(height,width);       

        rectangle.area();

        rectangle.perimeter();

        rectangle.paintBorder();//为边着色

        rectangle.paintShape();//为内部着色

        System.out.println("花费为:"+cost.calculate(rectangle));   


        //******正方形******

        System.out.print("请输入正方形的边长:");

        width=input();

        Squaresquare=new Square(width);

        square.area();

        square.perimeter();

        square.paintBorder();//为内部着色

        square.paintShape();

        System.out.println("花费为:"+cost.calculate(square));


        //******三角形******

        do{

            System.out.print("请输入三角形的第一边长:");

            left=input();

            System.out.print("请输入三角形的第二边长:");

            right=input();

            System.out.print("请输入三角形的第三边长:");

            boom=input();

        }while(!judge(left,right,boom));   

        Triangletriangle=new Triangle(left,right,boom);;

        triangle.area();

        triangle.perimeter();

        triangle.paintBorder();//为边着色

        triangle.paintShape();//为内部着色       

        System.out.println("花费为:"+cost.calculate(triangle));

        input.close();

    }

    public static boolean judgement(double r){


        if(r<0){

            System.out.println("输入错误,请重新输入");

            return false;

        }

        return true;

    }

    public static double input(){

        double temp=0;

        boolean flag=true;

        Scannerinput=new Scanner(System.in);//不能关闭否则无限循环

        do{

            flag=true;

            input=new Scanner(System.in);

            if(input.hasNextDouble()){

                temp=input.nextDouble();

                if(temp>0){

                    flag=false;

                    break;

                }

            }   

            System.out.println("输入必须是double型,并且大于0,请重新输入");

        }while(flag);

        return temp;

    }

    public static boolean judge(double right,double left,double boom){       

            if(right<=0 || left<=0 || boom<=0){

                System.out.println("输入不满足三角形构造规则,请重新输入");

                return false;

            }

            if(right+left<=boom ||right+boom<=left ||boom+left<=right){

                System.out.println("输入不满足三角形构造规则,请重新输入");

                return false;

            }

            if(right-left>=boom ||right-boom>=left ||boom-left>=right){

                System.out.println("输入不满足三角形构造规则,请重新输入");

               return false;

            }

            return true;

        }

}

Triangle.java

package shiyan4_2;

public class Triangle extendsShape2D implements SoliderColorable{

    private double length1;

    private double length2;

    private double length3;

      private boolean flag1 = false;

      private boolean flag2 = false;

      private double Area;

      private double Perimeter;

     public double getArea() {

                     return Area;

              }


              public void setArea(double area) {

                     Area = area;

              }

              public double getPerimeter() {

                     return Perimeter;

              }


              public void setPerimeter(double perimeter) {

                     Perimeter = perimeter;

              }


              publicTriangle(double length1, double length2, double length3) {

         // TODO Auto-generated constructor stub

         super();

        this.length1 = length1;

        this.length2 = length2;

         this.length3 = length3;

        if((Math.abs(this.length1 - this.length2) < this.length3)

                && (Math.abs(this.length1 - this.length3) < this.length2)

                && (Math.abs(this.length3 - this.length2) < this.length1)

                 && (Math.abs(this.length1 + this.length2) > this.length3)

                && (Math.abs(this.length1 + this.length3) > this.length2)

                 && (Math.abs(this.length3 + this.length2) > this.length1)) {

            setSuccess(true);

           System.out.println("构成了一个三条边长分别为:" + this.length1 + ","

                    +this.length2 + "," + this.length3 + "的三角形");

         }else {

            setSuccess(false);

        }

     }


     private void setSuccess(boolean b) {

      if(b){

      }else{

             System.out.println("创建失败,输入有问题。");

      }

              }


              public double getLength1() {

        return length1;

     }


     public void setLength1(double length1) {

        this.length1 = length1;

     }


     public double getLength2() {

         return length2;

     }


    public void setLength2(double length2) {

        this.length2 = length2;

    }


     public double getLength3() {

        return length3;

     }


     public void setLength3(double length3) {

         this.length3 = length3;

     }


     public void area() {

         double p =

(getLength1() + getLength2() + getLength3()) / 2;

         System.out.println("面积为:"

                 + Math.sqrt(p *

(p -

getLength1()) * (p - getLength2())

                         * (p -

getLength3())));

         this.setArea(Math.sqrt(p *

(p -

getLength1()) * (p - getLength2())

                         * (p -

getLength3())));

     }


     public void perimeter() {

         System.out.println("周长为:"

                 + (getLength1() + getLength2()+ getLength3()));

         this.setPerimeter((getLength1()

+ getLength2() + getLength3()));

     }


      public void paintBorder(){

             flag1=true;

             System.out.println("正在为三角形的边着色~~");

      }

      public void paintShape(){

             flag2=true;

             System.out.println("正在为三角形的内部着色~~");

      }

      public boolean isShapeBorder() {

      if (flag1)

          return true;

      else

          return false;

  }

      public boolean isShapePainted() {

      if (flag2)

          return true;

      else

          return false;

  }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • (1.编写一个计算各种形状的面积和周长的程序。 要求:父类Shape2D为一个抽象类,其中包含计算周长和计算面积两...
    盼旺阅读 1,988评论 0 1
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一...
    阿里高级软件架构师阅读 3,286评论 0 19
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    开心的锣鼓阅读 3,320评论 0 9
  • 时间的沙漏里 流淌着同样的风景 我追不上时间的脚步 也追不上你的背影 年华易逝 灯火昏黄里的残影消褪 在岁月的歌声...
    莯寒阅读 346评论 3 8
  • 今天认识html世界里的一个新朋友——列表标签,列表标签家族包含三兄弟:有序列表、无序列表和定义列表。本文的章节布...
    犯迷糊的小羊阅读 602评论 3 0