实验四 类与对象的定义及使用
实验时间 2018-9-20
1、实验目的与要求
(1) 理解用户自定义类的定义;
(2) 掌握对象的声明;
(3) 学会使用构造函数初始化对象;
(4) 使用类属性与方法的使用掌握使用;
(5) 掌握package和import语句的用途。
2、实验内容和步骤
实验1 测试以下程序,掌握文件输入输出程序设计技术(文件输入输出,教材61-62).
import java.io.*; import java.util.*; public class FileWriteReadTest { public static void main(String[] args) throws IOException{ //写入文件演示 PrintWriter out = new PrintWriter("myfile.txt"); out.println("姓名 高数 Java 数据结构 平均成绩 总成绩"); out.println("张三 20 30 40 0 0"); out.println("李四 50 60 70 0 0"); out.close();//输出完毕,需要close //读入文件演示 Scanner in = new Scanner(new File("myfile.txt"));//为myfile.txt这个File创建一个扫描器in int number = 1;//行号 System.out.println(in.nextLine()); while(in.hasNextLine()){//判断扫描器是否还有下一行未读取,该循环把文件的每一行都读出 String line = in.nextLine();//读出myfile.txt的下一行 System.out.print("第"+(++number)+"行的内容: "); Scanner linescanner = new Scanner(line);//行内容建立扫描器 linescanner.useDelimiter(" ");//使用空格作为分隔符 String name = linescanner.next(); String math = linescanner.next(); String java = linescanner.next(); String ds = linescanner.next(); String avg = linescanner.next(); String total = linescanner.next(); System.out.println("name="+name+" math="+math+" java="+java+" ds="+ds+" avg"+avg+" total="+total); } in.close();//读入完毕,最后需要对其进行close。 } }
插入程序显示的代码测试结果如下:
以txt的形式输出保存:
改变文件的保存地址,输出结果如下所示:
实验2 导入第4章示例程序并测试。
测试程序1:
编辑、编译、调试运行程序4-2(教材104页);
结合程序运行结果,掌握类的定义与类对象的用法,并在程序代码中添加类与对象知识应用的注释;
尝试在项目中编辑两个类文件(Employee.java、 EmployeeTest.java ),编译并运行程序。
参考教材104页EmployeeTest.java,设计StudentTest.java,定义Student类,包含name(姓名)、sex(性别)、javascore(java成绩)三个字段,编写程序,从键盘输入学生人数,输入学生信息,并按以下表头输出学生信息表:
姓名 性别 java成绩
测试这个程序,所显示的结果如下所示:
对程序改编的设计结果如下所示:
原实例代码:
import java.util.Scanner; /** * This program tests the Student class. * time 2018 9 22 * @author Ma Xingde */ public class EmployeeTest { public static void main(String[] args) { // fill the staff array with three Employee objects int x=2; Employee[] staff = new Employee[x]; System.out.println("请输入学生的姓名"); Scanner in = new Scanner(System.in); for(int i=0;i<staff.length;i++) { staff[i]=new Employee(in.next(),in.next(),in.nextInt()); } System.out.println("name"+" "+"sex"+" "+" "+"javascore"); // print out information about all Employee objects for (Employee e : staff) System.out.println(e.getName() +" "+e.getSex()+" "+e.getJavaScore()); } } class Employee { private String name; private String sex; private int javascore; public Employee(String n, String s, int m) { name = n; sex = s; javascore =m; } public String getName() { return name; } public String getSex() { return sex; } public int getJavaScore() { return javascore; } }
改编后运行的结果如下图所示:
测试程序2:
编辑、编译、调试运行程序4-3(教材116);
结合程序运行结果,理解程序代码,掌握静态域(netxtId)与静态方法(getNextId)的用法,在相关代码后添加注释;
理解Java单元(类)测试的技巧。
程序测试运行结果如下所示:
静态域的使用方法:
如果将域定义为static,每个类中只有这样的一个域。而每一个对象对于所有的实例域却都有自己的一个拷贝。每个雇员都有一个自己的id域,但这个类的所有实例将共享一个nextId域。但是,只有一个静态域nextid,即使没有一个雇员对象,静态域nextId也存在。它属于类,而不属于任何独立的对象。
静态方法的用法:
静态方法是一种不能想对象实施操作的方法。在下面两种情况下可以使用静态方法:
(1)一个方法不予要访问对象状态,其所需参数都是通过显示参数提供(例如:Math.pow)
(2)一个方法只需要访问类的静态域(例如:Employee.getNextId)
测试程序3:
编辑、编译、调试运行程序4-4(教材121);
结合程序运行结果,理解程序代码,掌握掌握Java方法参数的用法,在相关代码后添加注释;
测试的结果如下所示:
理解程序代码:
在这个程序测试当中,首先试图将一个值参数的值提高两倍,但是并没有成功,随后成功地将一个雇员的薪金提高了两倍。在这个方法结束之后,harry应用对象状态发生了变化。这是因为这个方法可以通过对象引用的拷贝修改所引用的对象状态。最后程序演示拉我swap失败的结果,可以明显的看出,最后变量x和y交换了,但是变量a和b没有收到影响。
测试程序4:
编辑、编译、调试运行程序4-5(教材129);
结合程序运行结果,理解程序代码,掌握Java用户自定义类的用法,掌握对象构造方法及对象使用方法,在相关代码后添加注释。
测试程序结果如下图所示:
对程序的理解:
在这个程序当中,用了Java的第三种初始化数据域的方法,称为初始化块。在一个类的声明中,可以包含多个代码块。只要构造类的对象,这些块就会被执行。在这个程序的25行开始,无论使用哪个构造器类对象,Id域都在对象初始化块中被初始化。首先运行初始化块,然后才运行构造器的主题部分。
在这个程序清单中展示了很多特性:重载构造器、用this(...)调用另一个构造器、无参数构造器、对象初始化块、静态初始化块、实例域初始化等。
测试程序5:
编辑、编译、调试运行程序4-6、4-7(教材135);
结合程序运行结果,理解程序代码,掌握Java包的定义及用法,在相关代码后添加注释;
导入程序的过程如下:
程序测试结果如下:
程序分析:
在这个程序当中介绍我们介绍了怎么使用类的导入,可以使用import语句导入一个特定的类火整个包,Import语句是一种应用包含在保重的类的简明描述,一旦使用了import语句,在使用类时,就不必写出包的全名了。而且在实验当中也有将类放入包中,就必须将包的名字放在源文件的开头,包中定义类的代码之前。如果没有在源文件中放置package语句,这个源文件中的类就被放置在一个默认包中。默认包是一个没有名字的包。再次之前,我们定义的所有类都在默认包中。
实验3
编写长方形类Rectangle与圆形类Circle,其中Rectangle类设置私有属性:width,length;Circle类设置私有属性radius。编写Rectangle类的带参构造函数Rectangle(int width,int length), Circle类的带参构造函数Circle(int radius),编写两个类的toString方法(Eclipse可自动生成)。上述2个类均定义以下方法:
求周长的方法public int getPerimeter()
求面积的方法public int getArea()
在main方法中完成以下任务:
(1) 输入1行长与宽,创建一个Rectangle对象;
(2) 输入1行半径,创建一个Circle对象;
(3) 将两个对象的周长加总输出,将两个对象的面积加总输出。
程序的源代码如下:
test.java代码:
package graph; import java.math.BigDecimal; import java.util.Scanner; class test { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入长方形的长:"); int length = sc.nextInt(); System.out.println("请输入长方形的宽:"); int width = sc.nextInt(); System.out.print("请输入圆的半径-->"); float radius=sc.nextFloat(); graph x = new graph(); x.setLength(length); x.setWidth(width); x.setRadius(radius); System.out.println("周长是:"+x.getPerimeter()); System.out.println("面积是:"+x.getArea()); System.out.println("圆的周长为-->"+x.getPerimeter(radius)+" "+"圆的面积为-->"+x.getArea(radius)); BigDecimal bd1 = new BigDecimal(x.getPerimeter(radius)); BigDecimal bd2 = new BigDecimal(x.getArea(radius)); BigDecimal bd3 = new BigDecimal(x.getPerimeter()); BigDecimal bd4 = new BigDecimal(x.getArea()); BigDecimal bd5 = bd1.add(bd3); BigDecimal bd6 = bd2.add(bd4); bd5= bd5.setScale(2, BigDecimal.ROUND_HALF_UP); bd6= bd6.setScale(2, BigDecimal.ROUND_HALF_UP); System.out.println("周长和:"+bd5+" "+"面积和"+bd6); } }
graph.java代码:
package graph; import java.util.Scanner; import java.math.BigDecimal; class graph{ private int length; private int width; float radius; public graph(){} public void setLength(int length) { this.length = length; } public void setWidth(int width) { this.width = width; } public int getPerimeter() { return (length + width) * 2; } public int getArea() { return length * width; } public void setRadius(float radius) { BigDecimal bd = new BigDecimal(radius); radius = bd.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue(); this.radius = radius; } public float getPerimeter(float radius){ BigDecimal bd = new BigDecimal(radius); radius = bd.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue(); return (float) (radius*2*3.14); } public float getArea(float radius){ BigDecimal bd = new BigDecimal(radius); radius = bd.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue(); return (float) (radius*radius*3.14); } }
程序输出的结果如下图所示:
实验总结:
通过这个周的学习,我明白了用户自定义类是如何去定义的。在第三章我已经学习了如何设计复杂应用程序所需要的各种主力类,同是,这些类没有main方法,却有自己的实例域和实例方法。在学习了类之后,有学习了静态域和静态方法的用法,在这一届的学习过程当中,觉得颇有收获,觉得比较简单易懂,了解了静态域、静态常量、静态方法、工厂方法和main方法的概念,并通过实例程序去真正理解了这些概念。接着学习了对象构造,在这一节主要就学习了参数化,初始化块。最后又学习了包,虽然在之前已经解除了包这个概念,但在这一节有学习了新的概念,比如说类的导入、静态导入、将类放入包中。这些都是自己在自主学习,希望在以后老师的讲解过程中有更大的进步。
在最后的做面积和周长的实验中对我来说还是有一定难度的,在请教了变成能力好的同学之后才解决了这个问题,希望以后会有进步吧。