20202303 实验三 《数据结构与面向对象程序设计》实验报告
# 20202303 2021-2022-1 《数据结构与面向对象程序设计》实验三报告
课程:《程序设计与数据结构》
班级: 2023
姓名: 马澜
学号:20202303
实验教师:王志强
实验日期:2021年10月11日
必修/选修: 必修
## 1.实验内容
2. 理解并掌握面向对象三要素:封装、继承、多态
3. 初步掌握UML建模
4. 完成蓝墨云上 (1)-(5)实验。
## 2. 实验过程及结果
1.初步掌握单元测试和TDD
对于在IDEA上进行的单元测试,其实是有点难度的,不过在相关资料面前,按步骤去写完成正常测试,错误测试与边界测试即可,整体还是较为基础的;
在进行TDD测试时,首先我们需要下载插件JUnit,然后先写好测试代码,再完成产品代码,测试用例表达了对产品代码的需求,只要产品代码可以通过测试就可以了
2.理解并掌握面向对象三要素:封装、继承、多态
2.1
封装:封装就是将数据与相关行为包装在一起以实现信息隐藏,既可以隐藏类的实现细节,又可以避免对类中属性的直接操作。封装实际上控制用户对类的修改和访问数据的程度,只能够通过对象提供服务的那些方法与程序其它部分进行交互,接口是封装的准确描述手段。简单直白来说,封装就是打包,将一些相关联的数据(字段),或是一些类似的行为(方法),打包在一起,形成一个对外独立的隐蔽的可复用的Java类。
例子:
public class Husband { /* * 对属性的封装 * 一个人的姓名、性别、年龄、妻子都是这个人的私有属性 */ private String name ; private String sex ; private int age ; private Wife wife; /* * setter()、getter()是该对象对外开发的接口 */ public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void setWife(Wife wife) { this.wife = wife; } }
封装的主要作用:1.良好的封装能够减少耦合。2、类内部的结构可以自由修改。 3、可以对成员进行更精确的控制。4、隐藏信息,实现细节。
2.2
继承:继承是从已有类派生一个新类的过程,通过对某一个类的继承产生一个新的子类,子类既有从某个类中继承下来的功能,又可以自行定义自己的变量和方法,产生新的功能。继承是实现软件可重用的根基,是提高软件系统的可扩展性与可维护性的主要途径,继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。也就是说,希望可以“复用代码”。
例子:
正如上面所说的例子,无论是丈夫还是妻子,都有共同的特点,我们可以建立人的一类,从人那里继承来的这些属性和行为。
继承的特点:1、子类拥有父类非private的属性和方法。 2、子类可以拥有自己属性和方法,即子类可以对父类进行扩展。3、子类可以用自己的方式实现父类的方法。
2.3
多态:多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
例子:
public class Wine {
public void fun1(){
System.out.println("Wine 的Fun.....");
fun2();
}
public void fun2(){
System.out.println("Wine 的Fun2...");
}
}
public class JNC extends Wine{
/**
* @desc 子类重载父类方法
* 父类中不存在该方法,向上转型后,父类是不能引用该方法的
* @param a
* @return void
*/
public void fun1(String a){
System.out.println("JNC 的 Fun1...");
fun2();
}
/**
* 子类重写父类方法
* 指向子类的父类引用调用fun2时,必定是调用该方法
*/
public void fun2(){
System.out.println("JNC 的Fun2...");
}
}
public class Test {
public static void main(String[] args) {
Wine a = new JNC();
a.fun1();
}
}
-------------------------------------------------
多态实现条件:继承、重写、向上转型。
3. 初步掌握UML建模
在UML类图中,每个类可能包含三部分内容:类名、属性、操作(方法)。UML类图有属于自己的语法,变量的类型名在变量名的后面,它们之间用冒号作为分隔符,方法的+和-表明可见性。箭头指向,表明一个类知道并以某种方法使用另一个类(调用)。其中对于UML的建模需要自己去思考以及学习。
详见云班课测试(5)
4.完成蓝墨云上 (1)-(5)实验。
测试结果(1)-(4)如下
(1)
(2)
(3)
(4)
## 3. 实验过程中遇到的问题和解决过程
- 问题1:在刚开始的时候,第一次编写Test然后由于头文件是自己生成的,然后和博客园不一样,学着自己改,然后一直有红色的出现
- 问题1解决方案:发现博客园有例子文件,誊写上去就OK了
- 问题2:在编写程序时,即使有时候标红,也认旧可以pass,有的时候有黄色的标记也还是能pass,我感到很神奇。
- 问题2解决方案:最后发现运行的时候,一直都是那个成功的文件,去头文件里选择才能运行自己想要运行的那一个。如图下所示
- 问题3:在对于Doc编写时,对于各种类型的编写其实很难下手,然后几乎没有想法,然后对于Long型,除完余可能体现不出Long的优势,所以选择直接学号输出
- 问题3解决方案: 找了例子文件(如下),比对着查阅书籍,尤其是Boolean类,几乎是盲区,然后在例子文件的支持下,勉强试出来。
- 问题4:对于UML类图的编写,真的不会,然后现在也仍旧不熟练,所以在此对于Doc的类编写仍旧不得其解
- 问题4解决方案:希望后期会有答案。。
## 其他(感悟、思考等)
这个IDEA在我一段时间的接触中,发现其真的象老师说的那样,大大提升了幸福度,不过由于快捷键带来了便利,也带来很多问题,我自己也是第一次使用,对于有一些方面的错误可能会理解不到位,而且对于有的时候那个程序一直卡着,一直显示有错误一直过不了的时候会很烦躁,而且我的水平真的很一般,对于大多数问题说实在的我仍旧一知半解,但是对于IDEA的程序我第一次感觉到计算机的神奇,开始对这个未知甚至正在了解的程序感觉到了新奇,希望下次可以做的更好吧!
## 参考资料
- [《Java程序设计与数据结构教程(第九版)》]
- https://blog.csdn.net/weixin_33074843/article/details/114245707