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

  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
实验目的: 通过本实验,实现对堆排序算法的理解,掌握堆排序算法的原理以及实现方法,并掌握Java语言的编程技巧。 实验内容: 堆排序是一种树形选择排序方法,是对直接选择排序算法的有效改进。堆排序的基本思想是:将待排序的序列构造成一个大根堆或小根堆,堆顶元素为最大值或最小值,然后将堆顶元素与最后一个元素交换,然后把剩余的元素重新构造成堆。如此反复执行,直到排序完成。由于堆排序算法的时间复杂度为O(nlogn),因此在大数据量的情况下,堆排序是高效的。 堆排序算法的实现主要有两个步骤:构建初始堆和堆排序。其中,构建初始堆是将待排序的序列构建成一个大根堆或小根堆的过程,堆排序是不断将堆顶元素与最后一个元素交换,并重新调整堆的过程。 以下是Java语言实现堆排序的代码: ```java public class HeapSort { public static void heapSort(int[] arr) { int n = arr.length; // 构建初始堆 for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); // 堆排序 for (int i = n - 1; i >= 0; i--) { // 将堆顶元素与最后一个元素交换 int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; // 调整堆 heapify(arr, i, 0); } } // 调整堆 public static void heapify(int[] arr, int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; // 找到左子节点和右子节点中的最大值 if (left < n && arr[left] > arr[largest]) largest = left; if (right < n && arr[right] > arr[largest]) largest = right; // 如果最大值不是根节点,则交换根节点和最大值,并递归调整子堆 if (largest != i) { int temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; heapify(arr, n, largest); } } public static void main(String[] args) { int[] arr = { 64, 34, 25, 12, 22, 11, 90 }; heapSort(arr); System.out.println("排序后的数组:"); for (int i = 0; i < arr.length; i++) System.out.print(arr[i] + " "); } } ``` 实验结果: 经过测试,以上代码能够正确地对数列进行堆排序,得到正确的排序结果。 实验总结: 通过本次实验,我学习了堆排序算法的原理和实现方法,并通过Java语言编写了相应的代码。堆排序算法具有高效的时间复杂度,在大数据量的情况下具有明显的优势。这次实验让我对Java语言的编程技巧有了更深刻的理解,也对算法的实现有了更深的认识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forgotten Legend

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值