Java实验报告2

一、实验目的

本实验为Java课程的第二次实验,其主要目的如下:

  1. 理解继承和多态的概念;

  2. 掌握域和方法在继承中的特点;

  3. 掌握构造函数的继承和重载;

  4. 掌握this和super的用法;

二、实验原理

​ 继承性是面向对象编程技术的最重要的基础概念之一。在面向对象的程序设计中,类的继承性允许创建分等级层次的类。在Java编程中,类可以继承另一个类,这个类除了创建自己的成员外,还能够继承或扩展另一个类的成员。在这个继承关系中,被继承的类叫超类(Super class)或基类(Base class)、父类(Parent class),继承的类叫继承类(Derived class)或子类(Sub class)。因此,子类是对超类的一种扩展,它可以继承超类定义的成员变量和方法,也可以隐藏或覆盖超类的成员变量和方法,并且它也有自己的成员变量和方法。

​ 对象通过类可以实现封装,通过子类可以实现继承。例如,对于各种用途的汽车,它们都具备汽车的共性,但是,它们各自还有着自身的特点,这些特点是由汽车的子类实现。

​ 子类继承了超类的所有变量和方法,同时又有了自身的变量和方法。通过超类和子类构成类的层次。类的层次可以从最基本的类开始,创建一系列的子类来逐步特殊化。同时通过继承实现代码重用,减少程序的复杂性。在Java语言中,类只支持单一继承,接口可以实现多重继承。

​ 在Java语言中,所有的类都是通过直接或间接地继承java.lang.Object类。子类继承了超类的状态和行动,同时又可以修改超类的状态或覆盖超类的行动,并添加新的状态和行动。

三、实验内容

简要说明实验内容:

设计一个求立方体体积的父类,包含一个显示底面各个形状信息的统一方法,信息显示方式 “类别+周长+面积”;一个计算和显示立方体体积的统一方法

设计三个子类(利用继承关系):圆柱、长方体、三棱柱,包含参数设置方法、底面周长计算方法、底面面积计算方法。

设计一个测试类,用以下信息进行设置:

高相同,底部形状不同(h=10);

一个圆形(Circle)(r=4);

一个矩形(Rectangle)(长:4,宽:3);

一个三角形(Triangle)(三个边长都为6);

输出底面信息和体积。

步骤

  1. 新建一个Java工程,命名为TestVolume;

  2. 新建和实现五个Java类:Volume、Cylinder、Cuboid、Prism、Test;

  3. 编译、调试并运行程序,观察输出结果是否正确;

四、实验过程及结果

了解完要做的事情后,就要开始写代码。严格按照实验任务写出来的代码是:

Volume.java

package TestVolume;

public abstract class Volume {
    double h=2,S,C;
    public abstract void calculate();

    public abstract void show();
}

Cylinder.java

package TestVolume;

import static java.lang.Math.PI;

public class Cylinder extends Volume {
    double r;
    static String lei="圆柱体";
    public void calculate(){
        System.out.printf("体积:%f\n",h*PI*r*r);
    }
    public void show() {
        C=PI*2*r;
        S=PI*r*r;
        System.out.printf("类别:%s,周长:%f,面积:%f\n",lei,C,S);
    }
}

Cuboid.java

package TestVolume;

public class Cuboid extends Volume {
    double a,b;
    static String lei="长方体";
    public void calculate(){
        System.out.printf("体积:%f\n",h*a*b);
    }
    public void show() {
        C=2*(a+b);
        S=a*b;
        System.out.printf("类别:%s,周长:%f,面积:%f\n",lei,C,S);
    }
}

Prism.java

package TestVolume;

import static java.lang.Math.sqrt;

public class Prism extends Volume{
    double a,b,c;
    static String lei="三棱柱";
    public void calculate(){
        double p=(a+b+c)/2;
        S=sqrt(p*(p-a)*(p-b)*(p-c));
        System.out.printf("体积:%f\n",h*S);
    }
    public void show() {
        C=a+b+c;
        double p=C/2;
        S=sqrt(p*(p-a)*(p-b)*(p-c));
        System.out.printf("类别:%s,周长:%f,面积:%f\n",lei,C,S);
    }
}

Test.java

package TestVolume;

public class Test{
    public static void main(String[] args) {
        Cylinder y=new Cylinder();
        y.r=4;
        y.show();
        y.calculate();
        Cuboid c=new Cuboid();
        c.a=4;c.b=3;
        c.show();
        c.calculate();
        Prism s=new Prism();
        s.a=s.b=s.c=6;
        s.show();
        s.calculate();
    }
}

运行结果:

image-20240331105643963

完整完成实验任务!

五、总结与反思

1. 继承的理解与运用

继承的概念:Java中的继承是一种面向对象编程的重要特性,它允许一个类(子类或派生类)继承另一个类(父类或基类)的属性和方法。这种机制有助于减少代码冗余,提高代码复用性。

实践心得:在实际编程中,我体会到继承可以使代码结构更清晰,更易于维护。例如,当我们需要创建多个具有相似属性和方法的类时,可以通过继承一个父类来实现。这样,当我们需要修改这些类的共同特性时,只需要在父类中修改即可,而无需在每个子类中分别修改。

2. 抽象类的应用

抽象类的概念:抽象类是一种特殊的类,它不能被实例化,只能被其他类继承。抽象类中可以包含抽象方法(没有具体实现的方法),子类必须实现这些抽象方法才能被实例化。

实践心得:抽象类在Java编程中扮演着非常重要的角色。它允许我们定义一种通用的行为或结构,而具体的实现细节则由子类来完成。这种机制非常适合于处理具有共同特征但又有不同实现细节的类。例如,在设计一个游戏时,我们可以创建一个抽象的“角色”类,其中包含角色的共同属性(如生命值、攻击力等)和抽象方法(如移动、攻击等)。然后,针对不同的角色类型(如战士、法师等),我们可以创建继承自“角色”类的子类,并实现具体的移动和攻击行为。

3. 继承与抽象类的关系与区别

关系与区别:继承是面向对象编程中的一个基本特性,它允许我们创建具有层次结构的类。而抽象类则是继承的一种特殊形式,它提供了一种定义通用结构和行为的机制,但具体的实现细节则由子类来完成。

实践心得:在使用继承与抽象类时,我体会到它们之间既有联系又有区别。继承为我们提供了一种代码复用的方式,而抽象类则为我们提供了一种定义通用结构和行为的方式。在实际编程中,我们需要根据具体的需求来选择合适的机制。例如,当我们需要创建一组具有共同属性和方法的类时,可以使用继承;而当我们需要定义一种通用的行为或结构时,可以使用抽象类。

4. 学习过程中的挑战与收获

挑战:在学习Java继承与抽象类的过程中,我遇到了一些挑战。例如,刚开始时我对抽象类和接口的区别不太理解,容易混淆它们的使用场景。此外,在设计复杂的类层次结构时,我也需要花费一定的时间来思考如何合理地使用继承和抽象类。

收获:通过不断的学习和实践,我逐渐掌握了Java继承与抽象类的使用技巧。我学会了如何根据实际需求选择合适的机制来设计类的层次结构。同时,我也深刻体会到了面向对象编程的优势和魅力,它使我能够更加灵活地应对复杂的编程问题。

总的来说,学习Java继承与抽象类是一个充满挑战和收获的过程。通过不断的学习和实践,我相信自己能够更好地掌握这些重要的编程概念,并在未来的编程工作中发挥出更大的作用。

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

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

相关文章

日志集中审计系列(3)--- LogAuditor接收UMA设备syslog日志

日志集中审计系列(3)--- LogAuditor接收UMA设备日志 前言拓扑图设备选型组网需求配置思路操作步骤结果验证前言 近期有读者留言:“因华为数通模拟器仅能支持USG6000V的防火墙,无法支持别的安全产品,导致很多网络安全的方案和产品功能无法模拟练习,是否有真机操作的实验或…

深度学习(四)笔记1

0.前提 往后我会以我的笔记形式来发布我的文章(每3次笔记为一篇文章),有爱的人可以自取学习,当然如果可以的话我会把我的文章翻出来变成文章。 1.数据操作 本期4.1数据操作的链接在这。 链接:https://pan.baidu.com/s…

测试图片可否直接粘贴进csdn,后期删除

java图书管理系统mysqlswing版本 V1.0.1版 P1,简介项目功能: 运行主函数运行程序,进入管 理系统的登录界面

9.Python类与对象

1 面向对象 类和对象都是面向对象中的重要概念。面向对象是一种编程思想, 即按照真实世界的思维方式构建软件系统。 例如,在真实世界的校园里有学生和老师,学生有学号、姓名、所 在班级等属性(数据),还有…

顺序表详解

目录 线性表顺序表概念及结构接口实现初始化函数void SLInit(SL *psl);销毁函数 void SLDestroy(SL *psl);尾插函数void SLPushBack(SL* psl ,SLDataType x);封装函数void SLCheckCapacity(SL* psl)头插函数void SLPushFront(SL* psl, SLDataType x);尾删函数void SLPopBack(SL…

洛谷_P2437 蜜蜂路线_python写法_高精度加法

目录 1. 40分代码 2.高精度加法 3.全AC代码 4.惊掉下巴的解法 P2437 蜜蜂路线 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 1. 40分代码 m, n map(int,input().split())ans 0 d [1,2] flag [0 for _ in range(n1)] def fun(step):global ansif step n:ans 1return…

了解微信小程序开发流程

前言:本文只适合初学者了解大致开发流程,好让后续学习胸有成竹,有条不紊 1、开发准备 ① 在微信公众平台 (qq.com)完成微信小程序账号注册 ②下载安装微信小程序开发者工具 2、创建项目 新建 新建时需要的appid,在微信公众平…

GeoLite2 geoip数据库下载和使用

GeoLite2 数据库是免费的 IP 地理定位数据库,与MaxMind 的 GeoIP2 数据库相当,但准确度较低 。GeoLite2 国家、城市和 ASN 数据库 每周更新两次,即每周二和周五。GeoLite2 数据还可作为 GeoLite2 Country 和 GeoLite2 City Web 服务中的 Web …

微服务监控:确保分布式系统的可观察性与稳定性

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 目录 一、前言二、微服务监控的重要性三、关键监控指标四、常用监控工具五、最佳实践六、结论 一、前言 在当前的软件开发领域&a…

Lua环境下载与配置

这里介绍如何下载已经编译好的Lua环境,如何配置Lua环境。 如希望自己从源码编译Lua环境,请自行搜索资料。 第一步:下载编译好的lua环境 打开下面链接,然后根据指引下载。 The Programming Language Luahttps://www.lua.org/hom…

【Python系列】合并配置文件的最佳实践

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

ssm停车场管理系统

点赞收藏关注 → 私信领取本源代码、数据库 摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于停车场管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了停…

【微服务】spring状态机模式使用详解

一、前言 在很多系统中,通常会涉及到某个业务需要进行各种状态的切换操作,例如在审批流程场景下,某个审批的向下流转需要依赖于上一个状态的结束,再比如电商购物场景中,一个订单的生命周期往往伴随着不同的状态&#…

基于java+springboot+vue实现的付费自习室管理系统(文末源码+Lw+ppt)23-400

摘 要 付费自习室管理系统采用B/S架构,数据库是MySQL。网站的搭建与开发采用了先进的java进行编写,使用了springboot框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。主要功能包括:个人信息修改,对用户…

JavaSE类和对象

目录 1.面向对象 1.1面向对象的过程 2.类的定义和使用 2.1定义 2.2使用 2.2.1实例化 2.2.2访问类中数据 2.3类和对象说明 3.this引用 4.对象的构造及初始化 4.1初始化对象 4.2构造方法 4.2.1特性 4.3默认初始化 4.4就地初始化 5.封装 5.1概念 ​编辑 5.2访问限定…

ky9250(mpu9250)取得原始数据后通过简易卡尔曼滤波获取角度

我们通过ky9250(mpu9250)取得原始数据后(gx,gy,gz,ax,ay,az,mx,my,mz)后想通过原始数据解算角度姿态信息(想试验各种算法比如卡尔曼、mahony,Madgwick),现将使用简易卡尔曼滤波获取姿态角度roll,pitch,yaw的方法介绍如下: 未完 稍…

探索C语言中的联合体和枚举:让处理数据更加得心应手

✨✨小新课堂开课了,欢迎欢迎~✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:http://t.csdnimg.cn/Oytke 小新的主页:编程版小新-CSDN博客 C语言中有内置类型, 比如&…

vue3封装Element表格

配置表头配置多选配置序号自定义操作列按钮 封装表格 Table.vue <template><el-table:data"tableData"width"100%":maxHeight"maxHeight"v-bind"$attrs"selection-change"handleSelectChange"row-click"hand…

【Python】Scrapy 爬虫(简单了解)

Scrapy项目开发流程 1.创建项目 打开cmd scrapy startproject example 就可以创建一个Scrapy项目。这时&#xff0c;我们找到并打开这个文件。 复制路径&#xff1a;C:\Users\25194\example 复制到pycharm里面&#xff0c;打开该项目。 文件介绍 scrapy.cfg setting表明项…

竞赛课第四周(八数码问题+八皇后问题)

目的&#xff1a; 1. 掌握递归和排序 2. 掌握BFS与队列 3. 掌握DFS和递归 4. 熟悉并理解回溯问题 实验内容&#xff1a; 1.八数码问题&#xff1a; 在一个33的棋盘上&#xff0c;放置编号为1~8的8个方块&#xff0c;每个占一格&#xff0c;另外还有一个空格。与空格相邻…