【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;



// 抽象类 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.mfbz.cn/a/288319.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Transformer从菜鸟到新手(一)

引言 这是从Transformer到LLM(大语言模型)系列的第一篇文章,几乎所有的大语言模型都是基于Transformer结构,因此本文回顾一下Transformer的原理与实现细节,包括分词算法BPE的实现。最终利用从零实现的Transformer模型进行英中翻译。 本文主…

IOS:Safari无法播放MP4(H.264编码)

一、问题描述 MP4使用H.264编码通常具有良好的兼容性,因为H.264是一种广泛支持的视频编码标准。它可以在许多设备和平台上播放,包括电脑、移动设备和流媒体设备。 使用caniuse查询H.264兼容性,看似确实具有良好的兼容性: 然而…

Windows系统镜像检测修复建议

当通过镜像检测功能检测出Windows操作系统磁盘上有残留驱动项、系统中存在残留Xen驱动或者存在禁止安装驱动属性设置等异常检测项时,您可以参考本文的操作指导进行修复。 清理注册表残留驱动 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control注册表树包含了控…

c++基础(对c的扩展)

文章目录 命令空间引用基本本质引用作为参数引用的使用场景 内联函数引出基本概念 函数补充默认参数函数重载c中函数重载定义条件函数重载的原理 命令空间 定义 namespace是单独的作用域 两者不会相互干涉 namespace 名字 { //变量 函数 等等 }eg namespace nameA {int num;v…

TextView ClickableSpan 事件分发的坑

TextView 的 ClickableSpan 有两个坑: 默认情况下,点击 ClickableSpan 的文本时会同时触发绑定在 TextView 的监听事件;默认情况下,点击 ClickableSpan 的文本之外的文本时,TextView 会消费该事件,而不会传…

MySQL运维实战(2.2)忘记密码如何处理

作者:俊达 引言 当你突然忘记了一个普通用户的密码,而又想着通过管理员账号去改密码时,却猛的发现所有管理员账号的密码都离谱地被你忘了。嗨呀,这可真是个尴尬的大麻烦!root账户通常是MySQL中的大boss,你…

Redis(一)

1、redis Redis是一个完全开源免费的高性能(NOSQL)的key-value数据库。它遵守BSD协议,使用ANSI C语言编写,并支持网络和持久化。Redis拥有极高的性能,每秒可以进行11万次的读取操作和8.1万次的写入操作。它支持丰富的数…

【LeetCode:69. x 的平方根 | 二分】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

程序员提问的艺术:28.4K Star指南,告别成为办公室讨厌鬼!

Github: https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way 原文:http://www.catb.org/~esr/faqs/smart-questions.html ✅为什么讨厌某些提问者 未自行尝试解决问题: ❌“怎么用Java写一个排序算法?” 👍&#…

Plantuml之EBNF语法介绍(二十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

java spring核心技术AOP面向切面编程图文并茂包含例子demo

base Aspect-oriented programming面向切面的程序设计用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect)场景: 权限认证,日志和事务处理.demo 基本背景 // 背景: 1. 模拟数据库操作增删改查 …

tomcat session cookie值设置逻辑

tomcat session cookie 值设置,tomcat jsessionid设置 ##调用request.getSession() Controller RequestMapping("/cookie") public class CookieController {RequestMapping("/tomcatRequest")ResponseBodypublic String tomcatRequest(HttpS…

CentOS 7 实战指南:文本处理命令详解

前言 在Linux系统中,文本处理是非常基础却又必不可少的一项技能。如果你正在使用CentOS系统,那么学会如何利用文本操作命令来高效地处理文本文件无疑将会是一个强有力的工具。 本篇文章将介绍一些最常用和最实用的文本操作命令,并通过详尽的…

医院配电能效监管方案

摘要:本文以医院能源监管系统为研究对象,采用智能化技术组建数据库、构建智能化的能耗信息管理系统,实现对医院的能源利用状况进行实时、准确的动态监管。具体而言,该系统建设的主要功能是对医院的能源消耗进行采集、上报、汇总与分析,并生成动态的数据和报表曲线,以及利用分析…

访问学者J1签证的申请流程

访问学者J1签证是许多人前往美国进行学术研究和文化交流的重要途径之一。申请J1签证需要经过一系列步骤和程序,让知识人网小编带大家来了解一下申请流程吧。 首先,申请者需要确认自己符合J1签证的资格要求。这包括被美国的赞助机构或组织接受&#xff0c…

uniapp中uview组件库的Input 输入框 的使用方法

目录 #平台差异说明 #基本使用 #输入框的类型 #可清空字符 #下划线 #前后图标 #前后插槽 API #Props #Events #Methods #Slots 去除fixed、showWordLimit、showConfirmBar、disableDefaultPadding、autosize字段 此组件为一个输入框,默认没有边框和样式…

mysql查询表里的重复数据方法:

1 2 3 4 INSERT INTO hk_test(username, passwd) VALUES (qmf1, qmf1),(qmf2, qmf11) delete from hk_test where usernameqmf1 and passwdqmf1 MySQL里查询表里的重复数据记录: 先查看重复的原始数据: 场景一:列出username字段有重读的数…

jdk动态代理中invoke的return返回的值有什么用?

目录 首先在接口中定义一个行为再定义一个目标角色实现接口,实现行为去代理角色类中解决一下报错,但是什么都不要写 invoke的return返回的值是调用方法中返回的值 下面我们来实例看一下 首先在接口中定义一个行为 public String toMarry02();再定义一个…

金和OA C6 UploadFileEditorSave.aspx 文件上传漏洞复现

0x01 产品简介 金和OA协同办公管理系统软件(简称金和OA),本着简单、适用、高效的原则,贴合企事业单位的实际需求,实行通用化、标准化、智能化、人性化的产品设计,充分体现企事业单位规范管理、提高办公效率的核心思想,为用户提供一整套标准的办公自动化解决方案,以帮助…

关于执行 roslaunch xxxxx yyyy.launch 后,没能进入 RViz 就卡死的问题

Problem 话不多说,先看图。 终端也会提示有报错(可能是这种,但不确定): 这是发现问题所在之后,故意改错,然后尝试的。☝ Solution 总以为是显卡的问题,一直在研究怎么在 Ubuntu2…