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

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

实验目的  

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;// 抽象类 Shapepublic 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();}// 抽象类 RingShapepublic abstract class RingShape extends Shape {public RingShape(String color) {super(color);}}// 类 Circlepublic class Circle extends RingShape {public Circle(String color) {super(color);}@Overridepublic void draw() {System.out.println("Draw a circle with color: " + getColor());}}// 类 Ellipsepublic class Ellipse extends RingShape {public Ellipse(String color) {super(color);}@Overridepublic void draw() {System.out.println("Draw an ellipse with color: " + getColor());}}// 类 Trianglepublic class Triangle extends Shape {public Triangle(String color) {super(color);}@Overridepublic void draw() {System.out.println("Draw a triangle with color: " + getColor());}}// 接口 IGeometrypublic interface IGeometry {double getArea();}// 类 Rectanglepublic 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;}@Overridepublic void draw() {System.out.println("Draw a rectangle with color: " + getColor());}@Overridepublic double getArea() {return length * width;}}// 类 Demopublic 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;// 抽象类 Vehiclepublic abstract class Vehicle {public abstract void transport();}// 类 Buspublic class Bus extends Vehicle {@Overridepublic void transport() {System.out.println("A bus is driving......");}}// 类 Aircraftpublic class Aircraft extends Vehicle {@Overridepublic void transport() {System.out.println("An aircraft is flying......");}}// 类 Driverpublic class Driver {private Vehicle vehicle;public Vehicle getVehicle() {return vehicle;}public void setVehicle(Vehicle vehicle) {this.vehicle = vehicle;}public void drive() {vehicle.transport();}}// 类 Demopublic 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;// 接口 Carpublic interface Car {void start();void accelerate();void brake();}// 类 SmartRobotpublic 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();}}// 类 Demopublic class Demo {public static void main(String[] args) {SmartRobot robot = new SmartRobot();Car car = new Car() {@Overridepublic void start() {System.out.println("Car is starting...");}@Overridepublic void accelerate() {System.out.println("Car is accelerating...");}@Overridepublic 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.mzph.cn/news/596367.shtml

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

相关文章

低代码:实现数据可视化的强大助手

随着数据在企业中的价值越来越受到重视,数据可视化成为了决策者和业务专家们必备的工具。然而,传统的数据可视化开发过程常常繁琐且耗时,限制了其在应用中的广泛应用。低代码平台的出现,为实现高效的数据可视化提供了新的解决方案…

切换node.js不同版本

切换node.js不同版本 因新项目用到vite4创建项目,输入命令后报错,经查询得知是node版本过低导致,所以需要升级node版本,但是又有老的项目需要维护,因此需要多个版本的node使用需求。 流程: 卸载原有的node…

实验笔记之——Linux实现COLMAP

之前博客跑instant-NGP的时候,除了用官方的数据集,用自己的数据则是通过手机采集,同时获得pose与image。但是这种获取的方式对于3D gaussian而言,并不支持对应的数据格式,为此采用COLMAP来根据image获取pose&#xff0…

Python条件语句与运算符优先级详解,python学习必看

文章目录 Python 条件语句Python运算符优先级关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 Python 条件语句 …

springcloud之集成nacos config

写在前面 源码 。 本文看下如下集成nacos config组件。 1:常见配置方式分析 我们先来看下常见的配置方式都有哪些,以及其有什么优点和缺点。 硬编码 优点:hardcode,除了开发的时候快些,爽一下,有个屁优…

Jtti:UNIX管道和重定向功能在系统备份中怎么用

UNIX 管道和重定向功能是在系统备份和数据处理中非常有用的工具。它们可以用于将命令的输出传递给其他命令、将输出保存到文件中,以及通过管道传递数据流。以下是一些在系统备份中使用管道和重定向功能的例子: 1. 备份文件并将输出保存到文件&#xff1a…

深入理解C语言中的return关键字与函数返回机制

各位少年,我是博主那一脸阳光,今天分享return语句的使用和返回 引言 在C语言编程中,return关键字扮演着至关重要的角色,它是实现函数间数据传递和控制流程的关键工具。本文将详细探讨C语言中return语句的使用方式、作用机制以及它…

洗地机什么牌子最好?家用洗地机推荐指南

随着人们对健康和卫生的关注日益增长,洗地机成为了现代家庭清洁的必备工具。然而,在市场上琳琅满目的洗地机品牌中,洗地机哪个品牌最好最实用呢?这是消费者最为关心的问题。现本文将为您介绍几个备受推崇的洗地机品牌,帮助您在众…

Linux进程以及计划任务

一:程序: 1.什么是程序? 执行特定任务的一串代码 ,是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具 用于描述进程要完成的功能,是控制进程执行的指令集 二…

论文查重降重写成大白话可以吗

大家好,今天来聊聊论文查重降重写成大白话可以吗,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 论文查重降重:用大白话解析 一、引言 写论文是每个…

进程的韵律:探索计算机世界中的动态舞台

这里写目录标题 进程定义进程的组成进程与程序区别进程与线程区别进程特点进程控制结尾 进程定义 进程:一个具有一定功能的程序在一个数据集合上的一次动态执行过程。 进程是指正在运行的程序,它是操作系统进行资源分配和调度的基本单位。在计算机中&…

红日靶场第一关 attck

之前因为事情耽搁了,今天争取把第一关红日靶场完成 目前找到了关于外网服务器的网址 之前有过扫描目录得知了登陆界面 和爆破得到的密码 目前我们的想法是把病毒上传到网页当中,所以我们应该找个文件注入点 但是再次之前 我们需要找到网页的绝对路径 …

node知识点

谷歌浏览器内运行一个V8的JS引擎,该引擎负责接收JS代码,优化代码,然后在计算机上执行。 node.js: JS代码用于服务器端脚本而开发的环境。 开源跨平台:不局限于单一的操作系统或硬件架构JS运行时环境 node.js如何工作&#xff…

生成式AI:软件工程的未来伙伴

随着技术不断进步,软件工程正在经历一场革命性的变革。从最初的穿孔卡片和汇编语言编程,到现代集成开发环境和高级编程语言,软件工程已经走过了一条漫长的路。现在,生成式人工智能(AI)正打开新的篇章,不仅对传统的编码…

解决SyntaxError: future feature annotations is not defined,可适用其他包

方法:对报错的包进行降级 pip install tikzplotlib0.9.8site-packages后面是使用pip install安装的包,根据这个找到报错的包 想法来源: 环境是python3.6,完全按照作者要求进行环境配置,但仍报错。 我在网上找的解决…

当AI遇见大脑:电脑与人脑协同“进化”

编者按:2023年是微软亚洲研究院建院25周年。借此机会,我们特别策划了“智启未来”系列文章,邀请到微软亚洲研究院不同研究领域的领军人物,以署名文章的形式分享他们对人工智能、计算机及其交叉学科领域的观点洞察及前沿展望。希望…

FFmpeg之——获取上传视频的尺寸(长、宽)

获取上传视频的尺寸: 获取视频尺寸通常需要借助第三方库FFmpeg。 首先,确保你的系统中已安装了FFmpeg,并且FFmpeg的可执行文件路径已经添加到你的系统环境变量中。 1.官网下载ffmpeg 进入 链接: ffmpeg官网 网址,点击下载wind…

MySQL中的连接池

数据库的连接池 1 )概述 网站连接数据库,为庞大用户的每次请求创建一个连接是不合适的关闭并重新连接的成本是很大的处理方法:设置最大值, 最小值, 设置最多闲置连接,设置等待阻塞 2 )示例演示 import threading i…

C++五子棋人机对战(已修复已知问题)

C五子棋人机对战(含注释)-CSDN博客 C五子棋人机对战-CSDN博客 这两篇博客中有个bug&#xff0c;就是没加srand(time(0));这个语句(放在主函数的最开头) 改正代码 #include<bits/stdc.h>//万能头 #define ll long long using namespace std; ll n,a[1000][1000],x,y,…

架构设计系列9,10

架构设计系列9&#xff1a;前端架构和后端架构的区别 前端架构和后端架构都是软件系统中最关键的架构层&#xff0c;负责处理不同方面的任务和逻辑&#xff0c;两者之间是存在一些区别和联系的&#xff0c;我会从以下几个方面来阐述&#xff1a; 定位和职责 ● 前端架构主要…