资源描述
《Java语言程序设计》实验指导
《Java语言程序设计》实验指导书
前言
一、 实验目的
实验的目的是提高学生分析问题、解决问题的能力和动手能力,通过实践环节理解Java语言的基本结构和程序设计方法。通过亲手编程掌握Java语言编程的方法。
二、 实验内容
为了使学生在上机实验时目标明确,本实验指导针对课程内容编写了10个实验。学生可以在课内机时先完成指导书中给出的验证程序部分,理解所学的知识,在此基础上再完成其他内容。指导书中的10个实验如下。
1.熟悉Eclipse开发环境
2.基本程序设计
3.数组
4. 类的设计
5. 继承
6.多态
7.抽象类
8.接口
9.异常
10.图形用户界面程序设计
三、实验任务
《Java语言程序设计》是一门实践性很强的课程,除了在课内安排的实验外,鼓励学生在课外用相关技术进行编程练习。全部实验中工作区Workspace的名字命名方式为学号和姓名的组合,例如:1409111101魏芳,实验中的每一个程序都要单独创建一个项目,例如实验1的第一个实验,项目名称为Lx1_1。实验2的第一个实验,项目名称为Lx2_1,其余实验依此类推。定义类时要用到的包名按照实验要求设置。
实验 1 熟悉Eclipse开发环境
1.1 综合实验
一、 实验题目
分别通过控制台和对话框显示“井冈山大学”文本信息。
二、实验目的
1. 掌握IDE开发工具Eclipse的使用方法。
2. 掌握编写及运行 Java程序的方法。
4. 了解 Java语言的概貌。
5. 为学习 Java语言和进行 Java程序的实验做好准备工作。
三、实验内容
熟读并识记实验上机步骤的各项内容,按照上机步骤运行开发程序并输入本实验的源程序,保存源程序后执行创建和试运行步骤。
四、 实验步骤
1.在U盘上新建以学号和自己姓名组合为名称的工作区文件夹。
2.运行Eclipse,按提示选择或输入工作区文件夹。
3.创建Java项目(Java project)。创建名为Lx1_1的Java项目。其方法是从主菜单中依次选择File->New->Java Project,在弹出的窗口中填入项目的名称,其余选项采用默认值,单击Finish即可。
4.创建类。首先选中项目(点击Lx1_1)或选中Lx1_1下的src目录(点击Lx1_1左边的小三角形,再点击src),然后从主菜单中依次选择File->New->Class,在弹出的窗口中填入包(Package位置)的名称p1和类(Name位置)的名称Lx1_1,其余选项采用默认值(如果要同时生成main方法,可以勾选“public static void main(String[] args)”选项),单击Finish即可。
5.编写Java代码。在编辑窗口的Lx1_1类中已有自动生成的初始代码,根据需要修改编辑Java代码,出现语法错误时有红色波浪线提示,应该及时更正。
6.运行应用程序。
单击菜单上的Run->Run As->Java Application,即可运行这个Java应用程序,运行结果显示在IDE下部信息区的Console窗口中。
五、 程序清单
建立工程Lx1_1,并创建类Lx1_1,包为p1,源代码如下。
package p1;
import javax.swing.JOptionPane;
public class Lx1_1{
public static void main(String[] args) {
System.out.println("井冈山大学");
System.out.print("电信学院\n通信工程系");
JOptionPane.showMessageDialog(null, "井冈山大学");
JOptionPane.showMessageDialog(null, "井冈山大学",
"系统提示",JOptionPane.INFORMATION_MESSAGE);
}
}
思考题:
(1)方法System.out.println和方法System.out.print有什么区别?
(2)指令“package p1;”的功能是什么?
(3)指令“import javax.swing.JOptionPane;”的功能是什么?
(4)方法JOptionPane.showMessageDialog在程序中调用了两次,它们的输出有什么区别?
(5)将程序中的JOptionPane.INFORMATION_MESSAGE 换成JOptionPane.ERROR_MESSAGE后输出会发生怎样的变化?
1.2 设计题
1. 建立工程Lx1_2,编写Java程序,要求在控制台显示如下信息:
***********************************
** **
** Java 非常棒 **
** **
***********************************
2. 建立工程Lx1_3,编写Java程序,要求程序运行后在消息框中显示文本,显示效果如下图:
实验 2 基本程序设计
2.1综合实验
一、 实验题目
设计一个贷款计算器
二、实验目的
1. 掌握Java的数据类型。
2. 掌握各种变量的声明方式。
3. 掌握运算符及表达式使用方法。
4. 掌握利用控制台和JOptionPane类进行输入输出的方法。
三、实验内容
编写一个贷款计算程序,通过对话框输入年利率、贷款年份、贷款总额,通过消息框显示每月还款数额和总还款数额。
四、 实验步骤
1.利用类JOptionPane的方法showInputDialog输入年利率的字符串形式
2.将年利率字符串转换为双精度数据保存在double类型的变量中
3.利用类JOptionPane的方法showInputDialog输入年份的字符串形式
4.将年份字符串转换为整型数据保存在int类型的变量中
5.利用类JOptionPane的方法showInputDialog输入贷款总额的字符串形式
6.将贷款总额字符串转换为双精度数据保存在double类型的变量中
7.计算月还款额和总还款额
8.利用类JOptionPane的方法showMessageDialog输出月还款额和总还款额
五、程序清单
建立工程Lx2_1,并创建类Lx2_1,包为p1,源代码如下。
package p1;
import javax.swing.JOptionPane;
public class Lx2_1 {
public static void main(String[] args) {
// Enter yearly interest rate
String annualInterestRateString = JOptionPane.showInputDialog(
"输入年利率,例如 8.25:");
// Convert string to double
double annualInterestRate =
Double.parseDouble(annualInterestRateString);
// Obtain monthly interest rate
double monthlyInterestRate = annualInterestRate / 1200;
// Enter number of years
String numberOfYearsString = JOptionPane.showInputDialog(
"输入贷款年份, \n例如 5:");
// Convert string to int
int numberOfYears = Integer.parseInt(numberOfYearsString);
// Enter loan amount
String loanString = JOptionPane.showInputDialog(
"输入贷款总额,例如 120000.95:");
// Convert string to double
double loanAmount = Double.parseDouble(loanString);
// Calculate payment
double monthlyPayment = loanAmount * monthlyInterestRate / (1
- 1 / Math.pow(1 + monthlyInterestRate, numberOfYears * 12));
double totalPayment = monthlyPayment * numberOfYears * 12;
// Format to keep two digits after the decimal point
monthlyPayment = (int)(monthlyPayment * 100) / 100.0;
totalPayment = (int)(totalPayment * 100) / 100.0;
// Display results
String output = "每月还款额是 " + monthlyPayment +
"\n还款总额是 " + totalPayment;
JOptionPane.showMessageDialog(null, output);
}
}
思考题:
此程序中Math.pow(x,y)功能是计算x的y次方。其中Math是系统提供的一个数学类,pow是这个类中的一个方法,问开平方和求正弦值的方法是什么?
2.2设计题
1. 建立工程Lx2_2,编写程序,其功能是从控制台输入a、b、c的值并按下面的数学公式计算x的值
程序运行示例(绿色的字符是用户输入):
Please input a,b,c:
1空格2空格1回车
x=-1.0
2.(求一个整数的各位数字之和)建立工程Lx2_3,按运行示例要求编写程序,读取一个在0和1000(不含1000)之间的整数,点击“确定”按钮后在消息框中输出该整数的各位数字之和。
下面是一个运行示例:
实验 3 数组
3.1 综合实验
一、 实验题目
数组的操作
二、实验目的
1. 掌握一维数组和二维数组的定义方法。
2. 掌握一维数组的程序设计方法。
3. 了解二维数组的程序设计方法。
4. 了解数组作为方法的参数的用法。
三、实验内容
编写一个操作数组的程序,设计一个方法,通过传递数组在方法中修改数组元素的值
四、实验步骤
1. 定义一个类方法addFive参数为两个数组用于对两个数组进行操作
2. 定义数组a并初始化
3. 按照数组a的长度定义数组b
4. 调用addFive方法实参传入数组a和b
5. 分别使用for-each循环和for循环显示数组a和b的内容
五、程序清单
建立工程Lx3_1,并创建类Lx3_1,源代码如下
public class Lx3_1 {
public static void main(String[] args) {
int[] a = new int[] { 2, 4, 6, 8, 10 };
int[] b = new int[a.length];
addFive(a,b); //调用无返回值函数addFive,注意实参是数组名
for(int m:a)//遍历数组元素的新用法,m代表数组元素的值,但不能改写元素的值
System.out.print(m+" ");
System.out.println();
for(int i=0;i<b.length ;i++)
System.out.print(b[i]+" ");
}
public static void addFive(int[] aar,int[] bar){
for(int i=0; i<bar.length; i++)
bar[i] = aar[i]+5;
}
}
思考题:
(1) 方法addFive的功能是什么?
(2) a.length的值是多少?
3.2 设计题
1.建立工程Lx3_2,编写一个程序,读入学生成绩,获取最高分best,然后根据下面的规则赋等级值:
如果分数>=best-10,等级为A,分数>=best-20,等级为B,分数>=best-30,等级为C,分数>=best-40,等级为D,其他情况等级为F。
下面是一个运行示例:
请输入学生总数:4回车
请输入学生成绩:40空格55空格70空格58回车
第1个学生的成绩是40,等级是C
第2个学生的成绩是55,等级是B
第3个学生的成绩是70,等级是A
第4个学生的成绩是58,等级是B
2. 建立工程Lx3_3,编写一个方法,使用下面的方法首部求出一个数组中的最小元素:
public static double min(double[] array)
编写测试程序,提示用户输入10个数,调用这个方法返回最小值并显示。
下面是该程序的运行示例:
请输入10个数:4.2 5.8 3.9 1.2 7.1 5.5 5.6 3.5 12.3 5.34回车
最小值是:1.2
3. 建立工程Lx3_4,编写下面的方法,测试某个数组是否有4个连续的值相同的数字。
public static boolean isConsecutiveFour(int[] values)
编写测试程序,提示用户输入一个整数序列,如果这个数列中有四个连续相同的数,就显示true,否则显示false。程序应首先提示用户输入值的个数。(难度等级 *)
下面是该程序的运行示例:
请输入数据个数: 8回车
输入数据: 5 4 3 3 3 3 2 5回车
true
实验 4 类的设计
4.1 综合实验
一、实验题目
输出面积最大的长方形的信息
二、实验目的
1.掌握类的定义和对象的创建
2.掌握对象的访问方法及可见性的声明
3.掌握类变量、类方法、实例变量、实例方法、常量之间的区别和它们的使用方法
4.掌握this关键字的使用。
三、实验内容
编写程序,定义四个长方形对象并存入长方形集合类中,利用长方形集合类的方法找出最大面积的长方形并输出该长方形对象的信息。
四、实验步骤
1.定义长方形类,包含计算面积和输出信息的方法
2.定义长方形集合类,包含加入长方形对象和获得最大面积长方形的方法
3.定义测试类,创建4个长方形对象并存入长方形集合中
4.利用长方形集合的方法获得最大长方形并输出其信息
五、程序清单
建立工程Lx4_1,并创建类Lx4_1,源代码如下。
public class Lx4_1{
public static void main(String args[]) {
Rectangle r1=new Rectangle(5,6);
Rectangle r2=new Rectangle(4,7);
Rectangle r3=new Rectangle(3,12);
Rectangle r4=new Rectangle(3.5,9);
RectangleArray.add(r1);
RectangleArray.add(r2);
RectangleArray.add(r3);
RectangleArray.add(r4);
System.out.println(RectangleArray.maxRectangle().toString());
}
}
在同一个Java源文件中再定义Rectangle类,源代码如下。
class Rectangle{
private double length;
private double width;
public Rectangle(double length,double width){
this.length=length;
this.width=width;
}
public double getArea(){
return length*width;
}
public String toString(){
return length+"*"+width;
}
}
在同一个Java源文件中再定义RectangleArray类,源代码如下。
class RectangleArray{
static int n=0;
static Rectangle[] recSet=new Rectangle[10];
static void add(Rectangle r){
recSet[n]=r;
n++;
}
static Rectangle maxRectangle(){
Rectangle rmax;
rmax=recSet[0];
for(int i=0;i<n;i++)
if(rmax.getArea()<recSet[i].getArea())
rmax=recSet[i];
return rmax;
}
}
思考题:
(1) 分析指令 “RectangleArray.maxRectangle().toString()” 的执行过程。
4.2 设计题
1. 建立工程Lx4_2,设计并实现一个名为Stock的类,放在包p1中。这个类包括:
(1)一个名为symbol的字符串数据域表示股票代码。
(2)一个名为name的字符串数据域表示股票名字。
(3)一个名为previousClosingPrice的double型数据域,它存储的是前一日的股票值。
(4)一个名为currentPrice的double型数据域,它存储的是当时的股票值。
(5)创建一只有特定代码和名字的股票的构造方法。
(6)一个名为getChangePercent()的方法返回从previousClosingPrice变化到currentPrice的百分比。
在同样的工程中编写一个测试类,名为Lx4_2,同样放在包p1中。在main方法中创建一个Stock对象,它的股票代码是Java,股票名字是 Sun Microsystems Inc,前一日收盘价是4.5。设置新的当前值为4.35,然后显示市值变化的百分比。
2.建立工程Lx4_3,设计并实现一个名为Point的类表示平面上的点,将这个类放在包p1中,这个类包括:
(1)名为x和y的数据域,它们分别表示点的x坐标和y坐标。名为color的String型数据域表示颜色(默认为黑色)。
(2)名为num的静态数据域用于存储利用该类创建对象的个数(初值为0)。
(3)创建x、y为指定值的坐标的构造方法。
(4)创建以x、y、color为指定值的坐标的构造方法,并在其中调用上一个构造方法设置x和y的值。
(5)一个名为toString()的公有方法返回这个点的文本信息。示例格式如下:
黑色(2.0,3.0)
在同样的工程中编写一个测试类,名为Lx4_3,放在包p2中。在main方法中创建三个Point对象以测试类设计的正确性。
3. 建立工程Lx4_4,设计并实现一个名为Circle的类表示平面上的圆,将这个类放在包p1中,这个类包括:
(1)名为x和y的double型私有数据域,它们分别表示圆心的x坐标和y坐标。名为r的double型私有数据域表示圆的半径。
(2)创建默认的公有无参构造方法。
(3)创建以x、y、r为指定值的圆的公有构造方法。
(4)一个名为getArea()的公有方法返回这个圆的面积。
(5)一个名为getPerimeter()的公有方法返回周长。
(6)一个名为equals()的公有方法判断两个圆是否重合(圆心相同,半径相同)。
(7)一个名为toString()的公有方法返回这个圆的文本信息。示例格式如下:
圆心:(2.0,3.0)半径:5.0
在同样的工程中编写一个测试类,名为Lx4_4,放在包p2中。在main方法中创建三个Circle对象用于测试(4)、(5)、(6)、(7)四个方法。
实验 5 继承
5.1 综合实验
一、实验题目
直线和点的信息输出
二、实验目的
1.掌握继承的程序设计方法,掌握在继承设计时构造方法中this和super关键字的使用。
2.掌握继承设计时可见性修饰符(public、protected、private)的使用。
3.掌握继承设计时覆盖和隐藏的概念。
三、实验内容
编写程序,程序定义两个类,一个是Point,另个一是Line继承自Point,在测试类中输出点对象和直线对象的信息。
四、实验步骤
1.定义Point类,包含 受保护的数据域x,y,私有数据域color
2.定义Line类 继承自Point
3.在测试类中定义一个点对象和直线对象并输出它们的信息
五、程序清单
建立工程Lx5_1,并创建包类Point,包为p1。源代码如下。
package p1;
class Point {
protected int x, y;
private String color;
Point(){
}
Point(int a, int b,String c) {
x=a;
y=b;
color=c;
}
public String getColor(){
return color;
}
public void sayColor(){
System.out.println("颜色是:"+color);
}
public String toString(){
return "点坐标:["+x+","+y+"]"+","+color;
}
}
在同一个源文件中实现Point的子类Line,源代码如下:
class Line extends Point {
protected int x, y;
Line(int a,int b){
x=a;
y=b;
}
Line(int x1, int y1,int x2,int y2,String c) {
super(x2, y2,c);
x=x1;
y=y1;
}
public double length() {
int x1 = super.x, y1 = super.y, x2 = this.x, y2 = this.y;
return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
}
public String toString() {
return "直线端点:[" + super.x + "," + super.y + "] [" + x + "," + y
+ "] 直线长度:" + this.length()+","+getColor();
}
}
创建公有类Lx5_1,包为p1,源代码如下:
package p1;
public class Lx5_1 {
public static void main(String args[]) {
Point point=new Point(2,2,"黑色");
System.out.println("\n" + point.toString());
point.sayColor();
Line line = new Line(0, 0,10,10,"红色");
System.out.println("\n" + line.toString());
line.sayColor();
}
}
思考题:
Point类的无参构造方法能删除吗?为什么?
5.2 设计题
1. 建立工程Lx5_1,设计并实现一个名为Shape的公有类,放在包p1中。该类包括:
(1) 一个名为color的私有String数据域表示图形的颜色,它的默认值是白色。
(2) 一个无参构造方法,方法体为空。
(3) 一个能创建带指定 color的图形的构造方法。
(4) 一个名为getColor()的公有方法返回这个图形颜色的字符串。
设计一个名为Rectangle的公有类来扩展Shape类,放在包p1中。该类包括:
(1) 两个名为width和height的double数据域表示这个长方形的宽和高,它们的默认值是1.0。
(2) 一个能创建带指定 width、height和color的长方形的构造方法。在这个构造方法中调用父类的构造方法设置颜色color的值。
(3) 一个名为getArea()的方法返回这个长方形的面积。
(4) 一个名为getPerimeter()的方法返回这个长方形的周长。
(5) 一个名为toString()的方法返回这个长方形的字符串描述基本信息。
toString返回的字符串示例:长方形:width=1.0,height=1.0,白色
编写一个测试类,名为Lx5_1,放在包p2中。在main方法中创建宽为1、长为2,颜色为 黄色,的Rectangle对象,然后显示它的面积、周长以及基本信息。
2. 建立工程Lx5_2,设计并实现一个名为Shape的公有类,放在包p1中。该类包括:
(5) 一个名为color的String私有数据域表示图形的颜色,它的默认值是白色。
(6) 一个名为filled的boolean私有数据域表示图形是否填充。
(7) 一个无参构造方法创建filled为true的图形。
(8) 一个能创建带指定 color、filled的图形的构造方法。
(9) 所有三个数据域的访问器get方法和修改器set方法。
(10) 一个名为toString()的方法返回这个图形的字符串描述。
toString返回的字符串示例:颜色:白色 填充情况:未填充
设计一个名为Triangle的公有类来扩展Shape类,放在包p1中。该类包括:
(6) 三个名为side1、side2和side3的double数据域表示这个三角形的三条边,它们的默认值是1.0.
(7) 一个无参构造方法创建默认的三角形。
(8) 一个能创建带指定 side1、side2和side3的三角形的构造方法。
(9) 所有三个数据域的访问器get方法。
(10) 一个名为getArea()的方法返回这个三角形的面积。
(11) 一个名为getPerimeter()的方法返回这个三角形的周长。
(12) 一个名为toString()的方法返回这个三角形的字符串描述。
toString返回的字符串示例:三角形:sid1=1.0,side2=1.0,side3=1.0
编写一个测试类,名为Lx5_2,放在包p2中。在main方法中创建边长为1、1.5和1,颜色为 黄色,filled为true的Trangle对象,然后显示它的面积、周长、颜色以及是否被填充。
实验 6 多态
6.1 综合实验
一、实验题目
输出对象信息
二、实验目的
1.了解多态的概念。
2.了解多态中静态绑定和动态绑定的使用。
三、实验内容
编写程序,定义三个类,它们都具有继承关系且都包含相同的显示信息的方法。设计一个通用的方法能够显示这三个类的对象的信息。
四、实验步骤
1.定义Person类,其中包含方法showMessage用于输出基本信息。
2.定义Person类的子类Student类,其中包含方法showMessage用于输出基本信息。
3.定义Student类的子类Staff类,其中包含方法showMessage用于输出基本信息。
4.在测试类中定义通用方法display用于显示对象基本信息。
5.创建以上三个类的实例,并通过方法display显示这三个实例的基本信息。
五、程序清单
建立工程Lx6_1,并创建包类Person,包为p1。源代码如下。
package p1;
class Person {
protected String name;
Person(){
}
Person(String n) {
name=n;
}
public void showMessage(){
System.out.println( "姓名:"+name);
}
}
在同一个源文件中实现Person的子类Student,源代码如下:
class Student extends Person {
protected String schoolName;
Student(){
}
Student(String n,String s) {
super(n);
schoolName=s;
}
public void showMessage(){
System.out.println( "姓名:"+name+" 学校:"+ schoolName);
}
}
在同一个源文件中实现Student类的子类Staff,源代码如下:
class Staff extends Student {
protected int salary;
Staff(){
}
Staff(String n,String s,int sa) {
super(n,s);
salary=sa;
}
public void showMessage(){
System.out.println( "姓名:"+name+" 学校:"+ schoolName+" 工资:"+ salary);
}
}
在同一个源文件中创建公有类Lx6_1,源代码如下:
public class Lx6_1 {
public static void main(String args[]) {
Person p1=new Person("张三");
Student p2=new Student("李四","井冈山大学");
Staff p3=new Staff("王五","井冈山大学",5000);
display(p1);
display(p2);
display(p3);
}
public static void display(Person p) {
p.showMessage();
}
}
思考题:
写出程序的运行结果。
6.2 设计题
引例:以下程序为线性表类ArrayList的应用示范,读懂该程序并完成后面的程序设计
建立工程Lx6_2,并创建公有类Lx6_2,包为p1。源代码如下。
package p1;
public class Lx6_2 {
public static void main(String[] args) {
// 创建线性表对象cityList,指令中的<String>表示线性表中存储的是String对象
java.util.ArrayList<String> cityList = new java.util.ArrayList<String>();
// 添加字符串对象进入cityList
cityList.add("北京");
cityList.add("上海");
cityList.add("广州");
cityList.add("日喀则");
cityList.add("乌鲁木齐");
// 输出线性表中城市的数量
System.out.println("数量? " + cityList.size());
System.out.println("上海在线性表中吗? " + cityList.contains("上海"));
System.out.println("广州在表中的位置? " + cityList.indexOf("广州"));
System.out.println("这是一个空表吗? " + cityList.isEmpty());
//向表中添加新的城市
cityList.add(2, "西安");
// 从表中删除一个城市
cityList.remove("上海");
// 删除位于位置1的城市
cityList.remove(1);
// 输出表中所有的城市名称
System.out.println(cityList.toString());
// 按位置的逆序输出表中城市名称
for (int i = cityList.size() - 1; i >= 0; i--)
System.out.print(cityList.get(i) + " ");
System.out.println();
// 显示城市名称和字数
for (int i = 0 ; i < cityList.size(); i++){
System.out.println("字数是:"+(String)list.get(i).length() );
}
}
}
1. 建立工程Lx6_3,设计并实现一个名为Person的公有类,放在包cn.edu.jgsu中。该类包括:
(1) 一个名为name的String私有数据域表示姓名。
(2) 一个名为age的int私有数据域表示年龄。
(3) 一个无参构造方法。
(4) 一个能创建带指定 name、age的构造方法。
(5) 所有数据域的修改器set方法。
(6) 一个名为toString()的方法返回这个图形的字符串描述。
toString返回的字符串示例: 姓名:李想 年龄:20岁
编写一个测试类,名为Lx6_3,放在包p1中。
在main方法中创建线性表ArrayList的对象personList,创建四个Person类的对象,属性分别是:刘梅,18;张伟,19;邓秀,19;王刚,21。
将四个Person对象依次加入到线性表personLi
展开阅读全文