实验目的与要求:
实验目的:熟悉面向对象编程中package,import等语句的使用。
实验要求:
(1).编写一个计算机与软件学院类CSSE、一个研究所/中心类Institute和一个教学系类Department。CSSE类中包含有多个Institute类的实例和多个Department类的实例。调用CSSE类的实例中的getInstituteNames()和getDepartmentNames()方法时,能够分别输出所有研究所/中心的名字和所有教学系的名字;调用CSSE类的实例中的getInstituteNumber()和getDepartmentNumber()方法时,能够分别输出研究所/中心的数量和教学系的数量。在报告中附上程序截图、运行结果截图和详细的文字说明。相关信息见https://csse.szu.edu.cn/pages/organization/index(10分)
(2).根据https://csse.szu.edu.cn/pages/organization/index中的介绍,进一步完善CSSE类中关于“行政办公室”、“实验中心”、“期刊编辑部”和“国家工程实验室”的成员变量和成员方法。在报告中附上程序截图、运行结果截图和详细的文字说明。(10分)
(3).把CSSE类、Institute类和Department类放进cn.edu.szu包中。编写一个测试类,在源代码中用import语句引入cn.edu.szu包中的所有类,并对它们所包含的方法进行测试。在报告中附上程序截图、运行结果截图和详细的文字说明。(10分)
(4).通过文字解释或程序来说明以下各种组合是否允许,如果允许表示什么意思,如果不允许是为什么。同时,在下表中,对不允许的组合,填入NO。(30分)
类中的成员变量 | 类中的成员方法 | 类中的构造方法 | |
private | |||
public | |||
final | |||
abstract | |||
static |
(5).面向对象编程有三个特性(封装、继承和多态),请对“封装”、“继承”和“多态”这三个特性,通过类比、关联或演绎的方式,举一个在日常的学习生活中可以应用的例子(要求积极向上且能自圆其说)。(20分)
特别说明:本次作业要求在实验课教室完成,在下课前,将实验报告在Blackboard上提交。(20分)
发现抄袭(包括复制&粘贴整句话、整张图),抄袭者和被抄袭者的成绩记零分。
- .编写一个计算机与软件学院类CSSE、一个研究所/中心类Institute和一个教学系类Department。CSSE类中包含有多个Institute类的实例和多个Department类的实例。调用CSSE类的实例中的getInstituteNames()和getDepartmentNames()方法时,能够分别输出所有研究所/中心的名字和所有教学系的名字;调用CSSE类的实例中的getInstituteNumber()和getDepartmentNumber()方法时,能够分别输出研究所/中心的数量和教学系的数量。在报告中附上程序截图、运行结果截图和详细的文字说明。相关信息见https://csse.szu.edu.cn/pages/organization/index(10分)
程序截图:
运行结果截图:
文字说明:
首先创建九个Institute类的实例,完成初始化,再创建一个包含这九个实例的数组,同理创建包含多个Department类的实例的数组。
然后创建一个CSSE类的实例,提供两个数组作为参数,最后调用CSSE类的实例中的各种方法,来获取或输出所需信息。
(2).根据https://csse.szu.edu.cn/pages/organization/index中的介绍,进一步完善CSSE类中关于“行政办公室”、“实验中心”、“期刊编辑部”和“国家工程实验室”的成员变量和成员方法。在报告中附上程序截图、运行结果截图和详细的文字说明。(10分)
文字说明:
参考例1完善代码,添加类并初始化。
(3).把CSSE类、Institute类和Department类放进cn.edu.szu包中。编写一个测试类,在源代码中用import语句引入cn.edu.szu包中的所有类,并对它们所包含的方法进行测试。在报告中附上程序截图、运行结果截图和详细的文字说明。(10分)
程序截图:
运行结果截图:
文字说明:
在这三个类的源文件的开头加上一行 package 语句:
package cn.edu.szu;
再将把CSSE类、Institute类和Department类放进cn.edu.szu包中。
编写一个测试类的时候,用 import 语句引入 cn.edu.szu 包中的所有类:
import cn.edu.szu.*;
然后,可以在测试类中直接使用 CSSE、Institute 和 Department 类,并对这些类的方法进行测试。(顺便将例2的其他类也都装进包中,进行测试)
(4).通过文字解释或程序来说明以下各种组合是否允许,如果允许表示什么意思,如果不允许是为什么。同时,在下表中,对不允许的组合,填入NO。(30分)
总体情况:
类中的成员变量 | 类中的成员方法 | 类中的构造方法 | |
private | |||
public | |||
final | NO | ||
abstract | NO | ||
static | NO |
具体情况:
private 类中的成员变量:private修饰的成员变量只能被当前类访问,不能被其他类或者子类访问。这样可以保护类的内部实现细节,实现数据的封装和隐藏。
private 类中的成员方法:被private修饰的成员方法只能被当前类访问,其他类不能访问,被private修饰的成员方法不能被重写。
private 类中的构造方法:构造方法可以被private修饰,如果当前类只有一个构造方法且被private修饰,那么其它类是无法创建当前类的对象并且当前类也是不能被继承的。
public类中的成员变量:它表示被修饰的成员变量可以被任何类访问,不管是同一个包还是不同的包。
public类中的成员方法:public表明成员方法是对所有用户开放的,可以直接进行调用
public类中的构造方法:public修饰的构造方法可以被其他类用来创建该类的对象。
final 类中的成员变量:被final修饰的变量,作用范围内常量,只允许一次赋值,且final修饰变量一旦赋值,不能修改
final 类中的成员方法:当应用于方法时,它表示该方法不能被子类重写
final 类中的构造方法:java中final不能修饰类中的构造方法。final修饰符用于防止方法被子类重写,但是构造方法不能被继承,所以没有必要用final修饰。如果尝试用final修饰构造方法,编译器会报错。
abstract类中的成员变量:被abstract修饰的类称为抽象类,语法:abstract class 类名{}
abstract类中的成员方法:被asbtract修饰的方法被称为抽象方法,抽象方法只有声明部分,没有方法的实现部分 ,抽象方法只能定义在抽象类中;但是抽象类中即可以定义抽象方法也可以定义非抽象方法。
abstract类中的构造方法:abstract类中如果自己提供constructor(构造方法),则用protected修饰为好,因为是给子类用的(抽象类需要继承)。
static 类中的成员变量:被static修饰的属性称为静态属性、静态变量、类变量
static 类中的成员方法:被static修饰的方法称为静态方法,静态方法中只能访问本类的静态成员(静态属性和静态方法) 静态方法中不能直接访问本类的非静态成员(实例变量+非静态方法)
static 类中的构造方法:因为static修饰的成员是属于类的,而构造方法是属于对象的,它们是不匹配的。如果尝试用static修饰构造方法,编译器会报错。
(5).面向对象编程有三个特性(封装、继承和多态),请对“封装”、“继承”和“多态”这三个特性,通过类比、关联或演绎的方式,举一个在日常的学习生活中可以应用的例子(要求积极向上且能自圆其说)。(20分)
比如说可以把自己的个人信息(如姓名、年龄、性别、学号等)封装在一个 Student 类中,只提供一些公共的方法(如 getName、getAge、getGender、getId 等)供其他人获取我们的信息,而不需要暴露我们的所有细节。这样可以保护我们的隐私,也方便我们管理和更新我们的信息。
接着,可以把 Student 类作为一个父类,从它继承一些通用的属性和方法(如姓名、年龄、性别、学号、getName、getAge、getGender、getId 等),然后创建一些子类(如 Undergraduate、Graduate、PhD 等),分别添加一些特有的属性和方法(如专业、导师等)。这样可以实现学生类别的分类和区分,也可以复用和扩展 Student 类的代码。
然后,定义一个接口(如 Study),其中有一个抽象方法(如 study),然后让不同的学生子类(如 Undergraduate、Graduate、PhD 等)实现这个接口,并且重写这个方法,根据自己的学习方式来具体实现。这样,当我们调用 Study 接口类型的对象(如 s)的 study 方法时(如 s.study()),就会根据对象 s 的实际类型来执行相应的方法体。例如,如果 s 是 Undergraduate 类型,就会执行 Undergraduate 类中重写的 study 方法;如果 s 是 Graduate 类型,就会执行 Graduate 类中重写的 study 方法。这样就实现了多态。