达拉草201771010105《面向对象程序设计(java)》第四周学习总结
实验四类与对象的定义及使用
实验时间 2018-9-20
第一部分:理论知识
1.类与对象概念
(1)类是具有相同属性和方法的一类事物的抽象,是构造对象的模板或蓝图,由类构造对象的过程称为创建类的实例。
(2)对象:具体的某一事物,代表自身的一些属性和方法。即数据,对象有三个特性,行为、状态、标识。
2、使用预定义类
(1)在java程序设计语言中,使用构造器构造新事例。构造器是一种特殊的方法,用来构造并初始化对象。
(2)更改器前缀为set;访问器前缀为get;
(3)构造器和类有相同的名字
3.类与对象的关系
(1)类是对象,事物的描述和抽象,是具有相同属性和行为的对象集合。对象则是该类事物的实例,它也是一种抽象的概念集合,是最基础的组织单位,作为对象的模板、合约或蓝图。类是对象的类型,使用一个通用类可以定义同一类型的对象,类中定义对象的数据域是什么以及方法是做什么的。
(2)类是一个静态的概念,类本身不携带任何数据。当没有为类创建任何对象时,类本身不存在于内存空间中。对象是一个动态的概念。每一个对象都存在着有别于其它对象的属于自己的独特的属性和行为。对象的属性可以随着它自己的行为而发生改变。
3.对象与对象变量的关系
(1).Java中想使用对象就必须先构造对象,并指定其初始状态。
4.通过实验掌握了预定义类的基本使用方法,熟悉Math类、String类、math类、Scanner 类、LocalDate类的常用API。
5.main方法:我们学习java的时候,程序中大多会有一个main 方法,我们都称作程序的入口,main方法不对任何对象进行操作,事实上,在启动程序的时候,还没有任何一个对象,静态的main方法将执行并创建程序所需的对象。
6.掌握用户自定义类的语法规则,包括实例域、静态域、构造器方法、更改器方法、访问器方法、静态方法、main方法、方法参数的定义要求
(1)实例域:可将实例域定义为final,构建对象时必须初始化这样的域。
(2)静态域:绝大多数面向对象程序设计语言中,静态域被称为类域。如果将域定义为static,每个类中只有一个这样的域。而每个对象对于所有的实例域却都有自己的一份拷贝。
(3)静态方法:静态方法是一种不能向对象实时操作的方法。可以使用对象调用静态方法。
(4)构造器方法:构造器与类同名。构造器总是伴随着new操作符的执行被调用,而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的。
(5)更改器方法:调用更改器方法后对象的状态会改变。
(6)访问器方法:只访问对象而不修改对象的方法。
(7)main方法:main方法不对任何对象进行操作。静态的main方法将执行并创建程序所需要的对象。
7.重载
重载:多个方法有相同的名字、不同的参数、便产生了重载。Java允许重载任何方法,而不只是构造器方法。
8.包
包:Java允许使用包将类组织起来。借助包可以方便地组织自己的代码,并将自己的代码与别人提供的代码库分开管理。而且使用包可以确保类名的唯一性。
9、文档注释
文档注释:包括类注释,方法注释,域注释,通用注释,包与概述注释等。
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。 } } |
实验结果如下:
实验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成绩
1 import java.time.*; 2 public class EmployeeTest 3 { 4 public static void main(String[] args) 5 { 6 // fill the staff array with three Employee objects 7 Employee[] staff = new Employee[3];//构造了Employee数组 8 9 staff[0] = new Employee("Carl Cracker", 75000, 1987, 12, 15); 10 staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); 11 staff[2] = new Employee("Tony Tester", 40000, 1990, 3, 15); 12 13 // raise everyone's salary by 5% 14 for (Employee e : staff) 15 e.raiseSalary(5); 16 17 // print out information about all Employee objects 18 for (Employee e : staff) 19 System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay=" 20 + e.getHireDay()); 21 } 22 } 23 24 class Employee 25 { 26 private String name;//private定义访问权限 27 private double salary; 28 private LocalDate hireDay; 29 30 public Employee(String n, double s, int year, int month, int day)//构造器 31 { 32 name = n; 33 salary = s; 34 hireDay = LocalDate.of(year, month, day); 35 } 36 37 public String getName()//访问器 38 { 39 return name; 40 } 41 42 public double getSalary()//访问器 43 { 44 return salary; 45 } 46 47 public LocalDate getHireDay()//访问器 48 { 49 return hireDay; 50 } 51 52 public void raiseSalary(double byPercent) 53 { 54 double raise = salary * byPercent / 100; 55 salary += raise; 56 } 57 }
改编的程序如下:
1 import java.util.Scanner; 2 public class StudentTest 3 { 4 public static void main(String[] args) 5 { 6 Student[] staff = new Student[2]; 7 Scanner in=new Scanner(System.in); 8 System.out.print("请输入学生信息:"); 9 for(int i=0;i<staff.length;i++) { 10 staff[i]=new 11 Student(in.next(),in.next(),in.nextInt()); 12 } 13 System.out.print("name"+" "+"sex"+" "+"javascore"); 14 15 for (Student e : staff) 16 System.out.println(" " + e.getName() + " " + e.getSex() + " " + e.getjavascore()); 17 } 18 } 19 20 class Student 21 { 22 private String name; 23 private String sex; 24 private int javascore; 25 26 public Student(String n, String s,int j) 27 { 28 name = n; 29 sex = s; 30 javascore = j; 31 } 32 33 public String getName() 34 { 35 return name; 36 } 37 38 public String getSex() 39 { 40 return sex; 41 } 42 43 public int getjavascore() 44 { 45 return javascore; 46 } 47 }
实验结果如下:
测试程序2:
l 编辑、编译、调试运行程序4-3(教材116);
l 结合程序运行结果,理解程序代码,掌握静态域(netxtId)与静态方法(getNextId)的用法,在相关代码后添加注释;
l 理解Java单元(类)测试的技巧。
测试程序3:
l 编辑、编译、调试运行程序4-4(教材121);
l 结合程序运行结果,理解程序代码,掌握掌握Java方法参数的用法,在相关代码后添加注释;
测试程序4:
l 编辑、编译、调试运行程序4-5(教材129);
l 结合程序运行结果,理解程序代码,掌握Java用户自定义类的用法,掌握对象构造方法及对象使用方法,在相关代码后添加注释。
测试程序5:
l 编辑、编译、调试运行程序4-6、4-7(教材135);
l 结合程序运行结果,理解程序代码,掌握Java包的定义及用法,在相关代码后添加注释;
实验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) 将两个对象的周长加总输出,将两个对象的面积加总输出。
1 import java.util.Scanner; 2 public class Fannder{ 3 public static void main(String[] args) { 4 Scanner in = new Scanner(System.in); 5 System.out.print("请输入矩形的x y:"); 6 int x = in.nextInt(); 7 int y = in.nextInt(); 8 System.out.print("矩形周长 "+Perimeter.getPerimeter(x,y)); 9 System.out.print("矩形面积"+Area.getArea(x,y)); 10 System.out.print("请输入圆的r:"); 11 12 int r = in.nextInt(); 13 System.out.println("圆周长 "+Perimeter.getPerimeter(r)); 14 System.out.println("圆面积"+Area.getArea(r)); 15 16 double c = Perimeter.getPerimeter(x,y)+Perimeter.getPerimeter(r); 17 18 double s = Area.getArea(x,y)+Area.getArea(r); 19 20 System.out.println("矩形与圆的周长和为:"+c); 21 22 System.out.println("矩形与圆的面积和为:"+s); 23 } 24 25 } 26 27 class Perimeter{ 28 29 public static double getPerimeter(double width, double height) { 30 return 2*(width + height); 31 } 32 public static double getPerimeter(int r) { 33 return 2*3.14*r; 34 } 35 } 36 37 class Area{ 38 public static double getArea(double width, double height){ 39 return width * height; 40 } 41 public static double getArea(int r) { 42 return 3.14*r*r; 43 } 44 }
实验结果如下:
实验总结:
这次实验多数是让我们通过阅读书上的例子,去写代码,但在写代码过程中还是有遇到一些问题。这就是我认识到通过阅读理解原有的代码,去学习其中的方法,并把掌握和运用这些方法是很重要。通过这次的实验我发现对于书上的例子有些地方我还是不太理解。在上周的学习中我们学习了类与对象的部分知识,明确了类与对象的定义,学习了如何用户自定义类。