201871010111-刘佳华《面向对象程序设计(java)》第四周学习总结
实验时间 2019-9-20
第一部分:总结第四章理论知识
4.1:类与对象的概念。
类:类是构造对象的模板。由类构造对象的过程称为创建类的实例。
对象:想要使用oop,一定要清楚对象的三个特性:
1)对象的行为:对象的行为使用可调用的方法定义的。
·2)对象的状态:每个对象都保存着描述当前特征的信息。
3)对象标识:如何辨明具有相同行为的相似性。
4.2:类之间的关系。
常见关系有:依赖(“uses-a”)、聚合("has-a'')、继承("is-a")。
4.3:使用预定义类。
已学过的预定义类如math,Math,String,Scanner等。
1)对象与对象变量。
在Java语言中,使用构造器构造新实例。构造器是类中一个特殊的方法,生成并初始化对象,它的方法名与类名相同。
想要构造一个Data对象(定义在java.util中),需要在构造器前加上new操作符:new Data()
若定义为Data deadline;则该语句错误。
可将一个对象变量设置为null,表示该对象变量未引用任何变量,如deadlin=null。
4.4:更改器与访问器。
更改器:修改实例域。前缀set,更改当前类中的属性。
访问器:更改实例域。前缀get。
4.4:用户自定义类;
4.5:静态域与静态方法;
4.6:方法参数 ;对象构造
4.7:包
4.8:类路径
4.9:文档注释
4.10:类设计技巧
第二部分:实验部分
实验名称:实验三 类与对象的定义及使用
1. 实验目的:
(1) 熟悉PTA平台线上测试环境;
(2) 理解用户自定义类的定义;
(3) 掌握对象的声明;
(4) 学会使用构造函数初始化对象;
(5) 使用类属性与方法的使用掌握使用;
(6) 掌握package和import语句的用途。
2.实验内容和步骤
实验1 采用个人账号登录https://pintia.cn/,使用绑定码620781加入PTA平台NWNU-2019CST1教学班(西北师范大学 计算机科学与工程学院 2018级计算机科学与技术),完成《2019秋季西北师范大学面向对象程序设计程序设计能力测试1》,测试时间50分钟。
实验2 导入第4章示例程序并测试。
测试程序1:
l 编辑、编译、调试运行程序4-2(教材104页);
l 结合程序运行结果,掌握类的定义与类对象的用法,并在程序代码中添加类与对象知识应用的注释;
l 尝试在项目中编辑两个类文件(Employee.java、 EmployeeTest.java ),编译并运行程序。
l 参考教材104页EmployeeTest.java,设计StudentTest.java,定义Student类,包含name(姓名)、sex(性别)、javascore(java成绩)三个字段,编写程序,从键盘输入学生人数,输入学生信息,并按以下表头输出学生信息表:
姓名 性别 java成绩
课本案例编译运行结果如下:
- 根据课本程序改编程序代码如下:
import java.util.Scanner; /** * This program tests the Student class. * time 2019 9 21 * @author liu jiahua */ public class Main { public static void main(String[] args) { Student []stu=new Student[2]; System.out.println("please input name,sex,score"); Scanner in =new Scanner(System.in); for (int i=0;i){ stu[i]=new Student(in.next(),in.next(),in.nextFloat()); } System.out.println("name"+" "+"sex"+" "+" "+"javascore"); for (Student o : stu) System.out.println(o.getName() +" "+o.getSex()+" "+o.getJavaScore()); in.close(); } } class Student{ private String name; private String sex; private float javascore; public Student(String n, String s, float m) { name = n; sex = s; javascore =m; } public String getName(){ return name; } public String getSex(){ return sex; } public float getJavaScore(){ return javascore; } }
运行代码结果如下:
测试程序2:
l 编辑、编译、调试运行程序4-3(教材116);
l 结合程序运行结果,理解程序代码,掌握静态域(netxtId)与静态方法(getNextId)的用法,在相关代码后添加注释;
l 理解Java单元(类)测试的技巧。
运行结果如下:
静态域的使用方法:
如果将域定义为static,每个类中只有这样的一个域。而每一个对象对于所有的实例域却都有自己的一个拷贝。每个雇员都有一个自己的id域,但这个类的所有实例将共享一个nextId域。但是,只有一个静态域nextid,即使没有一个雇员对象,静态域nextId也存在。它属于类,而不属于任何独立的对象。
静态方法的用法:
静态方法是一种不能想对象实施操作的方法。在下面两种情况下可以使用静态方法:
(1)一个方法不予要访问对象状态,其所需参数都是通过显示参数提供(例如:Math.pow)
(2)一个方法只需要访问类的静态域(例如:Employee.getNextId)
测试程序3:
l 编辑、编译、调试运行程序4-4(教材121);
l 结合程序运行结果,理解程序代码,掌握Java方法参数的用法,在相关代码后添加注释;
/** * This program demonstrates parameter passing in Java. * @version 1.01 2018-04-10 * @author Cay Horstmann */ public class ParamTest { public static void main(String[] args) { //该方法不能修改数值参数 System.out.println("Testing tripleValue:"); double percent = 10; System.out.println("Before: percent=" + percent); tripleValue(percent); System.out.println("After: percent=" + percent); //该方法可以改变对象参数的状态 System.out.println("\nTesting tripleSalary:"); var harry = new Employee("Harry", 50000); System.out.println("Before: salary=" + harry.getSalary()); tripleSalary(harry); System.out.println("After: salary=" + harry.getSalary()); //该方法可以将新对象附加到对象参数 System.out.println("\nTesting swap:"); var a = new Employee("Alice", 70000); var b = new Employee("Bob", 60000); System.out.println("Before: a=" + a.getName()); System.out.println("Before: b=" + b.getName()); swap(a, b); System.out.println("After: a=" + a.getName()); System.out.println("After: b=" + b.getName()); } public static void tripleValue(double x) // doesn't work { x = 3 * x; System.out.println("End of method: x=" + x); } public static void tripleSalary(Employee x) // works { x.raiseSalary(200); System.out.println("End of method: salary=" + x.getSalary()); } public static void swap(Employee x, Employee y) { Employee temp = x; x = y; y = temp; System.out.println("End of method: x=" + x.getName()); System.out.println("End of method: y=" + y.getName()); } } class Employee // simplified Employee class { private String name; private double salary; public Employee(String n, double s) { name = n; salary = s; } public String getName() { return name; } public double getSalary() { return salary; } public void raiseSalary(double byPercent) { double raise = salary * byPercent / 100; salary += raise; } }
运行结果如下:
测试程序4:
l 编辑、编译、调试运行程序4-5(教材129);
结合程序运行结果,理解程序代码,掌握Java用户自定义类的用法,掌握对象构造方法及对象使用方法,在相关代码后添加注释。
对程序的理解:
在这个程序当中,用了Java的第三种初始化数据域的方法,称为初始化块。在一个类的声明中,可以包含多个代码块。只要构造类的对象,这些块就会被执行。在这个程序的25行开始,无论使用哪个构造器类对象,Id域都在对象初始化块中被初始化。首先运行初始化块,然后才运行构造器的主题部分。
在这个程序清单中展示了很多特性:重载构造器、用this(...)调用另一个构造器、无参数构造器、对象初始化块、静态初始化块、实例域初始化等。
测试程序5:
l 编辑、编译、调试运行程序4-6、4-7(教材135);
l 结合程序运行结果,理解程序代码,掌握Java包的定义及用法,在相关代码后添加注释;
1)实例4-6
包的放法:
运行结果:
程序分析:
在这个程序当中介绍我们介绍了怎么使用类的导入,可以使用import语句导入一个特定的类火整个包,Import语句是一种应用包含在保重的类的简明描述,一旦使用了import语句,在使用类时,就不必写出包的全名了。而且在实验当中也有将类放入包中,就必须将包的名字放在源文件的开头,包中定义类的代码之前。如果没有在源文件中放置package语句,这个源文件中的类就被放置在一个默认包中。默认包是一个没有名字的包。再次之前,我们定义的所有类都在默认包中。
4. 实验总结:
通过这个周的学习,我明白了用户自定义类是如何去定义的。在第三章我已经学习了如何设计复杂应用程序所需要的各种主力类,同是,这些类没有main方法,却有自己的实例域和实例方法。在学习了类之后,有学习了静态域和静态方法的用法,在这一届的学习过程当中,觉得颇有收获,觉得比较简单易懂,了解了静态域、静态常量、静态方法、工厂方法和main方法的概念,并通过实例程序去真正理解了这些概念。接着学习了对象构造,在这一节主要就学习了参数化,初始化块。最后又学习了包,虽然在之前已经解除了包这个概念,但在这一节有学习了新的概念,比如说类的导入、静态导入、将类放入包中。这些都是自己在自主学习,希望在以后老师的讲解过程中有更大的进步。