安徽工业大学java实验报告.docx
《安徽工业大学java实验报告.docx》由会员分享,可在线阅读,更多相关《安徽工业大学java实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
安徽工业大学java实验报告
JAVA实验报告
实验1:
利用JAVA反射技术分析类结构
实验内容:
运行程序,指定一个要分析的类名称,如java.lang.Double,输出类中声明的属性、方法、构造函数等。
结果分析:
1.分析程序运行时的输出结果。
输出的结果中显示了被分析类的方法与变量,包括这些方法与变量的修饰符
2.分析与JAVA反射技术相关的几个类的作用:
java.lang.reflect.Constructor;
Constructor提供关于类的单个构造方法的信息以及对它的访问权限。
java.lang.reflect.Field;
Field提供有关类或接口的单个字段的信息,以及对它的动态访问权限。
反射的字段可能是一个类(静态)字段或实例字段。
java.lang.reflect.Method;
Method提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。
所反映的方法可能是类方法或实例方法(包括抽象方法)。
java.lang.reflect.Modifier;
Modifier类提供了static方法和常量,对类和成员访问修饰符进行解码。
修饰符集被表示为整数,用不同的位位置(bitposition)表示不同的修饰符。
定义一个自己的类,如Employee类,定义几个属性、方法、构造函数,要求成员的属性包含Public、Private、Protected、Static等。
运行该程序分析一下你自己定义的类结构。
classEmployee{
publicStringname;
publicStringid;
privateintage;
staticprotectedintsalary=100;
Employee()
{
}
privatevoidEmployee(Stringxm,Stringbh,intnl)
{
name=xm;
id=bh;
age=nl;
}
protecteddoubleEmployee(intgz)
{
returngz+salary;
}
}分析:
先调用一个无参数的构造函数构造,然后再调用该构造函数privatevoidEmployee(Stringxm,Stringbh,intnl)构造一个对象,最后调用构造函数计算总的薪水。
实验2:
利用JAVA反射技术分析对象结构
实验内容:
运行示例程序,分析Integer数组对象的结构;改写程序分析一下自定义的类对象,如Employee类。
源代码:
publicabstractclassPeople{
doublesalary;
Stringname;
intyear,mouth,day;
publicabstractdoublegetSalary();
publicabstractvoidsetSalary(doublesalary);
}
classEmployeeextendsPeople{
Employee(Stringname,doublesalary,intyear,intmouth,intday){
this.salary=salary;
this.name=name;
this.year=year;
this.mouth=mouth;
this.day=day;
}
Employee(){
}
publicdoublegetSalary(){
returnsalary;
}
publicvoidsetSalary(doublesalary){
this.salary=salary;
}
}
classManagerextendsPeople{
privatedoublebonus;
Manager(Stringname,doublesalary,intyear,intmouth,intday){
this.salary=salary;
this.name=name;
this.year=year;
this.mouth=mouth;
this.day=day;
bonus=0;
}
publicdoublegetSalary(){
returnsalary+bonus;
}
publicvoidsetSalary(doublesalary){
this.salary=salary;
}
publicvoidsetBonus(doublebonus){
this.bonus=bonus;
}
}
分析:
代码中Methodl类就相当于一个指向类中方法的指针,Class类通过getMethod方法获取这个Method类,之后Method类的对象可以通过invoke方法来调用这个方法。
实验4:
利用TreeSet实现集合元素排序
独立编程实现如下功能:
定义一个自己的类,如Employee类,定义几个属性(如name,salary,hiredate等),随机构造10个Employee类对象,添加到三个不同的TreeSet中,要求三个TreeSet输出的Employee对象分别按照姓名,薪水,雇佣日期排序。
源代码:
importjava.util.*;
classNameComparatorimplementsComparator{
publicintcompare(Employeea,Employeeb)
{
StringnameA=a.getname();
StringnameB=b.getname();
returnnameA.compareTo(nameB);
}
}
classDataComparatorimplementsComparator{
publicintcompare(Employeea,Employeeb)
{
StringdateA=a.getdate();
StringdateB=b.getdate();
returndateA.compareTo(dateB);
}
}
classEmployeeimplementsComparable{
intsalary=0;
Stringname;
Stringdate;
Employee(Stringn,ints,Stringi){
salary=s;name=n;date=i;
}
publicStringgetname(){
returnname;
}
publicStringgetdate(){
returndate;
}
@Override
publicintcompareTo(Objecto){
//TODOAuto-generatedmethodstub
Employeeem=(Employee)o;
return(this.salary-em.salary);
}
}
publicclasssy4{
publicstaticvoidmain(String[]args){
TreeSetmytree=newTreeSet();
Employeeem0,em1,em2,em3,em4,em5,em6,em7,em8,em9;
em0=newEmployee("张三",1500,"1231");
em1=newEmployee("李四",1000,"1201");
em2=newEmployee("王武",1001,"1202");
em3=newEmployee("流云",1002,"1203");
em4=newEmployee("张杰",1200,"1101");
em5=newEmployee("华荣",1300,"1025");
em6=newEmployee("郭靖",1100,"1110");
em7=newEmployee("黄蓉",1150,"1205");
em8=newEmployee("黄蕾",2500,"1120");
em9=newEmployee("马凯",1320,"1221");
mytree.add(em0);
mytree.add(em1);
mytree.add(em2);
mytree.add(em3);
mytree.add(em4);
mytree.add(em5);
mytree.add(em6);
mytree.add(em7);
mytree.add(em8);
mytree.add(em9);
System.out.println("按工资排序");
System.out.println();
Iteratores=mytree.iterator();
while(es.hasNext()){
Employeeems=es.next();
System.out.println(""+ems.name+""+ems.date+""+ems.salary);
}
NameComparatorcomp=newNameComparator();
SortedSetsortByname=newTreeSet(comp);
sortByname.add(em0);
sortByname.add(em1);
sortByname.add(em2);
sortByname.add(em3);
sortByname.add(em4);
sortByname.add(em5);
sortByname.add(em6);
sortByname.add(em7);
sortByname.add(em8);
sortByname.add(em9);
System.out.println();
System.out.println("按姓名排序");
Iteratoren=sortByname.iterator();
while(en.hasNext()){
Employeeemn=en.next();
System.out.println(""+emn.name+""+emn.date+""+emn.salary);
}
DataComparatorcomp1=newDataComparator();
SortedSetsortBydate=newTreeSet(comp1);
sortBydate.add(em0);
sortBydate.add(em1);
sortBydate.add(em2);
sortBydate.add(em3);
sortBydate.add(em4);
sortBydate.add(em5);
sortBydate.add(em6);
sortBydate.add(em7);
sortBydate.add(em8);
sortBydate.add(em9);
System.out.println();
System.out.println("按雇佣日期排序");
Iteratorda=sortByname.iterator();
while(da.hasNext()){
Employeedat=da.next();
System.out.println(""+dat.name+""+dat.date+""+dat.salary);
}
}
}
运行结果:
实验5:
多线程同步之团结就是力量实验
问题描述:
四名学生值日,教室里共有500套桌椅需要擦净,四人没有进行明确分工,能者多劳,团结一致,最终将教室里的桌椅擦得干干净净。
程序要求:
编写多线程程序,为每名学生创建单独的线程,以桌椅为操作对象,要尽量做到分工合理,并记录每人负责的桌椅数,擦完500套桌椅后即退出应用程序。
要点:
1、每个学生对象都是同一个线程类对象,如何体现能者多劳?
2、多个学生线程在劳动时要么擦桌子,要么擦椅子,如何实现对共享的数据(500套桌椅)同步访问,如果学生甲在擦桌子,是否允许学生乙擦椅子?
源程序:
importjava.util.Random;
publicclassCooperation{
publicstaticvoidmain(String[]args){
WorkStudent2ws1=newWorkStudent2(1,10);
WorkStudent2ws2=newWorkStudent2(2,20);
WorkStudent2ws3=newWorkStudent2(3,30);
WorkStudent2ws4=newWorkStudent2(4,40);
newThread(ws1).start();
newThread(ws2).start();
newThread(ws3).start();
newThread(ws4).start();
}
}
classZhuoYi{
int[]desk={0,0,0,0,0};
int[]chair={0,0,0,0,0};
privateintchairCount=500;
privateintdeskCount=500;
publicsynchronizedBooleandistribute(intid,longsleeptime){
intchairs=1;
intdesks=1;
Randomrdm=newRandom(System.currentTimeMillis());
if(rdm.nextInt()%2==0){
if(chairCount>0)
{
chairs=chairs-1;
while(chairs<0)
{
try
{
wait();
}catch(InterruptedExceptione)
{
}
}
System.out.println("Student"+id+":
wipingdesk"+chairCount--);
chair[id]+=1;
chairs=chairs+1;
notifyAll();
}
}
else
{
if(deskCount>0)
{
desks=desks-1;
while(desks<0)
{
try
{
wait();
}catch(InterruptedExceptione)
{
}
}
System.out.println("Student"+id+":
wipingdesk"+deskCount--);
desk[id]+=1;
desks=desks+1;
notifyAll();
}
}
if(chairCount==0&&deskCount==0)
returntrue;
else
returnfalse;
}
}
classWorkStudent2implementsRunnable{
privatelongsleeptime;
privateintid;
staticZhuoYidc=newZhuoYi();
publicWorkStudent2(intid,longtime){
super();
this.id=id;
this.sleeptime=time;
}
publicvoidrun(){
while(!
dc.distribute(id,sleeptime))
{
try
{
Thread.sleep(sleeptime);
}
catch(Exceptione)
{
}
};
System.out.println("Result:
Student"+id+"wiped"+dc.desk[id]+"desksand"+dc.chair[id]+"chairs.");
}
}
运行结果(运行结果过长,只截取部分):