实验三 面向对象(二)

实验三 面向对象(二)

<center> 
<strong>姓名:</strong> 
<u>XXX</u> 
&emsp;&emsp;
<strong>班级:</strong> 
<u>XXXXX</u> 
&emsp;&emsp;
<strong>学号:</strong>
<u>XXXXXXXXXXXX</u></center>

一、实验目的

  在集成开发环境下,实现类的继承及多态,实现抽象类、接口的定义,根据实际问题,运用抽象方法、接口及抽象类进行程序开发。

二、实验目标

  (1)能够运用Java语言来实现类的继承及多态性、熟练使用包来扩展程序功能并能建立自己的包;

  (2)能够灵活运用Java语言的抽象方法、接口、抽象类来编写应用程序解决实际问题。

三、实验内容

3.1 实验环境

IntelliJ IDEA Community Edition 2021.1 x64 + openjdk-16.0.1

3.2 实验内容
  1. 设计一个抽象类图形类,在该类中包含有至少三个抽象方法,分别用于求周长、求面积,以及对图形进行描述(如,“这是**形状,周长是**,面积是**”),分别定义圆形类、长方形类、等边三角形类来继承图形类,实现上述三个方法,并创建实例验证。

  2. 定义一个抽象接口Lecture,接口中至少有两个抽象方法talk()homework(),分别定义Student类与Teacher类实现Lecture接口,Student类的talk()方法用于模拟学生回答问题,Teacher类的talk()方法用于模拟老师提出问题,Student类的homework ()方法用于模拟学生写作业,Teacher类的homework ()方法用于模拟老师布置作业。

  3. 定义一个抽象接口,该接口用于求和与统计数量。定义两个奇数类与偶数类实现上述接口,分别可以求100以内的奇数的和,统计100以内的奇数个数,以及求100以内的偶数的和,统计100以内的偶数个数。

  4. 定义一个抽象类动物类,同时定义抽象接口:进食接口、睡觉接口、思考接口、说话接口、行走接口、游泳接口、飞翔的接口。分别定义猫类、人类、鸟类、鱼类继承动物类,同时,根据实际情况,选择性实现上述接口,并创建实例验证。

四、实验过程分析

4.1 实验步骤
  • 设计一个抽象类图形类,在该类中包含有至少三个抽象方法,分别用于求周长、求面积,以及对图形进行描述(如,“这是**形状,周长是**,面积是**”),分别定义圆形类、长方形类、等边三角形类来继承图形类,实现上述三个方法,并创建实例验证。

实验代码

abstract class Shape {
    public abstract double calculatePerimeter ();
    public abstract void describe ();
    public abstract double calculateSquare ();}

class Round extends Shape {
    private final double R;
    public Round(double r) {R = r;}

    @Override
    public double calculatePerimeter() {return Math.PI * this.R * 2;}
    @Override
    public void describe() {System.out.println("这是一个半径为" + this.R + "的圆, 面积为" + calculateSquare() + ", 周长为" + calculatePerimeter());}
    @Override
    public double calculateSquare() {return Math.PI * this.R * this.R;}}

class Rectangle extends Shape {
    private final double a;
    private final double b;
    public Rectangle(double a, double b) {
        this.a = a;
        this.b = b;}

    @Override
    public double calculatePerimeter() {return this.a * 2 + this.b * 2;}
    @Override
    public void describe() {System.out.println("这是一个长为" + this.a + ",宽为" + this.b + "的矩形, 面积为" + calculateSquare() + ", 周长为" + calculatePerimeter());}
    @Override
    public double calculateSquare() {return this.a * this.b;}}

class EquilateralTriangle extends Shape {
    private final double a;
    public EquilateralTriangle(double a) {this.a = a;}
    @Override
    public double calculatePerimeter() {return this.a * 3;}
    @Override
    public void describe() {System.out.println("这是一个变长为" + this.a + "的等边三角形, 面积为" + calculateSquare() + ", 周长为" + calculatePerimeter());}
    @Override
    public double calculateSquare() {return this.a * this.a * 2 * Math.sqrt(3);}}

public class first {
    public static void main(String[] args) {
        Shape shape1 = new Round(2);
        Shape shape2 = new Rectangle(3, 4);
        Shape shape3 = new EquilateralTriangle(3);
        shape1.describe();
        shape2.describe();
        shape3.describe();}}

结果输出

这是一个半径为2.0的圆, 面积为12.566370614359172, 周长为12.566370614359172
这是一个长为3.0,宽为4.0的矩形, 面积为12.0, 周长为14.0
这是一个变长为3.0的等边三角形, 面积为31.17691453623979, 周长为9.0
  • 定义一个抽象接口Lecture,接口中至少有两个抽象方法talk()homework(),分别定义Student类与Teacher类实现Lecture接口,Student类的talk()方法用于模拟学生回答问题,Teacher类的talk()方法用于模拟老师提出问题,Student类的homework ()方法用于模拟学生写作业,Teacher类的homework ()方法用于模拟老师布置作业。

实验代码

interface Lecture {
    public abstract void talked ();
    public abstract void op_homework ();}
class Student implements Lecture {
    private final String name;
    @Override
    public void talked() {System.out.println(this.name + "回答问题");}
    public Student(String name) {this.name = name;}
    @Override
    public void op_homework() {System.out.println(this.name + "做作业"); }}

class Teacher implements Lecture {
    private final String name;
    @Override
    public void talked() {System.out.println(this.name + "提出一个问题");}
    public Teacher(String name) {this.name = name;}
    @Override
    public void op_homework() {System.out.println(this.name + "布置了作业");}}

public class two {
    public static void main(String[] args) {
        Teacher teacher = new Teacher("Smith");
        Student student = new Student("john");
        teacher.talked();
        student.talked();
        teacher.op_homework();
        student.op_homework();}}

结果输出

Smith提出一个问题
john回答问题
Smith布置了作业
john做作业
  • 定义一个抽象接口,该接口用于求和与统计数量。定义两个奇数类与偶数类实现上述接口,分别可以求100以内的奇数的和,统计100以内的奇数个数,以及求100以内的偶数的和,统计100以内的偶数个数。

实验代码

interface Countable {
    public abstract int sum ();
    public abstract int count ();}
// 偶数
class Even implements Countable {
    @Override
    public int sum() {
        int sum = 0;
        for (int i = 1; i <= 100; i++)
            if (i % 2 == 0) sum += i;
        return sum;}

    @Override
    public int count() {
        int count = 0;
        for (int i = 1; i <= 100; i++)
            if (i % 2 == 0) count++;
        return count;}}

// 奇数
class Odd implements Countable {
    @Override
    public int sum() {
        int sum = 0;
        for (int i = 1; i <= 100; i++)
            if (i % 2 != 0)
                sum += i;
        return sum;}

    @Override
    public int count() {
        int count = 0;
        for (int i = 1; i <= 100; i++)
            if (i % 2 != 0)
                count++;
        return count;}}

public class three {
    public static void main(String[] args) {
        Even even = new Even();
        System.out.println("100以内的偶数个数:" + even.count() + "个");
        System.out.println("100以内的偶数和:" +  even.sum());
        Odd odd = new Odd();
        System.out.println("100以内的奇数个数:" + odd.count() + "个");
        System.out.println("100以内的奇数和:" +  odd.sum()); }}

结果输出

100以内的偶数个数:50个
100以内的偶数和:2550
100以内的奇数个数:50个
100以内的奇数和:2500
  • 定义一个抽象类动物类,同时定义抽象接口:进食接口、睡觉接口、思考接口、说话接口、行走接口、游泳接口、飞翔的接口。分别定义猫类、人类、鸟类、鱼类继承动物类,同时,根据实际情况,选择性实现上述接口,并创建实例验证。

实验代码

abstract class Animal {public abstract void breathe ();}

class Cat extends Animal implements AbleToEat, AbleToSleep, Thinkable, Speakable, Walkable {
    @Override
    public void breathe() {System.out.println("Cat is breathe"); }
    @Override
    public void eat() {System.out.println("Cat is eating");}
    @Override
    public void sleep() {System.out.println("Cat is sleeping");}
    @Override
    public void think() {System.out.println("Cat doesn't want to think!");}
    @Override
    public void speak() {System.out.println("Cat can't speak");}
    @Override
    public void walk() {System.out.println("Walking the cat please!");}}

class Fish extends Animal implements AbleToEat, AbleToSleep, Thinkable, Speakable, Walkable {
    @Override
    public void breathe() {System.out.println("Fish is breathe"); }
    @Override
    public void eat() {System.out.println("Fish is eating,fish die.");}
    @Override
    public void sleep() {System.out.println("Fish  slept ,Cat is eating fish");}
    @Override
    public void think() {System.out.println("Fish doesn't want to think!");}
    @Override
    public void speak() {System.out.println("Fish speak blo blo!");}
    @Override
    public void walk() {System.out.println("Fish can't walk!");}}

class Humen extends Animal implements AbleToEat, AbleToSleep, Thinkable, Speakable, Walkable {
    @Override
    public void breathe() {System.out.println("Man is breathe");}
    @Override
    public void eat() {System.out.println("Man is eating");}
    @Override
    public void sleep() { System.out.println("Man is sleeping,the fish is ate by Cat");}
    @Override
    public void think() {System.out.println("The man stop thinking");}
    @Override
    public void speak() {System.out.println("The man :\" shut up!\"");}
    @Override
    public void walk() {System.out.println("The man is walking the cat!");}}

interface AbleToEat {public abstract void eat ();}
interface AbleToSleep {public abstract void sleep ();}
interface Thinkable {public abstract void think ();}
interface Speakable {public abstract void speak ();}
interface Walkable {public abstract void walk ();}
interface AbleToSwim {public abstract void swim ();}
interface Flyable {public abstract void fly ();}

public class four {
    public static void main(String[] args) {
        Cat cat = new Cat();
        Fish fish =new Fish();
        Humen person= new Humen();
        cat.breathe();
        fish.breathe();
        person.breathe();
        person.eat();
        fish.eat();
        cat.eat();
        cat.sleep();
        person.sleep();
        fish.sleep();
        person.think();
        fish.think();
        cat.think();
        cat.walk();
        fish.walk();
        person.walk();}}

结果输出

Cat is breathe
Fish is breathe
Man is breathe
Man is eating
Fish is eating,fish die.
Cat is eating
Cat is sleeping
Man is sleeping,the fish is ate by Cat
Fish  slept ,Cat is eating fish
The man stop thinking
Fish doesn't want to think!
Cat doesn't want to think!
Walking the cat please!
Fish can't walk!
The man is walking the cat!
4.2 错误分析

问题复现
在第二题的设计运行中遇到如下问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TeUaGCES-1642429817828)(..\java编程基础_files\image-20211126155336558.png)]

经检查是出错位置的函数名talk与定义的抽象方法名talked不一致,未覆盖到lecture中的talked方法.

解决方案
将函数名更改一致。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8JnOnmky-1642429817829)(..\java编程基础_files\image-20211126155447114.png)]

五、个人总结

  通过本次实验我能够运用Java语言来实现类的继承及多态性,并且能够灵活运用Java语言的抽象方法、接口、抽象类来编写应用程序解决实际问题。在实验中遇到了许多问题,但是在同学的帮助下得到了很好的解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值