11222的第二次博客作业

目录

一、前言

二、设计与分析

三、采坑心得

四、改进建议

五、总结

-----------------------------------------------------------------------------------------------------------------------------------------

                                                          前言

       新学期开始学习java语言,与上学期所学习的C语言有所不同,从开学到现在已经学习了不少新知识并

作了不少新练习每次发布的题目集的作业都有不同的知识点、题量、难度等情况。

  期中考试:此次考试有三道题,三道题目是有层层深入的联系,主要考察了类的构造方法、对象私有

属性的设置、属性的getter与setter方法、继承与多态、抽象类的使用等方面知识。

  PTA作业四:此次作业有三道题,题目一要求用正则表达式,考察了自主学习技能、题目二是考察对

数据的处理与分析、题目三是对现实中存在的对象进行编程实现其简单功能。

  实验三—1:是前几次实验的升级般,对前几次的代码用继承与多态的形式进行改进升级。

------------------------------------------------------------------------------------------------------------------------------------------

7-1 点与线(类设计)期中考试
  • 设计一个类表示平面直角坐标系上的点Point,私有属性分别为横坐标x与纵坐标y,数据类型均为实型数,除构造方法以及属性的getter与setter方法外,定义一个用于显示信息的方法display(),用来输出该坐标点的坐标信息,格式如下:(x,y),数值保留两位小数。为简化题目,其中,坐标点的取值范围设定为(0,200]。若输入有误,系统则直接输出Wrong Format

  • 设计一个类表示平面直角坐标系上的线Line,私有属性除了标识线段两端的点point1、point2外,还有一个字符串类型的color,用于表示该线段的颜色,同样,除构造方法以及属性的getter与setter方法外,定义一个用于计算该线段长度的方法getDistance(),还有一个用于显示信息的方法display(),用来输出线段的相关信息,输出格式如下:

      ```
          The line's color is:颜色值
          The line's begin point's Coordinate is:
          (x1,y1)
          The line's end point's Coordinate is:
          (x2,y2)
          The line's length is:长度值
      ```
    
     

    其中,所有数值均保留两位小数,建议可用String.format("%.2f", data)方法。

      设计类图如下图所示。
    
     

1641304523(1).jpg

** 题目要求:在主方法中定义一条线段对象,从键盘输入该线段的起点坐标与终点坐标以及颜色,然后调用该线段的display()方法进行输出。**

分析:

该题主要考察了对类图的分析理解,聚合的应用;

设计:

根据类图分别完成对Main、Point、Line类的编写,实现类图中的各种方法。

代码实现:

Mian类:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
       Scanner in=new Scanner(System.in);
       Point point1=new Point(in.nextDouble(),in.nextDouble());
       Point point2=new Point(in.nextDouble(),in.nextDouble());
       Line line=new Line(point1,point2,in.next());
       line.display();
    }

}

Point类:

class Point {
private double x;
private double y;
    Point()
    {
        
    }
    Point(double x,double y)
    {
        if((x>0&&x<=200)&&(y>0&&y<=200))
        {
        this.y=y;
        this.x=x;
        }
        else
        {
            System.out.print("Wrong Format");
            System.exit(0);
        }
    }
    double getX()
    {
        return this.x;
    }
    void setX(double x)
    {
        this.x=x;
    }
    
    double getY()
    {
        return this.y;
    }
    void setY(double y)
    {
        this.y=y;
    }
    void display()
    {
        System.out.print("(");
        System.out.printf("%.2f", this.x);
        System.out.print(",");
        System.out.printf("%.2f", this.y);
        System.out.println(")");
        
    }

}

Line类:

class Line {
private Point point1;
private Point point2;
private String color;
    Line()
    {
        
    }
    Line(Point point1,Point point2,String color)
    {
        this.color=color;
        this.point1=point1;
        this.point2=point2;
    }
    Point getPoint1()
    {
        return point1;
    }
    void setPoint1(Point point1)
    {
        this.point1=point1;
    }
    
    Point getPoint2()
    {
        return point2;
    }
    void setPoint2(Point point2)
    {
        this.point2=point2;
    }
    
    String getColor()
    {
        return this.color;
    }
    void setColor(String color)
    {
        this.color=color;
    }
    double getDistance()
    {
        double d=0;
        d=Math.sqrt(Math.pow(point1.getX()-point2.getX(), 2)+Math.pow(point1.getY()-point2.getY(), 2));
        return d;
    }
    void display()
    {
        System.out.println("The line's color is:"+this.color);
        System.out.println("The line's begin point's Coordinate is:");
        point1.display();
        System.out.println("The line's end point's Coordinate is:");
        point2.display();
        System.out.print("The line's length is:");
        System.out.printf("%.2f",getDistance());
    }
    

}

踩坑心得:

需要看懂类图,了解聚合关系是如何实现的。

改进建议:

1、可对题目的类设计进行重构,以实现继承与多态的技术性需求。

 

7-2 点线面问题重构(继承与多态)期中考试

在“点与线(类设计)”题目基础上,对题目的类设计进行重构,以实现继承与多态的技术性需求。

  • 对题目中的点Point类和线Line类进行进一步抽象,定义一个两个类的共同父类Element(抽象类),将display()方法在该方法中进行声明(抽象方法),将Point类和Line类作为该类的子类。
  • 再定义一个Element类的子类面Plane,该类只有一个私有属性颜色color,除了构造方法和属性的getter、setter方法外,display()方法用于输出面的颜色,输出格式如下:The Plane's color is:颜色
  • 在主方法内,定义两个Point(线段的起点和终点)对象、一个Line对象和一个Plane对象,依次从键盘输入两个Point对象的起点、终点坐标和颜色值(Line对象和Plane对象颜色相同),然后定义一个Element类的引用,分别使用该引用调用以上四个对象的display()方法,从而实现多态特性。示例代码如下:
          element = p1;//起点Point
          element.display();
          
          element = p2;//终点Point
          element.display();
          
          element = line;//线段
          element.display();
          
          element = plane;//面
          element.display();
    
     
    类结构如下图所示。

1641340607(1).jpg

其中,所有数值均保留两位小数,建议可用String.format("%.2f", data)方法。

分析:

该题主要考察了继承与多态、类私有属性的设置与使用,属性的getter与setter方法,如何定义使用抽象类,是对7-题目的进一步升级;

设计:

根据类图分别完成对Main、Point、Line、Plane与抽象类Element类的编写,实现类图中的各种方法。

代码实现:

Main类:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner in=new Scanner(System.in);        
        
           Point point1=new Point(in.nextDouble(),in.nextDouble());
           Point point2=new Point(in.nextDouble(),in.nextDouble());
           String color=in.next();
           Line line=new Line(point1,point2,color);
           Plane plane=new Plane(color);
           point1.dispiay();
           point2.dispiay();
           line.dispiay();
           plane.dispiay();
           
    }

}

Element类:

abstract class Element {
    public abstract void dispiay();

}

Point类:

class Point extends Element{
private double x;
private double y;
    Point()
    {
        
    }
    Point(double x,double y)
    {
        if((x>0&&x<=200)&&(y>0&&y<=200))
        {
        this.y=y;
        this.x=x;
        }
        else
        {
            System.out.print("Wrong Format");
            System.exit(0);
        }
    }
    double getX()
    {
        return this.x;
    }
    void setX(double x)
    {
        this.x=x;
    }
    
    double getY()
    {
        return this.y;
    }
    void setY(double y)
    {
        this.y=y;
    }
    @Override
    public void dispiay() {
        // TODO 自动生成的方法存根
        System.out.print("(");
        System.out.printf("%.2f", this.x);
        System.out.print(",");
        System.out.printf("%.2f", this.y);
        System.out.println(")");
    }

}

Plane类:

class Plane extends Element{
private String color;
        Plane()
        {
            
        }
        Plane(String color)
        {
            this.color=color;
        }
        String getColor()
        {
            return color;
        }
        void setColor(String color)
        {
            this.color=color;
        }
        @Override
        public void dispiay() {
            // TODO 自动生成的方法存根
            System.out.print("The Plane's color is:"+this.color);
        }
}

Line类:

class Line extends Element{
private Point point1;
private Point point2;
private String color;
    Line()
    {
        
    }
    Line(Point point1,Point point2,String color)
    {
        this.color=color;
        this.point1=point1;
        this.point2=point2;
    }
    Point getPoint1()
    {
        return point1;
    }
    void setPoint1(Point point1)
    {
        this.point1=point1;
    }
    
    Point getPoint2()
    {
        return point2;
    }
    void setPoint2(Point point2)
    {
        this.point2=point2;
    }
    
    String getColor()
    {
        return this.color;
    }
    void setColor(String color)
    {
        this.color=color;
    }
    double getDistance()
    {
        double d=0;
        d=Math.sqrt(Math.pow(point1.getX()-point2.getX(), 2)+Math.pow(point1.getY()-point2.getY(), 2));
        return d;
    }    
    @Override
    public void dispiay() {
        // TODO 自动生成的方法存根
        System.out.println("The line's color is:"+this.color);
        System.out.println("The line's begin point's Coordinate is:");
        point1.dispiay();
        System.out.println("The line's end point's Coordinate is:");
        point2.dispiay();
        System.out.print("The line's length is:");
        System.out.printf("%.2f\n",getDistance());
    }
    

}

踩坑心得:

1、抽象类不能使用new操作符来初始化。

2、抽象父类的子类必须实现所有的抽象方法。

改进建议:

Main类重写:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner in=new Scanner(System.in);        
        
           Point point1=new Point(in.nextDouble(),in.nextDouble());
           Point point2=new Point(in.nextDouble(),in.nextDouble());
           String color=in.next();
           Line line=new Line(point1,point2,color);
           Plane plane=new Plane(color);
           Element element;
           element=point1;
           element.dispiay();
           element=point2;
           element.dispiay();
           element=line;
           element.dispiay();
           element=plane;
           element.dispiay();
    }

}

以完成题目所要求的:

定义一个Element类的引用,分别使用该引用调用以上四个对象的display()方法,从而实现多态特性。

7-1 sdut-String-2 识蛟龙号载人深潜,立科技报国志(II)(正则表达式)PTA大作业四
 

背景简介:

“蛟龙号”载人深潜器是我国首台自主设计、自主集成研制的作业型深海载人潜水器,设计最大下潜深度为7000米级,也是目前世界上下潜能力最强的作业型载人潜水器。“蛟龙号”可在占世界海洋面积99.8%的广阔海域中使用,对于我国开发利用深海的资源有着重要的意义。

中国是继美、法、俄、日之后世界上第五个掌握大深度载人深潜技术的国家。在全球载人潜水器中,“蛟龙号”属于第一梯队。目前全世界投入使用的各类载人潜水器约90艘,其中下潜深度超过1000米的仅有12艘,更深的潜水器数量更少,目前拥有6000米以上深度载人潜水器的国家包括中国、美国、日本、法国和俄罗斯。除中国外,其他4国的作业型载人潜水器最大工作深度为日本深潜器的6527米,因此“蛟龙号”载人潜水器在西太平洋的马里亚纳海沟海试成功到达7020米海底,创造了作业类载人潜水器新的世界纪录。

从2009年至2012年,蛟龙号接连取得1000米级、3000米级、5000米级和7000米级海试成功。下潜至7000米,说明蛟龙号载人潜水器集成技术的成熟,标志着我国深海潜水器成为海洋科学考察的前沿与制高点之一。

2012年6月27日11时47分,中国“蛟龙”再次刷新“中国深度”——下潜7062米。6月3日,“蛟龙”出征以来,已经连续书写了5个“中国深度”新纪录:6月15日,6671米;6月19日,6965米;6月22日,6963米;6月24日,7020米;6月27日,7062米。下潜至7000米,标志着我国具备了载人到达全球99%以上海洋深处进行作业的能力,标志着“蛟龙”载人潜水器集成技术的成熟,标志着我国深海潜水器成为海洋科学考察的前沿与制高点之一,标志着中国海底载人科学研究和资源勘探能力达到国际领先水平。

‘蛟龙’号是我国载人深潜发展历程中的一个重要里程碑。它不只是一个深海装备,更代表了一种精神,一种不畏艰险、赶超世界的精神,它是中华民族进军深海的号角。

了解蛟龙号”载人深潜器“的骄人业绩,为我国海底载人科学研究和资源勘探能力达到国际领先水平而自豪,小伙伴们与祖国同呼吸、共命运,一定要学好科学文化知识、提高个人能力,增强创新意识,做事精益求精,立科技报国之志!

请编写程序,实现如下功能:读入关于蛟龙号载人潜水器探测数据的多行字符串,从给定的信息找出数字字符,输出每行的数字之和。

提示 若输入为“2012年2月”,则该行的输出为:2014。若干个连续的数字字符作为一个整体,以十进制形式相加。

输入格式:

读入关于蛟龙号载人潜水器探测数据的多行字符串,每行字符不超过80个字符。

以"end"结束。

输出格式:

与输入行相对应的各个整数之和。

 

分析:

用正则表达式来对输入字符串的有效内容的提取。

设计:

编写一个analysis类来对数据将进行处理。

代码实现:

import java.util.Scanner;
import java.util.Arrays;
import java.util.regex.Pattern;
public class Main  {


public static void main(String[] args) {
        // TODO 自动生成的方法存根
            Scanner in = new Scanner(System.in);
            String nextLine=null;
            for(;;)
            { 
                nextLine = in.nextLine();
                if(nextLine != null && !nextLine.equals("end")) 
                {
                    System.out.println(nextLine);
                analysis(nextLine);  
                }
                else
                {
                    break;
                }
            }
            
            
    }

    static void analysis(String a)
    {
        String regEx="[^0-9]+"; 
           Pattern pattern = Pattern.compile(regEx);
           //用定义好的正则表达式拆分字符串,把字符串中的数字留出来
           String[] b = pattern.split(a);
           int sum=0;
           for(int i=0;i<b.length;i++)
           {
               int num=Integer.parseInt(b[i]);
               sum=sum+num;               
           }
           System.out.println(sum);
     }
}           

 踩坑心得:

正则表达式不能很好使用。

改进建议:

处理好对字符串处理的流程。

 

7-3 设计一个银行业务类(PTA大作业四)
 

编写一个银行业务类BankBusiness,具有以下属性和方法:
(1)公有、静态的属性:银行名称bankName,初始值为“中国银行”。
(2)私有属性:账户名name、密码password、账户余额balance。
(3)银行对用户到来的欢迎(welcome)动作(静态、公有方法),显示“中国银行欢迎您的到来!”,其中“中国银行”自动使用bankName的值。
(4)银行对用户离开的提醒(welcomeNext)动作(静态、公有方法),显示“请收好您的证件和物品,欢迎您下次光临!”
(5)带参数的构造方法,完成开户操作。需要账户名name、密码password信息,同时让账户余额为0。
(6)用户的存款(deposit)操作(公有方法,需要密码和交易额信息),密码不对时无法存款且提示“您的密码错误!”;密码正确、完成用户存款操作后,要提示用户的账户余额,例如“您的余额有1000.0元。”。
(7)用户的取款(withdraw)操作(公有方法,需要密码和交易额信息)。密码不对时无法取款且提示“您的密码错误!”;密码正确但余额不足时提示“您的余额不足!”;密码正确且余额充足时扣除交易额并提示用户的账户余额,例如“请取走钞票,您的余额还有500.0元。”。

编写一个测试类Main,在main方法中,先后执行以下操作:
(1)调用BankBusiness类的welcome()方法。
(2)接收键盘输入的用户名、密码信息作为参数,调用BankBusiness类带参数的构造方法,从而创建一个BankBusiness类的对象account。
(3)调用account的存款方法,输入正确的密码,存入若干元。密码及存款金额从键盘输入。
(4)调用account的取款方法,输入错误的密码,试图取款若干元。密码及取款金额从键盘输入。
(5)调用account的取款方法,输入正确的密码,试图取款若干元(取款金额大于余额)。密码及取款金额从键盘输入。
(6)调用account的取款方法,输入正确的密码,试图取款若干元(取款金额小于余额)。密码及取款金额从键盘输入。
(7)调用BankBusiness类的welcomeNext()方法。

输入格式:

输入开户需要的姓名、密码
输入正确密码、存款金额
输入错误密码、取款金额
输入正确密码、大于余额的取款金额
输入正确密码、小于余额的取款金额

输出格式:

中国银行(银行名称)欢迎您的到来!
您的余额有多少元。
您的密码错误!
您的余额不足!
请取走钞票,您的余额还有多少元。
请收好您的证件和物品,欢迎您下次光临!

 

分析:

题目要求对银行类的编写,用一个测试类Main实现其相应功能。

设计:

首先根据题目要求编写BankBusiness类,按要求处理类中属性和方法的可见性。

 

代码实现:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner in=new Scanner(System.in);
        BankBusiness.welcome();
        BankBusiness account=new BankBusiness(in.next(),in.next());
        account.deposit(in.next(), in.nextDouble());
        account.withdraw(in.next(), in.nextDouble());
        account.withdraw(in.next(), in.nextDouble());
        account.withdraw(in.next(), in.nextDouble());
        BankBusiness.welcomeNext();
    }

}

 class BankBusiness {
    public static String bankName="中国银行";
    private String name;
    private String password;
    private double balance;
    BankBusiness()
    {
        
    }
    BankBusiness(String name,String password)
    {
        this.name=name;
        this.password=password;
        this.balance=0.0;
    }

    public static void welcome()
    {
        System.out.println(bankName+"欢迎您的到来!");
    }
    public static void welcomeNext()
    {
        System.out.println("请收好您的证件和物品,欢迎您下次光临!");
    }
    public void deposit(String password,double RMB)//存款
    {
        if(password.equals(this.password))
        {
            this.balance=RMB;
            System.out.println("您的余额有"+this.balance+"元。");
        }
        else
        {
            System.out.println("您的密码错误!");
        }
        
    }
    public void withdraw(String password,double RMB)
    {
        if(password.equals(this.password)&&this.balance>=RMB)
        {
            this.balance=this.balance-RMB;
            System.out.println("请取走钞票,您的余额还有"+this.balance+"元。");
        }
        else if(password.equals(this.password)&&this.balance<RMB)
        {
            System.out.println("您的余额不足!");
        }
        else if(!password.equals(this.password))
        {
            System.out.println("您的密码错误!");
        }
    }
}

 踩坑心得:

理清楚不同修饰符的可见性

改进建议:

丰富BankBusiness类的功能,使其更加适用。

 

实验三(1)

1、  农夫过河问题:将之前的代码进行如下改进:

(1)      为之前的类添加合适的父类。

(2)      为父类添加适合的属性和方法。并以此为基础修改原有的类,使之与添加的类构成继承关系。

(3)      使用多态改进整个代码,提高代码的复用性。

2、  请画出完整类图,包含每个类的类名、属性、方法以及类与类的关联,并用文字说明关联类的关联关系。

3、  说明你设计的继承关系的理由,为什么不用组合

4、  说明你在哪部分代码中使用了多态,带来了什么好处。

 

分析:

构造羊,菜,狼,农夫的共同父类,对原代码进行相应的改进。

设计:

设计的类应该含有羊、狼、菜、农夫的共同属性和方法。

 

代码实现:

 
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Game game = new Game();
        game.play();        
    }
}

public class GameGui {
    public static void menu()
    {
        /* 显示菜单 */
        System.out.println("==================Please choose operation============");
        System.out.println("\t==========1:Cross the river alone===========");
        System.out.println("\t==========2:Cross the river with wolf=========");
        System.out.println("\t==========3:Cross the river with sheep============");
        System.out.println("\t==========4:Cross the river with cabbage==========");
        System.out.println("\t==========0:Quit===============");   
        System.out.println("===================================================");
        System.out.println("Input the number(0~4):");
    }    

    public static void showStatus(Life farmer, Life wolf,Life sheep, Life cabbage) {
        /* 输出农夫、各种动物、物品的状态(生存、位置) */
            ((Farmer)farmer).showStatus();
            ((Wolf)wolf).showStatus();
            ((Sheep)sheep).showStatus();
            ((Cabbage)cabbage).showStatus();
        }

}


public class Game {
    Life wolf;
    Life sheep;
    Life cabbage;
    Life farmer;
    Boat boat;
    
    Game() {
        wolf = new Wolf();
        sheep = new Sheep();
        cabbage = new Cabbage();
        farmer = new Farmer();
        boat=new Boat();
    }
    
    
    protected void play() {
        Scanner input = new Scanner(System.in);
        int choice = 0;            //用户输入选择
        boolean gameOver=false,//游戏结束标志,默认为false,代表游戏进行中,未结束
                win=false;     //游戏输赢标志,默认为false,代表未赢得游戏。
        while(!gameOver)
        {
            GameGui.menu();//类名调用非实例方法
            choice = input.nextInt();
            boat.CrossRiver(sheep,cabbage, farmer,wolf,choice);
             ((Wolf)wolf).eatSheep(sheep,farmer);//狼吃羊,如果羊不在同一边,则吃不到,如果在同一边,羊被吃
             ((Sheep)sheep).eatCabbage(cabbage,farmer);//同上
            GameGui.showStatus(farmer,wolf,sheep,cabbage);
//            sheep.set();
//            wolf.set();
//            cabbage.set();
            gameOver = isGameOver();
        }        
        win=this.hasWin();
        if(win) {
            System.out.println("game over: you win !");
        }else {
            System.out.println("game over: you lose !");
        }
        input.close();

    }
    /*
     * 判断游戏是否结束
     * 输入:无
     * 运算:羊、白菜任一实体被吃,游戏结束,或者狼、羊、白菜均未被吃且全部渡过河,游戏结束
     * 输出:游戏结束--返回true ,未结束--返回false
     */
    public boolean isGameOver() {
        if(sheep.getisAlive()==false||cabbage.getisAlive()==false) {
            return true;
        }            
        if(wolf.gethasCross()&&sheep.gethasCross()&&cabbage.gethasCross()) {
            return true;
        }
        return false;
    }
    /*
     * 判断游戏是否胜利
     * 前置条件:游戏结束
     * 输入:无
     * 运算:狼、羊、白菜均未被吃且全部渡过河,游戏胜利,否则失败
     * 输出:游戏胜利--返回true ,失败--返回false
     */
    public boolean hasWin() {
        if(sheep.getisAlive()==false||cabbage.getisAlive()==false) {
            return false;
        }            
        if(wolf.gethasCross()&&sheep.gethasCross()&&cabbage.gethasCross()) {
            return true;
        }else {
            return false;
        }        
    }
    
}

public class Life {
    private  boolean crossRiver=false;
    private boolean isAlive=true;
    private boolean hasCross=false;

    boolean getcrossRiver()
    {
        return crossRiver;
    }
    boolean gethasCross()
    {
        return hasCross;
    }
    boolean getisAlive()
    {
        return isAlive;
    }
    
    void setcrossRiver()
    {
        crossRiver=!crossRiver;
    }
    void sethasCross()
    {
        hasCross=!hasCross;
    }
    void setisAlive()
    {
        isAlive=!isAlive;
    }
}

public class Boat {
    void CrossRiver(Life sheep,Life cabbage,Life farmer,Life wolf,int choice)
    {
        switch(choice)
        {
            case 0: 
                System.out.print("退出游戏");
                System.exit(0);
                break;
            case 1:/* 农夫独自过河的处理 */
//                boat.setcrossRiver();
                farmer.setcrossRiver();
                farmer.sethasCross();
                break;
            case 2:/* 农夫带狼的处理 */
                if(farmer.gethasCross()==wolf.gethasCross())
                {
//                boat.setcrossRiver();
                farmer.setcrossRiver();
                farmer.sethasCross();
                wolf.setcrossRiver();
                wolf.sethasCross();
                }
                else 
                {
                    System.out.println("农夫与狼不在同一边");
                }
                break;
            case 3:/* 农夫带羊的处理 */
                if(farmer.gethasCross()==sheep.gethasCross())
                {
//                    boat.setcrossRiver();
                    farmer.setcrossRiver();
                    farmer.sethasCross();
                sheep.setcrossRiver();
                sheep.sethasCross();
                }
                else 
                {
                    System.out.println("农夫与羊不在同一边");
                }
                break;
            case 4:/* 农夫带白菜的处理 */
                if(farmer.gethasCross()==cabbage.gethasCross())
                {
//                    boat.setcrossRiver();
                    farmer.setcrossRiver();
                    farmer.sethasCross();
                cabbage.setcrossRiver();
                cabbage.sethasCross();
                }
                else 
                {
                    System.out.println("农夫与菜不在同一边");
                }
                break;
        }
    }
}

public class Farmer extends Life{
    public void showStatus() 
    {
        String a,b;
        if(this.getcrossRiver())
        {
            a="已过河";
        }
        else 
        {
            a="未过河";
        }    
            b="活着";
        System.out.println("农夫:位置 "+a+" 状态 "+b);
    }

}

public class Sheep  extends Life{
    Scanner in=new Scanner(System.in);
    private String name;

    Sheep()
    {
        System.out.println("请输入羊的名字:");
        name=in.next();
        System.out.println("咩咩,我是可爱的小羊"+name);
    }
    public  void showStatus()
    {
        String a,b;
        if(this.getcrossRiver())
        {
            a="已过河";
        }
        else 
        {
            a="未过河";
        }
        if(this.getisAlive())
        {
            b="活着";
        }
        else 
        {
            b="死了";
        }
        System.out.println(name+"羊:位置 "+a+" 状态 "+b);
    }
    public void eatCabbage(Life cabbage,Life farmer) {
            if((cabbage.gethasCross()==this.gethasCross())&&farmer.gethasCross()!=this.gethasCross())
            {
                cabbage.setisAlive();
            }
            
    }

}

public class Wolf extends Life {
    Scanner in=new Scanner(System.in);
    private String name;
    
    Wolf()
    {
        System.out.println("请输入狼的名字:");
        name=in.next();
        System.out.println("啊呜~~~我"+name+"狼又回来了");
    }
    public void showStatus() {
        String a,b;
        if(this.getcrossRiver())
        {
            a="已过河";
        }
        else 
        {
            a="未过河";
        }
        if(this.getisAlive())
        {
            b="活着";
        }
        else 
        {
            b="死了";
        }
        System.out.println(name+"狼:位置 "+a+" 状态 "+b);
    }
    
    public void eatSheep(Life sheep,Life farmer) {
        if((sheep.gethasCross()==this.gethasCross())&&farmer.gethasCross()!=this.gethasCross())
        {
            sheep.setisAlive();
        }
        
    }
    
}

public class Cabbage extends Life {

    public void showStatus()
    {
        String a,b;
        if(this.getcrossRiver())
        {
            a="已过河";
        }
        else 
        {
            a="未过河";
        }
        if(this.getisAlive())
        {
            b="活着";
        }
        else 
        {
            b="死了";
        }
        System.out.println("菜:位置 "+a+" 状态 "+b);
    }

}

踩坑心得:

找出羊、狼、菜、农夫的共有属性。

改进建议:

对Boat类的功能进行丰富,限制其载物数量。

 

总结:

一、获得

1、对继承与多态更加理解,使用更加熟练。

2、了解了抽象类的定义与使用。

3、发现了自己学习中的不足。

二、需要进一步改进的地方:

1、在保证正确的情况下,提升做题速度。

2、编码时的调试能力,在题目代码的编写过程出现的错误要学会自己通过调试来发现问题

      所在并解决它。

 

posted @ 2022-05-09 23:09  LIANの11222  阅读(148)  评论(0)    收藏  举报