java实验
Java程序设计实验报告
学号:109074186
姓名:黄 燕
班级:软 102
指导老师:李伟
安徽工业大学计算机学院
2012年12月9日
实验一、面向对象编程实验 .................................................................. 3
?接口的编写 ................................................................................... 3
?多态在工资系统中的应用 ............................................................ 4
? 包的建立与使用 .......................................................................... 7 实验二、异常处理实验 .......................................................................... 9
?异常的捕获 ................................................................................... 9
?定义异常 ....................................................................................... 9 实验三、多线程实验......................................... 错误~未定义书签。11
?使用Runnable接口的
实现多线程 .. 错误~未定义书签。11
? 实现简单动画............................................................................ 13 实验四、输入输出流实验 ................................. 错误~未定义书签。14
?编写程序读取文本文件内容 ................... 错误~未定义书签。14
? 读取图像文件......................................... 错误~未定义书签。15
?将内容写入文件....................................... 错误~未定义书签。16
课程设计——学生信息查询系统 ..................... 错误~未定义书签。17
实验一、面向对象编程实验
一、实验目的
?掌握接口的编写及使用
?理解继承、多态
?掌握包的编写以及如何使用包中的类
二、预习内容
java的基本语法知识 三、实验设备与环境
装有JAVA语言工具软件 (JCreator )的微机若干
四、实验内容
package com.haungyan;
interface Interfaceclass
{
int i=4;
int k=5;
void func1();
int func2(int x);
}
class UseInterface implements Interfaceclass{
int j;
public void func1()
{
System.out.println("func1="+i);
}
public int func2(int i){
System.out.println("func2="+i);
return i;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
UseInterface x=new UseInterface();
x.func1();
x.func2(k);
}
}
?多态在工资系统中的应用
设计一个根据雇员类型利用abstract方法和多态性完成工资单计算的程序。 Employee是抽象类,Employee的子类有Boss(每星期发给他固定工资,而不计工作时间)、 CommissionWorker(除基本工资外还根据销售额发放浮动工资)、PieceWorker(按其生产的产品数发放工资)、HourlyWorker(根据工作时间长短发放工资)。该例的Employee的每个子类都声明为final,因为不需要再继承它们生成子类。
对所有雇员类型都使用earnings()方法,但每个人挣的工资按他所属的雇员类计算,所有雇员类都是从超类Earnings()派出生的。所有在超类中声明earnings()为抽象方法,并且对于每个子类都提供恰当的earnings()的实现方法。为了计算雇员的工资,程序仅仅使用雇员对象的一个超类引导 并调用earnings()方法。在一个实际的工资系统中,各种Employee对象的引用可以通过一个Employee引用数组来实现。程序依次使用数组的每个元素(Employee引用)调用每个对象的employee()方法。
package huangyan;
abstract class Employee
{
abstract void earnings();
abstract int employee();
}
final class Boss extends Employee
{
@Override
void earnings() {
// TODO Auto-generated method stub
int base_pay;
int salary=0;
base_pay=employee()*4;
salary+=base_pay;
System.out.println("我的工资是:"+salary);
}
@Override
int employee() {
// TODO Auto-generated method stub
System.out.println("我的职位是:Boss");
return 4000;
}
}
final class CommissionWorker extends Employee
{
public int sell()
{
int mysell=300;
return (mysell*20-100);
}
@Override
void earnings() {
// TODO Auto-generated method stub
int base_pay;
int change_pay=0;
int salary=0;
base_pay=employee();
change_pay=sell();
salary+=base_pay+change_pay;
System.out.println("我的工资是:"+salary);
}
@Override
int employee() {
// TODO Auto-generated method stub
int x=5000;
System.out.println("我的职位是:CommissionWorker");
return x;
}
}
final class PieceWorker extends Employee
{
@Override
void earnings() {
// TODO Auto-generated method stub
int count = 3000;
int base_pay;
int salary=0;
base_pay=employee();
salary+=base_pay+count*3;
System.out.println("我的工资是:"+salary);
}
@Override
int employee() {
// TODO Auto-generated method stub
int y=0;
System.out.println("我的职位是:PieceWorker");
return y;
}
}
final class HourlyWorker extends Employee
{
@Override
void earnings() {
// TODO Auto-generated method stub
int work_time=100;
int base_pay;
int salary=0;
base_pay=employee();
salary+=base_pay+work_time*21;
System.out.println("我的工资是:"+salary);
}
@Override
int employee() {
// TODO Auto-generated method stub
int x=0;
System.out.println("我的职位是:HourlyWorker");
return x;
}
}
public class Myemployee {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Boss bs=new Boss();
bs.earnings();
CommissionWorker com=new CommissionWorker();
com.earnings();
PieceWorker pie=new PieceWorker();
pie.earnings();
HourlyWorker hou=new HourlyWorker();
hou.earnings();
}
}
? 包的建立与使用
package calculate;
interface Interfaceclass
{
int i=4;
int k=5;
void func1();
int func2(int x);
}
public class calculate{
private int a;
public calculate(int a)
{this.a=a;
System.out.println("from constrartion"+this.a);
}
public double volume(double height,double width,double depth)
{
return height*width*depth;
}
int add(int x, int y)
{
return x+y;
}
protected void a()
{
System .out.println("from constration"+a);
}
}
package calculate;
public class PackageDemo {
public static void main(String ags[ ])
{
calculate c=new calculate(10);
double s=c.volume(5,6,7);
System.out.println(s);
}
}
实验二、异常处理实验
一、实验目的
?异常的生产及捕获
?自定义异常及其使用
二、预习内容
面向对象的基本知识
三、实验设备与环境
装有JAVA语言工具软件 (JCreator )的微机若干
四、实验内容
?异常的捕获
计算两数相除并输出结果。使用两个catch子句,分别捕捉除数为0的异常和参数输入有误异常。
编译并运行,当输入除数为0时,将有异常出现,当输入的不是整数时,如将30输成了3o,出现的是另一种异常。
?定义异常
编写程序包含自定义异常,当输入数值为13和4时抛出该异常。 编译并运行,分别取消注释上面程序中被注释的语句。当释放a.setX(13)语句后,查看运行结果,当释放a.setX(4)语句后,查看运行结果。
package huangyan;
public class ex2 extends Exception {
ex2(String msg){
super(msg);
}
}
public class myex {
private int x;
void setX(int x){
this.x=x;
}
void f1()throws ex2{
if(x==13)
throw new ex2("I don't like 13!");
else if(x==4)
throw new ex2("I don't like 4!");
else
System.out.println(100/x);
}
}
public class example4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
myex a=new myex();
try{
a.setX(5);
//a.setX(13);
//a.setX(4);
//a.setX(0);
a.f1();
}
catch(ex2 e){
System.out.println("getmessage:"+e.getMessage());
}
}
实验三、多线程实验
一、实验目的
?掌握多线程的实现方法
?学会利用多线程来显示动画
二、预习内容
线程与进程的基础知识
三、实验设备与环境
装有JAVA语言工具软件 (JCreator )的微机若干
四、实验内容
?使用Runnable接口的方法实现多线程
编辑TestRunnable.java,保存在D:\myjava目录下。
import java.applet.*;
import java.awt.*;
public class TestRunnable extends Applet implements Runnable
{
Label prompt1=new Label("the first thread");
Label prompt2=new Label("the second thread");
TextField threadFirst=new TextField(14);
TextField threadSecond=new TextField(20);
Thread Thread1, Thread2;
int count1=0,count2=0;
private String currentRunning;
public void init()
{
add(prompt1);
add(threadFirst);
add(prompt2);
add(threadSecond);
}
public void start()
{
Thread1=new Thread(this, "FirstThread");
Thread2=new Thread(this, "SecondThread");
Thread1.start();
Thread2.start();
}
public void run(){
String currentRunning;
while(true){
try{
Thread.sleep((int)(Math.random()*10000));
}
catch(Exception e) {}
currentRunning=Thread.currentThread().getName();
if(currentRunning.equals("FirstTheard"))
{
count1++;
threadFirst.setText("the first thread"+count1+"use");}
else
if(currentRunning.equals("SecondThread")){
count2++;
threadSecond.setText("the second thread"+count2+"use");}
}
}
}
(1) 编译TestRunnable.java。
(2) 编辑TestRunnable.htm,要求与TestRunnable.class在同一目录下。
(3) 运行TestRunnable.htm。
? 实现简单动画
实现一个简单动画,效果为一个球由小到大,从屏幕左侧滚动到右侧。
package mypackage;
import java.applet.*; import java.awt.*;
public class Mov extends Applet {
int x1=50,x2=5,y1=25,y2=5;
public void paint(Graphics g)
{
int w=this.getWidth();
int h=this.getHeight();
if(x1>=w)
{ x1=50;
}
if(x2>h)
{ x2=5;
}
g.setColor(Color.BLUE);
g.fillOval(x1,y1,x2,x2);
g.drawOval(x1,y1,x2,x2);
x1+=50;
x2+=5;
try{
Thread.sleep(500);
}
catch(Exception e) {}
repaint();
}
}
实验四、输入输出流实验
一、实验目的
?了解文件的概念和文件对象的创建方法
?了解FileInputStream和FileOutoutStream的基本概念
?学会创建文件输入输出流
?掌握使用文件输入输出流读写文件的方法
二、预习内容
输入输出类的使用方法
三、实验设备与环境
装有JAVA语言工具软件 (JCreator )的微机若干
四、实验内容
?编写程序读取文本文件内容
? 读取图像文件
编辑ReadPic.java。设保存在D:myjava目录下。设该目录下已经存在一个run.gif文件(可以在此目录下放置一个本机已有的图像文件名字为run.gif。)
package 实验9;
import java.io.*;
public class ReadPic {
//*此程序将当前目录下的run.gif文件复制到copyrun.gif中
ReadPic()
{
try{
File f=new File("run.gif");
File f1=new File("copyrun.gif");
FileInputStream inFile=new FileInputStream(f);
BufferedInputStream inB=new BufferedInputStream(inFile);
FileOutputStream outFile=new FileOutputStream(f1);
BufferedOutputStream putB=new BufferedOutputStream(outFile);
byte[] b=new byte[(int) f.length()];
while(inB. read(b)!=-1)
{
putB. write(b);
}
putB.flush();
inB.close();
putB.close();
}
catch(Exception e) {e.printStackTrace();}
}
public static void main(String args[ ])
{
new ReadPic();
}
}
(1) 编译并运行ReadPic..class。
(2) 打开copyrun.gif与run.gif进行对比。
?将内容写入文件
编辑UseStream1.java,设保存在D:\myjava目录下。
package 实验9;
import java.io.*;
class useStream1
{
useStream1(String path) {
try{
File f=new File(path, "test1.txt");
//向文件test1.txt中写入数据
FileWriter putFile=new FileWriter(f);
BufferedWriter OutB=new BufferedWriter(putFile);
String s="你们好,这是一个测试写入数据的文件。";
OutB.write(s);
//插入一行
OutB.newLine();
OutB.write("这是利用FileWrite与 BuffereWrite的例
。");
//需要调用flush()方法
OutB.flush();
//写入完毕要关闭流
OutB.close();
//从text.txt中读取数据
FileReader inFile=new FileReader(f);
BufferedReader inB=new BufferedReader(inFile);
/*inB中含有能够直接读取一行数据的方法raesLine()供我们使用,当然返回值null时,意味着读取结束*/
String fileContent="",str="";
while((fileContent=inB.readLine())!=null)
{
str=str+fileContent+"\n";
}
System.out.println(str);
inB.close();
}
catch(Exception e){e.printStackTrace();}
}
public static void main(String args[ ])
{
作业"); new useStream1("G:\\
}
}
编译并运行UseStream1.class。
课程设计——学生信息查询系统
(1) 建立数据库,使用Access,建立数据表”学生表”。
(2) 建立数据源指向该数据库,数据源名为db1。
(3) 编辑Main .java,程序主窗体。使用Jframe窗体.
package student.message;
import java.awt.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*;
import java.sql.*;
public class Main {
public static void main(String args[]){
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e){
System.out.println(""+e);
}
DatabaseWin win = new DatabaseWin();
}
}
class DatabaseWin extends JFrame implements ActionListener{
JMenuBar menubar;//创建菜单条
JMenu menu;//创建菜单
JMenuItem itemShow,itemUpdate,itemInsert;//创建菜单项
ShowRecord showRecord;
ModifyRecord modifyRecord;
InsertRecord insertRecord;
DatabaseWin(){
menubar = new JMenuBar();
menu = new JMenu("操作数据库");
itemShow = new JMenuItem("显示
");
itemUpdate = new JMenuItem("更新记录");
itemInsert = new JMenuItem("插入记录");
itemShow.addActionListener(this);
itemUpdate.addActionListener(this);
itemInsert.addActionListener(this);
menu.add(itemShow);
menu.add(itemUpdate);
menu.add(itemInsert);
menubar.add(menu);
showRecord = new ShowRecord("显示记录对话框");
modifyRecord = new ModifyRecord("修改记录对话框");
insertRecord = new InsertRecord("插入记录对话框");
setJMenuBar(menubar);
setBounds(100,100,370,250);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==itemShow){
showRecord.setVisible(true);
}
else if(e.getSource()==itemUpdate){
modifyRecord.setVisible(true);
}
else if(e.getSource()==itemInsert){
insertRecord.setVisible(true);
}
}
}
(4) 编辑ShowRecord.java,显示学生表的信息
package student.message;
import javax.swing.*;
import java.sql.*;
import java.awt.event.*;
import java.awt.*;
public class ShowRecord extends JDialog implements ActionListener{
JTable table;//创建标签
Object a[][];
Object[] name = {"学号","姓名","性别","班级","出生年月"};
JButton showRecord;
Connection con;
Statement sql;
ResultSet rs;
ShowRecord(String title){
setTitle(title);
showRecord = new JButton("显示记录");
showRecord.addActionListener(this);
add(showRecord,BorderLayout.NORTH);
setBounds(200,60,400,250);
}
public void actionPerformed(ActionEvent e){
try{
con = DriverManager.getConnection("jdbc:odbc:db1","","");
sql =
con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs = sql.executeQuery("SELECT * FROM 学生表");
rs.last();
int lastNumber = rs.getRow();
a = new Object[lastNumber][5];
int k = 0;
rs.beforeFirst();
while(rs.next()){
a[k][0] = rs.getString(1);
a[k][1] = rs.getString(2);
a[k][2] = rs.getString(3);
a[k][3] = rs.getString(4);
a[k][4] = rs.getDate(5);
k++;
}
con.close();
}
catch(SQLException ee){
System.out.println(ee);
}
table = new JTable(a,name);
getContentPane().removeAll();
add(showRecord,BorderLayout.NORTH);
add(new JScrollPane(table),BorderLayout.CENTER);
validate();
}
}
(5) 编辑InsertRecord.java,实现插入功能。
package student.message;
import javax.swing.*;
import java.awt.event.*;
import java.sql.*;
public class InsertRecord extends JDialog implements ActionListener{
JLabel hintLabel;
Object[] name = {"学号","姓名","性别","班级","出生年月"};
Object a[][] = new Object[1][5];
JTable table;
JButton enterInsert;
Connection con;
Statement sql;
ResultSet rs;
String num;
InsertRecord(String s){
setTitle(s);
hintLabel = new JLabel("输入新纪录");
table = new JTable(a,name);
enterInsert = new JButton("插入新纪录");
setLayout(null);
Box baseBox = Box.createHorizontalBox();
baseBox.add(hintLabel);
baseBox.add(new JScrollPane(table));
baseBox.add(enterInsert);
add(baseBox);
baseBox.setBounds(10, 40, 600, 38);
enterInsert.addActionListener(this);
setBounds(120,160,700,200);
}
public void actionPerformed(ActionEvent e){
try{
con = DriverManager.getConnection("jdbc:odbc:db1","","");
sql = con.createStatement();
int k = sql.executeUpdate("INSERT INTO 学生表 VALUES('"+a[0][0]+"','"+a[0][1]+"','"+a[0][2]+"','"+a[0][3]+"','"+a[0][4]+"')");
//int k = sql.executeUpdate("INSERT INTO 学生表 VALUES(a[0][0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5])");
if(k==1){
JOptionPane.showMessageDialog(this, "插入记录成功","成功",JOptionPane.PLAIN_MESSAGE);
con.close();
}
}
catch(SQLException ee){
JOptionPane.showMessageDialog(this, "插入记录失败"+ee,"失败",+JOptionPane.ERROR_MESSAGE);
}
}
}
(6) 编辑Modify.java,实现更改表的内容
package student.message;
import javax.swing.*;
import java.awt.event.*;
import java.sql.*;
public class ModifyRecord extends JDialog implements ActionListener {
JLabel hintLabel;
JTextField inputNumber;
Object name[] = {"姓名","性别","班级","出生年月"};
Object a[][] = new Object[1][5];
JTable table;
JButton enterModify;
Connection con;
Statement sql;
ResultSet rs;
String num;
ModifyRecord(String s){
setTitle(s);
hintLabel = new JLabel("输入学号(回车确认):");
inputNumber = new JTextField(20);
table = new JTable(a,name);
enterModify = new JButton("更新记录");
setLayout(null);
Box baseBox = Box.createHorizontalBox();
baseBox.add(hintLabel);
baseBox.add(inputNumber);
baseBox.add(new JScrollPane(table));
baseBox.add(enterModify);
add(baseBox);
baseBox.setBounds(10,40,600,38);
inputNumber.addActionListener(this);
enterModify.addActionListener(this);
setBounds(20,60,700,200);
}
public void actionPerformed(ActionEvent e){
if(e.getSource()== inputNumber)
try{
num = inputNumber.getText().trim();
con = DriverManager.getConnection("jdbc:odbc:db1","","");
sql = con.createStatement();
rs = sql.executeQuery("SELECT * FROM 学生表 WHERE 学号 ='"+num+"'");
boolean boo = rs.next();
if(boo==false){
JOptionPane.showMessageDialog(this, "学号不存在","提示",JOptionPane.WARNING_MESSAGE);
}
else{
a[0][0] = rs.getString(2);
a[0][1] = rs.getString(3);
a[0][2] = rs.getString(4);
a[0][3] =rs.getDate(5).toString();
table.repaint();
}
con.close();
}
catch(SQLException ee){
System.out.println(ee);
}
if(e.getSource()==enterModify)
try{
con = DriverManager.getConnection("jdbc:odbc:db1","","");
sql = con.createStatement();
sql.executeUpdate("UPDATE 学生表 SET 姓名 ='"+a[0][0]+"',性别='"+a[0][1]+"',班级='"+a[0][2]+"',出生年月='"+a[0][3]+"'WHERE 学号='"+num+"'");
JOptionPane.showMessageDialog(this, "更新成功","成功",JOptionPane.PLAIN_MESSAGE);
con.close();
}
catch(SQLException ee){
JOptionPane.showMessageDialog(this, "更新失败"+ee,"失败
",JOptionPane.ERROR_MESSAGE);
}
}
}