实验三 .Java 语言继承和多态应用练习 (课内实验)

一、实验目的

本次实验的主要目的是通过查看程序的运行结果及实际编写程序,练习使用
Java 语言的继承特性。

二、实验要求

1. 认真阅读实验内容,完成实验内容所设的题目
2. 能够应用多种编辑环境编写 JAVA 语言源程序
3. 认真体会多态与继承的作用
4. 将实验结果书写在实验报告中

三、实验内容

1. 运行下列程序,观察程序的运行结果
A.程序一
package org.example;

public class Main
{
    public static void main(String[] arg)
    {
        Son y=new Son();
        System.out.println("a of son is :" +y.a);
        System.out.println("b of son is :" +y.b);
        y.miner();
        y.sminer();
        System.out.println("a of son is :" +y.a);
        System.out.println("b of son is :" +y.b);
    }
}
class Father //父类的定义
{
    int a=200;
    int b=100;
    public void miner()
    {
        a--;
    }
}class Son extends Father //子类的定义
{
    public void sminer()
    {
        b++;
    }
}
B程序二
package org.example;

public class Main
{
    public static void main(String args[])
    {
        son id3 = new son();
        id3.print();
    }
}
class father
{
    int a=3;//父类成员变量
    public void print()
    {
        System.out.println("father");
    }
}
class son extends father {
    float a = 4f;//子类成员变量

    public void print() {
        int a = 5;//局部变量
        super.print();
        System.out.println("son");
        System.out.println(a);
        System.out.println(this.a);
        System.out.println(super.a);
    }
}
C.程序三
package org.example;

public class Main
{
    public static void main(String[] arg)
    {
        father x=new father();
        son y=new son();
        System.out.print("add() of father is :");
        x.print();
        System.out.print("add() of son is :");
        y.print();
        System.out.println("sub() of son is :" +y.sub());
        System.out.println("sub(int i) of son is :" +y.sub(10));
        System.out.println("sub(int i,int j) of son is :" +y.sub(10,5));
        System.out.println("sub(String s) of son is :" +y.sub("6"));
    }
}
class father
{
    private int i,j;
    father()
    {
        this.i=23;
        this.j=35;
    }
    protected int add()
    {
        return i+j;
    }
    public void print()
    {
        System.out.println("i+j="+add());
    }
}
class son extends father
{
    private int x;
    son()
    {
        this.x=25;
    } protected int add()//方法被覆盖
{
    return x+35;
}
    public int sub()//方法的重载
    {
        return x-15;
    }
    public int sub(int i)
    {
        return x-i;
    }
    public int sub(int i,int j)
    {
        return x-i-j;
    }
    public int sub(String s)
    {
        int f=Integer.parseInt(s);
        return x-f;
    }
}
D.程序四
package org.example;

public class Main
{
    public void useSubAsfather(father x)
    {
        System.out.println(x.getx()+"!!!!!!");
    }
    public static void main(String arg[])
    {
        father superA=new father(),superB;
        son subA=new son(),subB;
        (new Main()).useSubAsfather(subA);
        superB=subA;
        System.out.println("superA.getx():"+superB.getx());
        subB=(son)superB;
        System.out.println(subB.getx()+" "+subB.gety());
    }
}
class father
{
    private int x=100;
    public int getx(){
        return x;
    }
}
class son extends father
{
    private int y=200;
    public int gety()
    {
        return y;
    }
}
运行结果如下
2.查看运行结果,完成下列程序
package org.example;

public class S35 {
    private int x;

    S35() {
        this.setValues(12.5f);
    }

    private void setValues(float v) {
    }

    S35(float y) {
        this.setValues(y, 10);
    }

    void setValues(float x, int y) {
        this.x = 20;
        System.out.println("result is " + (this.x + x + y));
    }

    public static void main(String[] args) {
        S35 s1 = new S35();
    }
}
运行结果为:
result is 42.5
3.编写程序实现下列功能
(1) 定义一个矩形类,实现求面积和周长的操作,再定义一个正方形类,要求
其继承于矩形类,并求出正方形的面积,要求显示出计算结果。数据可以用常数。
class Rectangle {
    protected int width;
    protected int height;

    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }

    public int area() {
        return width * height;
    }

    public int perimeter() {
        return 2 * (width + height);
}
}

class Square extends Rectangle {
    public Square(int sideLength) {
        super(sideLength, sideLength);
    }
}

public class Main {
    public static void main(String[] args) {
        // 创建一个矩形
        Rectangle rectangle = new Rectangle(3, 4);
        System.out.println("矩形的面积: " + rectangle.area());
        System.out.println("矩形的周长: " + rectangle.perimeter());

        // 创建一个正方形
        Square square = new Square(5);
        System.out.println("正方形的面积: " + square.area());
    }
}
(2) 设计一个计算完成两数的加、减、乘与除的运算的类。
package org.example;

public class Main {
    public static void main(String[] args) {
        Main calculator = new Main();

        // 两数相加
        double additionResult = calculator.add(10, 5);
        System.out.println("10 + 5 = " + additionResult);

        // 两数相减
        double subtractionResult = calculator.subtract(10, 5);
        System.out.println("10 - 5 = " + subtractionResult);

        // 两数相乘
        double multiplicationResult = calculator.multiply(10, 5);
        System.out.println("10 * 5 = " + multiplicationResult);

        // 两数相除
        double divisionResult = calculator.divide(10, 5);
        System.out.println("10 / 5 = " + divisionResult);
    }

    // 加法
    public double add(double num1, double num2) {
        return num1 + num2;
    }

    // 减法
    public double subtract(double num1, double num2) {
        return num1 - num2;
    }

    // 乘法
    public double multiply(double num1, double num2) {
        return num1 * num2;
    }

    // 除法
    public double divide(double num1, double num2) {
        if (num2 == 0) {
            System.out.println("Error: Division by zero");
            return Double.NaN;
        }
        return num1 / num2;
    }
}
(3) 编程创建一个 Point 类,在其中定义两个变量表示一个点的坐
值,再定义构造函数初始化为坐标原点,然后定义一个方法实现点的移动,再
定义一个方法打印当前点的坐标。并创建一个对象验 证。
package org.example;

public class Main {
    private int x;
    private int y;

    // 构造函数初始化为坐标原点
    public Main() {
        this.x = 0;
        this.y = 0;
    }

    // 移动点的方法
    public void move(int dx, int dy) {
        this.x += dx;
        this.y += dy;
    }

    // 打印当前点的坐标方法
    public void printCoordinates() {
        System.out.println("Current coordinates: (" + this.x + ", " + this.y + ")");
    }

    // 验证
    public static void main(String[] args) {
        Main point = new Main();
        point.printCoordinates();  // 输出 (0, 0)
        point.move(3, 4);
        point.printCoordinates();  // 输出 (3, 4)
    }
}
(4)编写一个类,该类有如下一个方法:
public int f(int a,int b){
//要求该方法返回 a 和 b 的最大公约数
}
再编写一个该类的子类,要求子类重写方法 f(),而且重写的方法将返回两
个整数的最小公倍数。
要求:在重写的方法的方法体中首先调用被隐藏的方法返回 a 和 b 的最大公
约数 m,然后将(a*b)/m 返回,在应用程序的主类中分别使用父类和子类创建对
象,并分别调用方法 f()计算两个正整数的最大公约数和最小公倍数。
package org.example;

public class Calculate {
    // 方法返回 a 和 b 的最大公约数
    public int f(int a, int b) {
        while (b != 0) {
            int temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }
}
package org.example;

// 子类,重写父类方法返回两个整数的最小公倍数
public class CalculateLCM extends Calculate {
    // 重写 f 方法,返回两个整数的最小公倍数
    @Override
    public int f(int a, int b) {
        int gcd = super.f(a, b); // 调用父类方法返回 a 和 b 的最大公约数

        return (a * b) / gcd; // 返回两个整数的最小公倍数
    }
}
package org.example;

public class MainApp {
    public static void main(String[] args) {
        // 使用父类创建对象
        Calculate calculate = new Calculate();
        int gcd = calculate.f(12, 18);
        System.out.println("最大公约数:" + gcd);

        // 使用子类创建对象
        CalculateLCM calculateLCM = new CalculateLCM();
        int lcm = calculateLCM.f(12, 18);
        System.out.println("最小公倍数:" + lcm);
    }
}
(5)编写一个 Java 应用程序 Test 类,实现成员方法 max(a,b)的重载。具体
要求如下:
a. 编写 void max(int a,int b)成员方法,对两个整数进行大小的比较,输出打
印较大的那个整数。
b.编写 void max(float a,float b)成员方法,对两个 float 数进行大小的比较,
输出打印较大的那个 float 数。
c. 编写 void max(double a,double b)成员方法,对两个 double 数进行大小的
比较,输出打印较大的那个 double 数。
package org.example;

public class Main {
    // 对两个整数进行大小的比较
    void max(int a, int b) {
        if (a > b) {
            System.out.println("较大的整数是:" + a);
        } else {
            System.out.println("较大的整数是:" + b);
        }
    }

    // 对两个float数进行大小的比较
    void max(float a, float b) {
        if (a > b) {
            System.out.println("较大的float数是:" + a);
        } else {
            System.out.println("较大的float数是:" + b);
        }
    }

    // 对两个double数进行大小的比较
    void max(double a, double b) {
        if (a > b) {
            System.out.println("较大的double数是:" + a);
        } else {
            System.out.println("较大的double数是:" + b);
        }
    }

    public static void main(String[] args) {
        Main test = new Main();
        test.max(5, 10);
        test.max(3.14f, 2.71f);
        test.max(3.1415926, 2.7182818);
    }
}

下面是实验总结

  1. 继承是面向对象编程中的重要特性,可以帮助我们实现代码的重用和扩展。

  2. 子类可以继承父类的属性和方法,同时可以重写父类的方法或者新增自己的方法。

  3. 在使用继承时,需要注意父类和子类之间的关系,确保子类是父类的特殊化。

  4. 继承可以帮助我们构建更加清晰和易于维护的代码结构。

  5. 在实际编写程序时,可以根据具体的需求来设计合适的继承关系,以实现代码的复用和扩展。

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

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

相关文章

B+树详解与实现

B树详解与实现 一、引言二、B树的定义三、B树的插入四、B树的删除五、B树的查找效率六、B树与B树的区别和联系 一、引言 B树是一种树数据结构,通常用于数据库和操作系统的文件系统中。它的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间…

WebGL/Cesium 大空间相机抖动 RTE(Relative to Eye)实现原理简析

在浏览器中渲染大尺寸 3D 模型:Speckle 处理空间抖动的方法 WebGL/Cesium 大空间相机抖动 RTE(Relative to Eye)实现原理简析 注: 相机空间和视图空间 概念等效混用 1、实现的关键代码 const material new THREE.RawShaderMaterial({uniforms: {cameraPostion: {…

【Qt QML】用CMake管理Qt工程

CMake是一个开源、跨平台的工具系列,用于构建、测试和打包软件。CMake使用简单的独立配置文件来控制软件编译过程。与许多跨平台系统不同,CMake被设计为与本地构建环境结合使用。 下面我们在CMake项目中使用Qt的最基本方法。首先,创建一个基本…

如何解决pycharm创建项目报错 Error occurred when installing package ‘requests‘. Details.

🐯 如何解决PyCharm创建项目时的包安装错误:‘requests’ 🛠️ 文章目录 🐯 如何解决PyCharm创建项目时的包安装错误:requests 🛠️摘要引言正文📘 **问题分析**🚀 **更换Python版本…

OpenCV 实现重新映射(53)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV 实现霍夫圆变换(52) 下一篇 :OpenCV实现仿射变换(54) 目标 在本教程中,您将学习如何: 一个。使用 OpenCV 函数 cv::remap 实现简…

Java Web 开发 - 掌握拦截器和监听器

目录 深入了解Java Web的拦截器和监听器 拦截器(Interceptor) 拦截器的使用场景 拦截器实例 思维导图 ​编辑 监听器(Listener) 监听器的使用场景 监听器类型 监听器实例 思维导图​编辑 总结 深入了解Java Web的拦截器…

C——双向链表

一.链表的概念及结构 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。什么意思呢?意思就是链表在物理结构上不一定是连续的,但在逻辑结构上一定是连续的。链表是由一个一个的节点连…

uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之使用jar包插件

前言 如果你不会编写安卓插件,你可以先看看我之前零基础的文章(uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之零基础编写安卓插件), 我们使用第三方包,jar包编写安卓插件 开始 把依赖包,放到某个模块的/libs目录(myTestPlug/libs) 还要到build…

java-函数式编程-函数对象

定义 什么是合格的函数?无论多少次执行函数,只要输入一样,输出就不会改变 对象方法的简写 其实在类中,我们很多参数中都有一个this,被隐藏传入了 函数也可以作为对象传递,lambda就是很好的例子 函数式接口中…

ROS实操:通信机制的实现

最近闲来无事,打算重温了一下ROS方面的相关知识。先前的学习都是一带而过,发现差不多都忘了,学习的不够深入。因此,在重温的同时,写下了这篇关于ROS架构的学习博客。 上一篇博客的链接为:ROS架构的学习【No…

如何利用有限的数据发表更多的SCI论文?——利用ArcGIS探究环境和生态因子对水体、土壤和大气污染物的影响

原文链接:如何利用有限的数据发表更多的SCI论文?——利用ArcGIS探究环境和生态因子对水体、土壤和大气污染物的影响https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247602528&idx6&snc89e862270fe54239aa4f796af07fb71&chksmfa82…

visio画图基本用法

添加图形 点击上面的箭头 添加一些基本的形状 添加连接点 点击这个 X 按住Ctrl,在想要的位置上添加连接点 更改线条样式 选中线条之后,右键 可以选择箭头样式 添加文本框 visio对象复制到word里面,画布存在大量空白问题 https://blog.…

【C语言】深入了解文件:简明指南

🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、文件的概念1.1 文件名:1.2 程序文件和数据文件 二、数据文…

如何利用MCU自动测量单元提高大坝安全监测效率

大坝作为重要的水利基础设施,其安全性直接关系到人民群众的生命财产安全和社会的稳定发展。因此,对大坝进行实时、准确的安全监测至关重要。近年来,随着微控制器单元(MCU)技术的不断发展,其在大坝安全监测领域的应用也越来越广泛。…

数据结构——排序算法分析与总结

一、插入排序 1、直接插入排序 核心思想:把后一个数插入到前面的有序区间,使得整体有序 思路:先取出数组中第一个值,然后再用tmp逐渐取出数组后面的值,与前面的值进行比较,假如我们进行的是升序排序&…

操作系统的运行机制详解

操作系统的 运行机制 #mermaid-svg-jVBbLUJa6gITOo7L {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jVBbLUJa6gITOo7L .error-icon{fill:#552222;}#mermaid-svg-jVBbLUJa6gITOo7L .error-text{fill:#552222;stroke…

C 深入指针(1)

目录 一、const 1、const修饰变量 2、const修饰指针 2.1 const int* p(int const* p) 2.2 int* const p 2.3 结论 二、指针运算 1、指针 - 整数 2、指针 - 指针 3、指针的关系运算 三、指针的使用 1、模拟实现 strlen 2、传值调用和传址调用…

安装VMware Tools报错处理(SP1)

一、添加共享文件 因为没有VMware Tools,所以补丁只能通过共享文件夹进行传输了。直接在虚拟机的浏览器下载的话,自带的IE浏览器太老了,网站打不开,共享文件夹会方便一点,大家也可以用自己的方法,能顺利上…

Kafka介绍、安装以及操作

Kafka消息中间件 1.Kafka介绍 1.1 What is Kafka? 官网: https://kafka.apache.org/超过 80% 的财富 100 强公司信任并使用 Kafka ;Apache Kafka 是一个开源分布式事件流平台,被数千家公司用于高性能数据管道、流分析、数据集成…

kubernetes中使用ELK进行日志收集

目录 一、需要收集哪些日志 1、kubernetes集群的系统组件日志 2、应用日志 二、日志收集方案ELK 1、收集日志:Logstash 2、存储日志:Elasticsearch 3、展示日志:Kibana 三、安装elk 1、下载安装包 2、创建用户并切换到新用户 3、上…
最新文章