【Java】实验三 抽象类与接口

news2024/11/15 17:31:32

实验名称    实验三 抽象类与接口

实验目的  

1. 深刻理解抽象类、接口的意义。

2. 熟练掌握抽象类和接口的定义、继承抽象类以及实现接口的方法。

3. 理解和掌握多态。  

实验内容

(一)抽象类实验:项目源码中新建一个ahpu.shape的包,以下类放在这个包内

1. 定义一个抽象类Shape,包括:

(1)属性:颜色color(可用字符串类型用于输出模拟)

(2)方法:绘制图形的抽象方法draw();对color操作的set方法和get方法。

2. 继承Shape类,设计抽象类RingShape,RingShape无需定义属性与方法。

3. 继承RingShape类,设计Circle类,实现具体的draw方法:可以用print方法模拟绘图,如

System.out.println("Draw a circle with color: " + this.getColor() );

4. 继承RingShape类,设计Ellipse类,实现具体的draw方法:可以用print方法模拟绘图。

5. 继承Shape类,设计Triangle类,实现具体的draw方法:可以用print方法模拟绘图。

6. 设计用于演示的类Demo,对Circle、Ellipse的draw方法进行功能测试。(或者使用JUnit进行测试

7. 定义一个用于求面积的接口IGeometry,求面积的方法为getArea()。

8. 继承Shape类,实现IGeometry接口,设计一个矩形类Rectangle。Rectangle有length、width两个属性。实现具体的draw方法,实现具体的求面积getArea方法。

9. 在Demo类中,或者使用JUnit测试Rectangle类的功能。

// ahpu.shape 包

package ahpu.shape;



// 抽象类 Shape

public abstract class Shape {

    private String color;



    public Shape(String color) {

        this.color = color;

    }



    public String getColor() {

        return color;

    }



    public void setColor(String color) {

        this.color = color;

    }



    public abstract void draw();

}



// 抽象类 RingShape

public abstract class RingShape extends Shape {

    public RingShape(String color) {

        super(color);

    }

}



// 类 Circle

public class Circle extends RingShape {

    public Circle(String color) {

        super(color);

    }



    @Override

    public void draw() {

        System.out.println("Draw a circle with color: " + getColor());

    }

}



// 类 Ellipse

public class Ellipse extends RingShape {

    public Ellipse(String color) {

        super(color);

    }



    @Override

    public void draw() {

        System.out.println("Draw an ellipse with color: " + getColor());

    }

}



// 类 Triangle

public class Triangle extends Shape {

    public Triangle(String color) {

        super(color);

    }



    @Override

    public void draw() {

        System.out.println("Draw a triangle with color: " + getColor());

    }

}



// 接口 IGeometry

public interface IGeometry {

    double getArea();

}



// 类 Rectangle

public class Rectangle extends Shape implements IGeometry {

    private double length;

    private double width;



    public Rectangle(String color, double length, double width) {

        super(color);

        this.length = length;

        this.width = width;

    }



    @Override

    public void draw() {

        System.out.println("Draw a rectangle with color: " + getColor());

    }



    @Override

    public double getArea() {

        return length * width;

    }

}



// 类 Demo

public class Demo {

    public static void main(String[] args) {

        Circle circle = new Circle("Red");

        Ellipse ellipse = new Ellipse("Blue");



        circle.draw();

        ellipse.draw();



        Rectangle rectangle = new Rectangle("Green", 4, 5);

        System.out.println("Rectangle Area: " + rectangle.getArea());

    }

}

(二)多态演示实验:项目源码中新建一个ahpu.vehicle的包,以下类放在这个包内

1. 设计抽象类Vehicle,类中定义了一个抽象方法transport( )表示运输。

2. 继承抽象类Vehicle,设计普通JavaBusBus类中实现了transport( ),可以用print输出来模拟功能,如:

System.out.println("A bus is driving......");

3. 类似2,继承抽象类Vehicle,设计普通JavaAircraftAircraft类中实现了transport( ),可以用print输出来模拟功能。

4. 设计驾驶员类Driver

1)类中有一个Vehicle类对象成员vehicle,并有setget方法;

2)类中有一个方法drive( ),调用了vehicle对象的transport方法,如:

public void drive() {

        vehicle.transport();

}

5. 设计功能演示类Demo,对于Driver类对象driver,分别设置不同的交通工具类对象busBus类对象)和aircraftAircraft类对象),演示不同交通工具对象的不同运输功能(transport方法的多态)。

// ahpu.vehicle 包

package ahpu.vehicle;



// 抽象类 Vehicle

public abstract class Vehicle {

    public abstract void transport();

}



// 类 Bus

public class Bus extends Vehicle {

    @Override

    public void transport() {

        System.out.println("A bus is driving......");

    }

}



// 类 Aircraft

public class Aircraft extends Vehicle {

    @Override

    public void transport() {

        System.out.println("An aircraft is flying......");

    }

}



// 类 Driver

public class Driver {

    private Vehicle vehicle;



    public Vehicle getVehicle() {

        return vehicle;

    }



    public void setVehicle(Vehicle vehicle) {

        this.vehicle = vehicle;

    }



    public void drive() {

        vehicle.transport();

    }

}



// 类 Demo

public class Demo {

    public static void main(String[] args) {

        Driver driver = new Driver();



        Vehicle bus = new Bus();

        Vehicle aircraft = new Aircraft();



        driver.setVehicle(bus);

        driver.drive();



        driver.setVehicle(aircraft);

        driver.drive();

    }

}

(三)接口及匿名内部类实验:项目源码中新建一个ahpu.innerclass的包,以下类放在这个包内

1. 设计接口(interfaceCarCar接口中定义三个方法:start()accelerate()brake()

2. 设计智能机器人(即Car的驾驶员)类SmartRobot,类中定义

1)属性:Car接口的对象car,以及相应的set方法和get方法;

2)方法:drive(),模拟智能机器人的驾驶功能,具体代码可参考:

public void drive() {

        car.start();

        car.accelerate();

        car.brake();

    }

3. 设计功能演示类Demo,对于SmartRobot类对象robot,设置一个基于接口Car的匿名内部类对象,内部类中覆盖实现start()accelerate()brake()三个方法。

4. 演示robot对象的drive方法。

// ahpu.innerclass 包

package ahpu.innerclass;



// 接口 Car

public interface Car {

    void start();



    void accelerate();



    void brake();

}



// 类 SmartRobot

public class SmartRobot {

    private Car car;



    public Car getCar() {

        return car;

    }



    public void setCar(Car car) {

        this.car = car;

    }



    public void drive() {

        car.start();

        car.accelerate();

        car.brake();

    }

}



// 类 Demo

public class Demo {

    public static void main(String[] args) {

        SmartRobot robot = new SmartRobot();



        Car car = new Car() {

            @Override

            public void start() {

                System.out.println("Car is starting...");

            }



            @Override

            public void accelerate() {

                System.out.println("Car is accelerating...");

            }



            @Override

            public void brake() {

                System.out.println("Car is braking...");

            }

        };



        robot.setCar(car);

        robot.drive();

    }

}

实验程序及结果(附录)

思考

如何理解编译时多态与运行时多态?分别举一个例子。

关于编译时多态和运行时多态的理解:

编译时多态(也称为静态多态)是指在编译阶段确定使用哪个方法或类。它与静态类型有关,即编译器使用的类型信息。例如,通过编译时多态,编译器可以确定方法的签名,但无法确定实际调用的方法的具体实现。

Shape shape = new Circle("Red"); // 编译时多态,shape的静态类型是Shape

shape.draw(); // 在编译时确定使用Shape的draw方法

运行时多态(也称为动态多态)是指在程序运行时确定使用哪个方法或类。它与实际对象的类型有关,而不是静态类型。在运行时,Java会动态查找方法的实际实现。

Shape shape = new Circle("Red"); // 运行时多态,shape的实际类型是Circle

shape.draw(); // 在运行时确定使用Circle的draw方法

编译时多态主要涉及编译器的类型检查和方法签名确定,而运行时多态允许根据对象的实际类型调用相应的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1354035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytest-yaml 测试平台-4.生成allure报告,报告反馈企业微信、钉钉、飞书通知

前言 定时任务执行完成后生成可视化allure报告,并把结果发到企业微信,钉钉,飞书通知群里。 生成allure报告 添加定时任务 执行完成后生成allure报告 查看报告详情 报告会显示详细的request 和 response 详细信息 也可以查看log日志 …

计算机基础面试题 |08.精选计算机基础面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

图像清晰度评估指标

图像清晰度评估涉及多个指标,这些指标可用于定量测量图像的清晰度和质量。 以下是一些常见的图像清晰度评估指标: 均方根误差(Root Mean Square Error,RMSE): 通过计算原始图像和处理后图像之间的像素差异的…

kbdnecnt.DLL文件缺失,软件或游戏无法启动运行,怎样快速修复?

不少人都在问“kbdnecnt.DLL文件”是什么?为什么电脑总是报错提示说“kbdnecnt.DLL文件缺失,软件无法启动”? 首先,先来了解“kbdnecnt.DLL文件”是什么? kbdnecnt.DLL是Windows操作系统中的一个动态链接库文件&#…

关于几何建模内核

几何建模内核是用于提供计算机辅助设计 (CAD) 软件中的 3D 建模功能的软件组件。它用于设计虚拟模型以为真实对象的仿真和制造提供支持。几何建模内核使用各种不同的几何表示形式来表示真实对象。这些模型包括使用三角形表面网格粗略估计对象的小平面模型,以及使用在…

docker如何配置阿里云镜像加速?

登录阿里云后,我们点击右上角的控制台,控制台中搜索镜像加速服务,然后点击帮助文档的官方镜像加速: 点击容器镜像服务控制台: 在镜像工具里面的镜像加速器中就可以看到: 分别执行即可: 之后我们…

五步解决Ubuntu界面太小的问题

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder) 对于20版本及以上的unbuntu我们可以通过安装open-vm-tools来解决界面大小的问题,具体步骤如…

修改多选框el-checkbox样式, 大小,背景色

修改多选框el-checkbox样式, 大小,背景色 /* 背景透明 */ .el-checkbox__inner {background: transparent;border: 1px solid #00ffe5; } /* 选中样式 */ .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {b…

简易机器学习笔记(七)计算机视觉基础 - 常用卷积核和简单的图片的处理

前言 这里实际上涉及到了挺多有关有关理论的东西,可以详细看一下paddle的官方文档。不过我这里不过多的谈有关理论的东西。 【低层视觉】低层视觉中常见的卷积核汇总 图像处理中常用的卷积核 在代码中,我们实际上是用不同的卷积核来造成不同的影响&a…

2024年关键技术发展战略趋势前瞻

技术趋势在不断变化,但总的趋势是技术日益深入人类生活的方方面面,这些趋势可能会对未来的科技发展和人类生活产生深远影响,以下是预计今年将塑造未来的一些关键技术趋势。 更多的人将采用人工智能和机器学习 人工智能(AI)和机器学习(ML)不…

报表生成器FastReport .Net用户指南:带图表的报告(图表编辑器)

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案,使用FastReport .NET可以创建独立于应用程序的.NET报表,同时FastReport .Net支持中文、英语等14种语言,可以让你的产品保证真正的国际性。 FastReport.NET官方版…

自动化测试用例设计粒度

自动化测试用例的粒度指的是测试用例的细致程度,即每个测试用例检查的功能点的数量和范围。 通常,根据测试用例的粒度,可以被分为3种不同的层次,从更低层次的细粒度到更高层次的粗粒度。 第一种:单元测试 - 细粒度 …

性能测试之(六):JMeter 元件

元件(多个类似功能组件的容器) 组件:封装的方法,比如取样器中的发送请求的方法 一、常见的元件 1、取样器:发送请求2、逻辑处理:控制语句执行顺序3、前置处理器:在请求(取样器&…

Spark---RDD算子(单值类型Value)

文章目录 1.RDD算子介绍2.转换算子2.1 Value类型2.1.1 map2.1.2 mapPartitions2.1.3 mapPartitionsWithIndex2.1.4 flatMap2.1.5 glom2.1.6 groupBy2.1.7 filter2.1.8 sample2.1.9 distinct2.1.10 coalesce2.1.11 repartition2.1.12 sortBy 1.RDD算子介绍 RDD算子是用于对RDD进…

Spring上下文之support模块DefaultLifecycleProcessor

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

C++的头文件(.h文件)与实现文件(.cpp)应该怎么写比较规范?

C中有头文件(.h)文件和实现文件(.cpp)文件 但是头文件与实现文件具体写什么? 一、头文件的内容 #idndef #define … #endif作用:当头文件被多个其它文件引用时,内部的数据不会被多次定义而造成…

Web自动化测试框架总结

实施过了web系统的UI自动化,回顾梳理下,想到什么写什么,随时补充。 首先,自动化测试不是手动测试的替代品,是比较好的补充,而且不是占大比重的补充。 70%的测试工作集中在底层接口测试和单元测试&#xff0…

css实现纵向分列,中间间距相等

方法一&#xff1a;使用网格布局&#xff08;Grid Layout&#xff09; <!DOCTYPE html> <html> <head><style>.container {height: 100px;display: grid;grid-template-columns: 2fr 1fr 3fr; /* 自定义每一列的比例 *//* 将三个行都设置为平均分配剩…

UV打印机磁栅尺的安装

UV打印机磁栅尺的安装方法有以下几个注意事项&#xff1a; 1. 安装基面的选择&#xff1a;磁栅尺需要粘合在平滑的基面上&#xff0c;基面要足够平整且干净&#xff0c;不能有杂质或油污。 2. 粘合剂的选用&#xff1a;磁栅尺的粘合剂需要选用合适的胶水&#xff0c;最好是专门…

Canal+RabbitMQ实现MySQL数据同步至ClickHouse

ClickHouse作为一个被广泛使用OLAP分析引擎&#xff0c;在执行分析查询时的速度优势很好的弥补了MySQL的不足&#xff0c;但是如何将MySQL数据同步到ClickHouse就成了用户面临的第一个问题。本文利用Canal来实现ClickHouse实时同步MySQL数据&#xff0c;使用RabbitMQ来做消息队…