目 录
一、实验目的及要求
1.实验目的
1)掌握使用类来封装对象的属性和行为。
2)掌握类的定义和构造方法,使用类创建对象。
3)掌握方法重载与多态。
4)掌握对象的组合以及参数传值。
5)掌握类变量与实例变量以及类方法和实例方法的区别等。
2.实验要求
1)掌握类与对象的各种基本概念。
2)定义类和创建对象。
3)编写程序对基本概念进行验证,确定概念理解的正确性。
4)对实验中出现的各种问题进行分析、总结。
5)上机过程中要遵守实验室的各项规章制度,爱护实验设备,保持环境卫生。
6)本课程的实验过程中,不得进行游戏、上网等操作。
二、实验环境
1.硬件要求:笔记本电脑一台。
2.软件要求:Windows操作系统,使用Java语言,使用Eclipse集成开发环境。
三、实验内容
1.实验方案
打开Java集成开发环境Eclipse进行操作,根据课本和老师在课堂中讲解的内容,先建立一个包并在包中建立多个类实现类的封装、对象与对象的组合、参数传值、方法重载与多态、类方法与实例方法、数组、定义小数位数、三目运算符、循环语句等一系列功能,看是否与预期效果一样。
2.实验步骤
1)打开Eclipse集成开发环境,建立一个包。
2)建立信息、数学、语文、英语、成绩、学生六个类文件。
3)定义类并创建类的对象。
4)在类中定义相关的私有成员、保护成员以及公有成员。
5)在成绩类中定义平均分函数并通过参数个数不同的方式实现函数重载。
6)在各个类中定义相关的函数,并实现数组、三目运算符、循环语句、参数传值等操作。
7)将数学、语文、英语类组合到成绩类内实现相关的功能。
8)将信息、成绩类组合到学生类内实现学生类的相关功能。
9)在主类学生类中调用相关的函数并运行,实现在窗口输入相关的参数,并在窗口完成相关信息的输出。
10)完成相关功能的检测并完成实验报告的书写及提交。
3.设计思路
1)定义六个类文件(信息、语文、数学、英语、成绩、学生)。
2)通过定义类实现类的封装以及类方法与对象方法。
3)在不同类之间实现对象与对象的组合。
4)通过定义函数(函数名相同,参数个数不同)实现多态中的重载。
5)在类中定义相应的函数运用所学的知识并实现相关的功能(参数传值、数组、三目运算符、定义小数位数、循环语句等知识)。
6)运行主类学生类实现在窗口输入并输出。
四、实验结果与分析
1.打开Eclipse集成开发环境,并在其中建立包以及所需要的类文件,如图4-1:
图4-1 建立包及类文件
2.建立好相关的包以及类文件后,便在类中定义相关的函数并实现相关的功能,在不同的类之间建立相关的联系,通过运行主类学生类来实现所有的功能,运行学生类以后在窗口根据相关的提示信息输入相关的参数,为后续类中函数的方法实现提供参数来源,运行主类学生类后窗口输入界面如图4-2:
图4-2 窗口输入界面
3.完成信息输入后最终的结果窗口如图4-2所示:
图4-3 窗口输出界面
1、实验分析
1)环境问题:在Eclipse集成开发环境中编写代码时字体太小不利于观察。
解决方法:点击Window->Preferences->在搜索栏中输入font->General-> Appearance->Colors and Fonts->Basic->Text Font->点击Edit进行字体的设置->点击确认即完成了字体大小的设置。
2)运行问题:编写Java代码进行中文输出时出现了乱码现象。
解决方法:鼠标右击->Run As->Run Configurations->Common->在Other后填写gbk然后点击Run进行运行后中文可以正常输出。
3)编译问题:建立类后无法运行,显示没有主程序。
解决方法:填写主类运行信息语句public static void main(String[] args)或 者继续在包内新建一个主类,通过类组合的形式进行类的运行。
4)代码问题:在编辑框内写Scanner语句进行窗口输入时显示语句错误。
解决方法:在文件头部写入如下语句import java.util.Scanner;之后错误消失。
5)代码问题:在调用一些类的成员变量的时候显示错误。
解决方法:所调用的类成员变量为私有类型,私有类型只能在类内访问,类外无法对其直接进行访问,在类内构造公有函数形成一个对外接口,在其他类内直接通过调用这个函数来访问其类内部的私有成员即可。
2、心得体会
1)在使用单引号和双引号的时候要特别注意,输出单个字符时可以使用单引号,如果同时输出多个字符时只能使用双引号进行输出,不然会报错。
2)在使用一些标点符号的时候要特别注意,代码内的标点符号均为英文,所以在注释和写代码切换的时候要特别的注意。
3)私有成员只能在类内进行访问,类外无法对私有成员直接进行访问。
4)在实现窗口输入参数的时候要特别注意,先在文件头部写入import java.util.Scanner;语句后再进行相关输入语句的书写。
五、附源程序
1.学生信息类源代码
package 实验二类与对象;
public class Information {
//私有变量(姓名、性别、学号、年龄)
private String name,sex;
protected String number;
private int age;
//构造方法
public Information(String Name, String Sex, String Number, int Age) {
this.name = Name;
this.sex = Sex;
this.number = Number;
this.age = Age;
}
//私有数据调用函数
public String getname() {
return name;//姓名
}
public String getsex() {
return sex;//性别
}
public String getnumber() {
return number;//学号
}
public int getage() {
return age;//年龄
}
//打印信息函数
public void print_infromation() {
System.out.println(name + "同学的基本信息如下:");
System.out.println(" " + "学号:" + number);
System.out.println(" " + "性别:" + sex);
System.out.println(" " + "年龄:" + age + "岁");
System.out.println("-------------------------");
}
}
2.学生成绩类源代码
package 实验二类与对象;
import java.util.Scanner;
//分数类
public class Scores {
//设置期中考试数组和期末考试数组
public double[] QZ = new double[3];
public double[] QM = new double[3];
//辅助变量(平均分)
protected double averageQM = 0,average = 0;
//输入函数
public void set_scores() {
//输入对象
Scanner scanner = new Scanner(System.in);
System.out.println("请依次输入期中考试成绩(数学,语文,英语)");
for(int i=0; i<3; i++) {
QZ[i] = scanner.nextDouble();
}
System.out.println("请依次输入期末考试成绩(数学,语文,英语)");
for(int i=0; i<3; i++) {
QM[i] = scanner.nextDouble();
}
}
//创建各个类的对象
Math math = new Math(QZ[0],QM[0]);//Math类的对象math
Chinese chinese = new Chinese(QZ[1],QM[1]);//Chinese类的对象chinese
English english = new English(QZ[2],QM[2]);//English类的对象english
//函数重载
public void Average(double[] QZ) {
double ADD = 0;
System.out.println("期末考试的平均成绩为:");
for(int i=0; i<3; i++) {
ADD = ADD + QZ[i];
}
averageQM = ADD / 3;
System.out.println(String.format("%.2f", averageQM) + "分");
}
public void Average(double[] QZ, double[] QM) {
double ADD = averageQM;
System.out.println("期中、期末考试的平均成绩为:");
for(int i=0; i<3; i++) {
ADD = ADD + QM[i];
}
average = ADD / 4;
System.out.println(String.format("%.2f", average) + "分");
}
//成绩变化函数
public void Change() {
System.out.println("期末考试成绩与期中考试成绩相比:");
math.compare_math(QZ[0],QM[0]);
chinese.compare_chinese(QZ[1],QM[1]);
english.compare_english(QZ[2],QM[2]);
}
//期末考试极差
public void Range() {
double MAX, MIN,range;
//求最大值
double MAX1 = QM[0] > QM[1] ? QM[0] : QM[1];
MAX = MAX1 > QM[2] ? MAX1 : QM[2];
//求最小值
double MIN1 = QM[0] < QM[1] ? QM[0] : QM[1];
MIN = MIN1 < QM[2] ? MIN1 : QM[2];
System.out.println("期末考试的最高分为:" + MAX + "分");
System.out.println("期末考试的最低分为:" + MIN + "分");
range = MAX - MIN;
System.out.println("期末考试的极差为:" + range + "分");
}
//成绩打印函数
public void Display() {
System.out.println("-----------本学期成绩单如下-----------");
System.out.println(" " + "数学 语文 英语");
System.out.print("期中考试");
for(int i=0; i<3; i++) {
System.out.print(" " + QZ[i]);
}
System.out.println(" ");
System.out.print("期末考试");
for(int i=0; i<3; i++) {
System.out.print(" " + QM[i]);
}
}
}
3.数学成绩类源代码
package 实验二类与对象;
//数学成绩类
public class Math {
//私有变量(期中考试成绩,期末考试成绩)
private double mathZ,mathM;
//构造方法
public Math(double Math1, double Math2) {
this.mathZ = Math1;
this.mathM = Math2;
}
//数学成绩比较函数
public void compare_math(double mathZ, double mathM) {
if(mathZ > mathM) {
System.out.println("数学成绩下降了!");
}
else {
System.out.println("数学成绩上升了!");
}
}
//数学成绩显示函数
public double get_mathZ() {
return mathZ;//期中考试的数学成绩
}
public double get_mathM() {
return mathM;//期末考试的数学成绩
}
}
4.语文成绩类源代码
package 实验二类与对象;
//语文成绩类
public class Chinese {
//私有变量(期中考试成绩,期末考试成绩)
private double chineseZ,chineseM;
//构造方法
public Chinese(double Chinese1, double Chinese2) {
this.chineseZ = Chinese1;
this.chineseM = Chinese2;
}
//语文成绩比较函数
public void compare_chinese(double chineseZ, double chineseM) {
if(chineseZ > chineseM) {
System.out.println("语文成绩下降了!");
}
else {
System.out.println("语文成绩上升了!");
}
}
//语文成绩显示函数
public double get_chineseZ() {
return chineseZ;//期中考试的语文成绩
}
public double get_chineseM() {
return chineseM;//期末考试的语文成绩
}
}
5.英语成绩类源代码
package 实验二类与对象;
//英语成绩类
public class English {
//私有变量(期中考试成绩,期末考试成绩)
private double englishZ,englishM;
//构造方法
public English(double English1, double English2) {
this.englishZ = English1;
this.englishM = English2;
}
//英语成绩比较函数
public void compare_english(double englishZ, double englishM) {
if(englishZ > englishM) {
System.out.println("英语成绩下降了!");
}
else {
System.out.println("英语成绩上升了!");
}
}
//英语成绩显示函数
public double get_englishZ() {
return englishZ;//期中考试的英语成绩
}
public double get_englishM() {
return englishM;//期末考试的英语成绩
}
}
6.主类学生类源代码
package 实验二类与对象;
import java.util.Scanner;//导入输入包
public class Student {
public static void main(String[] args) {
//创建对象
Scanner scanner = new Scanner(System.in);
Scores scores = new Scores();
//进行输入操作
System.out.println("欢迎来到学生信息注册窗口!");
System.out.println("请输入你的姓名:");
String Name = scanner.next();
System.out.println("请输入你的性别:");
String Sex = scanner.next();
System.out.println("请输入你的学号:");
String Number = scanner.next();
System.out.println("请输入你的年龄:");
int Age = scanner.nextInt();
//创建基本信息对象
Information information;
information = new Information(Name, Sex, Number, Age);
//调用分数输入函数
scores.set_scores();
System.out.println("信息已注册完成!");
System.out.println("------------------------");
System.out.println("------注册信息如下------");
//调用信息打印函数
information.print_infromation();
//调用分数的平均分重载函数
scores.Average(scores.QZ);
scores.Average(scores.QZ, scores.QM);
//调用分数的成绩变化函数
scores.Change();
//调用分数的期末考试极差函数
scores.Range();
//调用分数的成绩表打印函数
scores.Display();
}
}