第一部分:理论知识。

第四章:对象与类

4.1:类与对象的概念。

类:是构造对象的模板或蓝图。由类构造对象的过程称为创建类的实例。

对象:想要使用oop,一定要清楚对象的三个特性:

1)对象的行为:对象的行为使用可调用的方法定义的。

·2)对象的状态:每个对象都保存着描述当前特征的信息。

3)对象标识:如何辨明具有相同行为的相似性。

4.2:类之间的关系。

常见关系有:依赖、聚合、继承。

4.3:使用预定义类。

已学过的预定义类如math,Math,String,Scanner等。

1)对象与对象变量。

在Java语言中,使用构造器构造新实例。构造器是类中一个特殊的方法,生成并初始化对象,它的方法名与类名相同。

想要构造一个Data对象(定义在java.util中),需要在构造器前加上new操作符:new Data()

Data deadline;该语句错误。

可将一个对象变量设置为null,表示该对象变量未引用任何变量,如deadlin=null。

4.4:更改器与访问器。

更改器:修改实例域。前缀set,更改当前类中的属性。

访问器:更改实例域。前缀get。

第二部分:实验部分。

1、实验目的与要求

(1) 理解用户自定义类的定义;

(2) 掌握对象的声明;

(3) 学会使用构造函数初始化对象;

(4) 使用类属性与方法的使用掌握使用;

(5) 掌握package和import语句的用途。

2、实验内容和步骤

实验1:测试以下程序,掌握文件输入输出程序设计技术(文件输入输出,教材61-62).

代码如下:

  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. public class FileWriteReadTest {
  5. public static void main(String[] args) throws IOException {
  6. // 写入文件演示
  7. PrintWriter out = new PrintWriter("myfile.txt");
  8. out.println("姓名 高数 Java 数据结构 平均成绩 总成绩");
  9. out.println("张三 20 30 40 0 0");
  10. out.println("李四 50 60 70 0 0");
  11. out.close();// 输出完毕,需要close
  12. // 读入文件演示
  13. Scanner in = new Scanner(new File("myfile.txt"));// 为myfile.txt这个File创建一个扫描器in
  14. int number = ;// 行号
  15. System.out.println(in.nextLine());
  16. while (in.hasNextLine()) {// 判断扫描器是否还有下一行未读取,该循环把文件的每一行都读出
  17. String line = in.nextLine();// 读出myfile.txt的下一行
  18. System.out.print("第" + (++number) + "行的内容: ");
  19. Scanner linescanner = new Scanner(line);// 行内容建立扫描器
  20. linescanner.useDelimiter(" ");// 使用空格作为分隔符
  21. String name = linescanner.next();
  22. String math = linescanner.next();
  23. String java = linescanner.next();
  24. String ds = linescanner.next();
  25. String avg = linescanner.next();
  26. String total = linescanner.next();
  27. System.out.println("name=" + name + " math=" + math + " java=" + java + " ds=" + ds + " avg=" + avg
  28. + " total=" + total);
  29. }
  30. in.close();// 读入完毕,最后需要对其进行close。
  31. }
  32. }

程序运行结果如下:

实验2 导入第4章示例程序并测试。

测试程序1:

编辑、编译、调试运行程序4-2(教材104页);

结合程序运行结果,掌握类的定义与类对象的用法,并在程序代码中添加类与对象知识应用的注释;

尝试在项目中编辑两个类文件(Employee.java、 EmployeeTest.java ),编译并运行程序。

程序如下:(1)EmployeeTest.java

  1. import java.time.*;
  2.  
  3. /**
  4. * This program tests the Employee class.
  5. *
  6. * @version 1.12 2015-05-08
  7. * @author Cay Horstmann
  8. */
  9. public class EmployeeTest {
  10. public static void main(String[] args) {
  11. // 用三个Employee对象填充staff数组
  12. Employee[] staff = new Employee[];
  13.  
  14. staff[] = new Employee("Carl Cracker", , , , );
  15. staff[] = new Employee("Harry Hacker", , , , );
  16. staff[] = new Employee("Tony Tester", , , , );
  17.  
  18. //将每个人的工资提高5%
  19. for (Employee e : staff)
  20. e.raiseSalary();
  21.  
  22. //打印出员工反对的信息
  23. for (Employee e : staff)
  24. System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay=" + e.getHireDay());
  25. }
  26. }
  27.  
  28. class Employee {
  29. private String name;
  30. private double salary;
  31. private LocalDate hireDay;
  32.  
  33. public Employee(String n, double s, int year, int month, int day) {
  34. name = n;
  35. salary = s;
  36. hireDay = LocalDate.of(year, month, day);
  37. }
  38.  
  39. public String getName() {
  40. return name;
  41. }
  42.  
  43. public double getSalary() {
  44. return salary;
  45. }
  46.  
  47. public LocalDate getHireDay() {
  48. return hireDay;
  49. }
  50.  
  51. public void raiseSalary(double byPercent) {
  52. double raise = salary * byPercent / ;
  53. salary += raise;
  54. }
  55.  
  56. }

程序运行结果如下所示:

(2)Employee.java

  1.  
  1. /**
  2. * @version 1.10 1999-11-13
  3. * @author Cay Horstmann
  4. */
  5.  
  6. public class Employee
  7. {
  8. private String name;
  9. private double salary;
  10.  
  11. public native void raiseSalary(double byPercent);
  12.  
  13. public Employee(String n, double s)
  14. {
  15. name = n;
  16. salary = s;
  17. }
  18.  
  19. public void print()
  20. {
  21. System.out.println(name + " " + salary);
  22. }
  23.  
  24. static
  25. {
  26. System.loadLibrary("Employee");
  27. }
  28. }
  1.  

参考教材104页EmployeeTest.java,设计StudentTest.java,定义Student类,包含name(姓名)、sex(性别)、javascore(java成绩)三个字段,编写程序,从键盘输入学生人数,输入学生信息,并按以下表头输出学生信息表:姓名、性别、java成绩。

程序如下:

  1. import java.util.*;
  2. public class StudentTest
  3. {
  4. public static void main(String[] args)
  5. {
  6. Student[] staff = new Student[];
  7. System.out.println("请输入学生姓名、性别、Java成绩");
  8.  
  9. Scanner in = new Scanner(System.in);
  10. for(int i=;i<staff.length;i++) {
  11. staff[i]=new Student(in.next(),in.next(),in.nextInt());
  12. }
  13. System.out.println("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:

编辑、编译、调试运行程序4-3(教材116);

结合程序运行结果,理解程序代码,掌握静态域(netxtId)与静态方法(getNextId)的用法,在相关代码后添加注释;

理解Java单元(类)测试的技巧。

程序如下:

  1. /**
  2. /**
  3. * This program demonstrates static methods.
  4. * @version 1.01 2004-02-19
  5. * @author Cay Horstmann
  6. */
  7. public class StaticTest
  8. {
  9. public static void main(String[] args)
  10. {
  11. //用三个Employee对象填充staff数组
  12. Employee[] staff = new Employee[];
  13.  
  14. staff[] = new Employee("Tom", );
  15. staff[] = new Employee("Dick", );
  16. staff[] = new Employee("Harry", );
  17.  
  18. //打印出员工反对的信息
  19. for (Employee e : staff)
  20. {
  21. e.setId();
  22. System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary="
  23. + e.getSalary());
  24. }
  25.  
  26. int n = Employee.getNextId(); // calls static method
  27. System.out.println("Next available id=" + n);
  28. }
  29. }
  30.  
  31. class Employee
  32. {
  33. private static int nextId = ;
  34.  
  35. private String name;
  36. private double salary;
  37. private int id;
  38.  
  39. public Employee(String n, double s)
  40. {
  41. name = n;
  42. salary = s;
  43. id = ;
  44. }
  45.  
  46. public String getName()
  47. {
  48. return name;
  49. }
  50.  
  51. public double getSalary()
  52. {
  53. return salary;
  54. }
  55.  
  56. public int getId()
  57. {
  58. return id;
  59. }
  60.  
  61. public void setId()
  62. {
  63. id = nextId; //将此ID设置为下一个可用ID
  64. nextId++;
  65. }
  66.  
  67. public static int getNextId()
  68. {
  69. return nextId; //返回static域
  70. }
  71.  
  72. public static void main(String[] args) // unit test
  73. {
  74. Employee e = new Employee("Harry", );
  75. System.out.println(e.getName() + " " + e.getSalary());
  76. }
  77.  
  78. }

程序运行结果如下:

测试程序3:

编辑、编译、调试运行程序4-4(教材121);

结合程序运行结果,理解程序代码,掌握掌握Java方法参数的用法,在相关代码后添加注释;

程序如下:

  1. /**
  2. * This program demonstrates parameter passing in Java.
  3. * @version 1.00 2000-01-27
  4. * @author Cay Horstmann
  5. */
  6. public class ParamTest
  7. {
  8. public static void main(String[] args)
  9. {
  10. //该方法不能修改数值参数
  11. System.out.println("Testing tripleValue:");
  12. double percent = ;
  13. System.out.println("Before: percent=" + percent);
  14. tripleValue(percent);
  15. System.out.println("After: percent=" + percent);
  16.  
  17. //该方法可以改变对象参数的状态
  18. System.out.println("\nTesting tripleSalary:");
  19. Employee harry = new Employee("Harry", );
  20. System.out.println("Before: salary=" + harry.getSalary());
  21. tripleSalary(harry);
  22. System.out.println("After: salary=" + harry.getSalary());
  23.  
  24. //该方法可以将新对象附加到对象参数
  25. System.out.println("\nTesting swap:");
  26. Employee a = new Employee("Alice", );
  27. Employee b = new Employee("Bob", );
  28. System.out.println("Before: a=" + a.getName());
  29. System.out.println("Before: b=" + b.getName());
  30. swap(a, b);
  31. System.out.println("After: a=" + a.getName());
  32. System.out.println("After: b=" + b.getName());
  33. }
  34.  
  35. public static void tripleValue(double x) // doesn't work
  36. {
  37. x = * x;
  38. System.out.println("End of method: x=" + x);
  39. }
  40.  
  41. public static void tripleSalary(Employee x) // works
  42. {
  43. x.raiseSalary();
  44. System.out.println("End of method: salary=" + x.getSalary());
  45. }
  46.  
  47. public static void swap(Employee x, Employee y)
  48. {
  49. Employee temp = x;
  50. x = y;
  51. y = temp;
  52. System.out.println("End of method: x=" + x.getName());
  53. System.out.println("End of method: y=" + y.getName());
  54. }
  55. }
  56.  
  57. class Employee
  58. {
  59. private String name;
  60. private double salary;
  61.  
  62. public Employee(String n, double s)
  63. {
  64. name = n;
  65. salary = s;
  66. }
  67.  
  68. public String getName()
  69. {
  70. return name;
  71. }
  72.  
  73. public double getSalary()
  74. {
  75. return salary;
  76. }
  77.  
  78. public void raiseSalary(double byPercent)
  79. {
  80. double raise = salary * byPercent / ;
  81. salary += raise;
  82. }
  83. }

程序运行结果如下:

测试程序4:

编辑、编译、调试运行程序4-5(教材129);

结合程序运行结果,理解程序代码,掌握Java用户自定义类的用法,掌握对象构造方法及对象使用方法,在相关代码后添加注释。

程序如下:

  1. import java.util.*;
  2.  
  3. /**
  4. * This program demonstrates object construction.
  5. * @version 1.01 2004-02-19
  6. * @author Cay Horstmann
  7. */
  8. public class ConstructorTest
  9. {
  10. public static void main(String[] args)
  11. {
  12. //用单个Employee对象填充staff数组
  13. Employee[] staff = new Employee[];
  14.  
  15. staff[] = new Employee("Harry", );
  16. staff[] = new Employee();
  17. staff[] = new Employee();
  18.  
  19. //打印出员工反对信息
  20. for (Employee e : staff)
  21. System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary="
  22. + e.getSalary());
  23. }
  24. }
  25.  
  26. class Employee
  27. {
  28. private static int nextId;
  29.  
  30. private int id;
  31. private String name = ""; //实例字段初始化
  32. private double salary;
  33.  
  34. // static initialization block
  35. static
  36. {
  37. Random generator = new Random();
  38. //从0-9999随机分配下一ID的地址
  39. nextId = generator.nextInt();
  40. }
  41. {
  42. id = nextId;
  43. nextId++;
  44. }
  45.  
  46. public Employee(String n, double s)
  47. {
  48. name = n;
  49. salary = s;
  50. }
  51.  
  52. public Employee(double s)
  53. {
  54. //调用雇员构造函数
  55. this("Employee #" + nextId, s);
  56. }
  57.  
  58. //默认构造函数
  59. public Employee()
  60. {// salary not explicitly set--initialized to 0
  61. // id initialized in initialization block
  62. }
  63.  
  64. public String getName()
  65. {
  66. return name;
  67. }
  68.  
  69. public double getSalary()
  70. {
  71. return salary;
  72. }
  73.  
  74. public int getId()
  75. {
  76. return id;
  77. }
  78. }

程序运行结果如下:

测试程序5:

l 编辑、编译、调试运行程序4-6、4-7(教材135);

l 结合程序运行结果,理解程序代码,掌握Java包的定义及用法,在相关代码后添加注释;

程序4-6如下:

  1. import com.horstmann.corejava.*;
  2.  
  3. import static java.lang.System.*;
  4.  
  5. /**
  6. * This program demonstrates the use of packages.
  7. * @version 1.11 2004-02-19
  8. * @author Cay Horstmann
  9. */
  10. public class PackageTest
  11. {
  12. public static void main(String[] args)
  13. {
  14. // because of the import statement, we don't have to use
  15. // com.horstmann.corejava.Employee here
  16. Employee harry = new Employee("Harry Hacker", , , , );
  17.  
  18. harry.raiseSalary();
  19.  
  20. // because of the static import statement, we don't have to use System.out here
  21. out.println("name=" + harry.getName() + ",salary=" + harry.getSalary());
  22. }
  23. }

程序运行结果如下:

程序4-7如下:

  1. package com.horstmann.corejava;
  2.  
  3. //这个文件中的类是这个包的一部分
  4.  
  5. import java.time.*;
  6.  
  7. //导入语句位于PACKAGE语句之后
  8.  
  9. /**
  10. * @version 1.11 2015-05-08
  11. * @author Cay Horstmann
  12. */
  13. public class Employee
  14. {
  15. private String name;
  16. private double salary;
  17. private LocalDate hireDay;
  18.  
  19. public Employee(String name, double salary, int year, int month, int day)
  20. {
  21. this.name = name;
  22. this.salary = salary;
  23. hireDay = LocalDate.of(year, month, day);
  24. }
  25.  
  26. public String getName()
  27. {
  28. return name;
  29. }
  30. public double getSalary()
  31. {
  32. return salary;
  33. }
  34.  
  35. public LocalDate getHireDay()
  36. {
  37. return hireDay;
  38. }
  39.  
  40. public void raiseSalary(double byPercent)
  41. {
  42. double raise = salary * byPercent / ;
  43. salary += raise;
  44. }
  45. }

实验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) 将两个对象的周长加总输出,将两个对象的面积加总输出。

程序如下:

import java.util.*;

public class Rectangle {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("输入长方形的长:");
Float length = in.nextFloat();
System.out.println("输入长方形的宽:");
Float width = in.nextFloat();
System.out.println("输入圆的半径:");
Float radius = in.nextFloat();
Rec l = new Rec(width, length);
Cir r = new Cir(radius);
System.out.println("矩形周长=" + l.getPerimeter() + "矩形面积=" + l.getArea());
System.out.println("圆周长=" + r.getPerimeter() + "圆面积=" + r.getArea());
float c = l.getPerimeter() + r.getPerimeter();
double s = l.getArea() + r.getArea();
System.out.println("矩形和圆的周长之和:" + c + "矩形和圆的面积之和:" + s);
}

}

class Rec {
private Float width;
private double length;

public Rec(Float w, Float l) {
width = w;
length = l;
}

public Float getPerimeter() {
Float Perimeter = (float) ((width + length) * 2);
return Perimeter;
}

public Float getArea() {
Float Area = (float) (width * length);
return Area;
}
}

class Cir {

private double radius;
double PI = 3.14;

public Cir(Float r) {
radius = r;
}

public Float getPerimeter() {
Float Perimeter = (float) (2 * PI * radius);
return Perimeter;
}

public Float getArea() {
Float Area = (float) (PI * radius * radius);
return Area;
}

}

程序运行结果如下:

实验总结:本次实验首先是编译运行程序了解文件的输入输出,在实验三的基础上,进一步使用student类编写了一个Java程序。通过本次实验,我进一步了解到对象与类的定义以及各自的特点。在之前的学习中,已经了解了几种预定义类,在这周的学习中,掌握了预定义类的使用。在实验过程中,还是遇到了很多问题,比如误将float型相加,而float型加在一起要用强制转换类型,这是因为基础知识学习不够的原因。而对于新学习的知识,有很多地方还是不明白,做实验时,也是在同学和学长的帮助下,最终才完成了实验。在以后的学习过程中,自己一一定要多练习写代码,提高自己的学习能力。

  1.  

王艳 201771010127《面向对象程序设计(Java)》第四周学习总结的更多相关文章

  1. 20145213《Java程序设计》第四周学习总结

    20145213<Java程序设计>第四周学习总结 教材学习内容总结 本周任务是学习面向对象的继承.接口以及之后的如何活用多态.(还真是路漫漫其修远兮啊!)教材也是延续上周艰深晦涩的语言风 ...

  2. 《Java程序设计》第四周学习总结

    20145224-陈颢文 <Java程序设计>第四周学习总结 教材学习内容总结 第六章 继承与多态 ·继承就是面向对象中,子类继承父类,避免重复的行为定义.重复再程序设计上是非常不好的信号 ...

  3. 20155304 2016-2017-2 《Java程序设计》第四周学习总结

    20155304 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 第六章 继承: 概念: 面向对象中,为避免多个类间重复定义共同行为.(简单说就是将相同的程序 ...

  4. 201521123038 《Java程序设计》 第四周学习总结

    201521123038 <Java程序设计> 第四周学习总结 1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 1.通过 ins ...

  5. 201521123061 《Java程序设计》第四周学习总结

    201521123061 <Java程序设计>第四周学习总结 1. 本章学习总结 (1)思维导图: --- (2)上课内容总结: 第四周学习了Java中的继承与多态,思维导图中已经给出了本 ...

  6. 20175204 张湲祯 2018-2019-2《Java程序设计》第四周学习总结

    20175204 张湲祯 2018-2019-2<Java程序设计>第四周学习总结 教材学习内容总结 -第五章子类与继承要点: -子类与父类: 1.通过使用关键字extends来定义一个类 ...

  7. 20175314 《Java程序设计》第四周学习总结

    20175314 <Java程序设计>第四周学习总结 教材学习内容总结 每个子类只能有一个父类,而一个父类可以有多个子类.可以使用关键字extends来定义一个类的子类:class 子类名 ...

  8. 20155312 张竞予 2006-2007-2 《Java程序设计》第四周学习总结

    20155312 2006-2007-2 <Java程序设计>第四周学习总结 课堂笔记 Ctrl+shift+T调出三个窗口,分别是"vi编写代码","jav ...

  9. 20165318 2017-2018-2 《Java程序设计》第四周学习总结

    20165318 2017-2018-2 <Java程序设计>第四周学习总结 IDEA安装 按照娄老师Intellj IDEA 简易教程,我下载了IDEA但是由于没有注册学校邮箱,我没办法 ...

  10. 20172325 2016-2017-2 《Java程序设计》第四周学习总结

    20172325 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 1.对类.对象.声明变量的定义和属性有了进一步的了解 2.学会如何编写一个类并运用到需要的程 ...

随机推荐

  1. Struts2深入之动态调用Action

    使用过Struts2的小伙伴们应该知道当我们的action的方法过多是如果需要通过Struts2框架进行运行,我们就必须在Struts2的配置文件Struts2.xml文件中配置多个action属性标 ...

  2. NodeJs mysql 开启事务

    如题:node后台使用mysql数据库,并使用事务来管理数据库操作. 这里主要讲一个事务的封装并写了一个INSERT 插入操作. code: 基础code: db.config.js const my ...

  3. HTML(标题/图片/链接/列表标签)

    <!DOCTYPE html> 声明 <!DOCTYPE html> 是 html5 标准网页声明,全称为 Document Type HyperText Mark-up La ...

  4. HBase Filter 过滤器之RowFilter详解

    前言:本文详细介绍了HBase RowFilter过滤器Java&Shell API的使用,并贴出了相关示例代码以供参考.RowFilter 基于行键进行过滤,在工作中涉及到需要通过HBase ...

  5. 如何用Hexo搭建个人博客

    以前用Wordpress搭建过一个博客网站,Wordpress虽然安装简单,功能强大,但是对于个人建站来说有点复杂了.最近发现用Hexo建站很流行,于是将网站从Wordpress迁移到了Hexo. H ...

  6. centos8-django项目部署 nginx+uwsgi

    1.虚拟环境virtualenv安装 1.安装virtualenv pip3 install virtualenv 2.创建目录,把项目文件传过来 mkdir My cd My 3.创建独立运行环境- ...

  7. 【认证与授权】Spring Security自定义页面

    在前面的篇幅中,我们对认证和授权流程大致梳理了一遍.在这个过程中我们一直都是使用系统生成的默认页面,登录成功后也是直接调转到根路径页面.而在实际的开发过程中,我们是需要自定义登录页面的,有时还会添加各 ...

  8. 步入LTE、多址技术

    LTE系统的主要性能和目标 与3G相比,LTE主要性能特性: 带宽灵活配置:支持1.4MHz, 3MHz, 5MHz, 10Mhz, 15Mhz, 20MHz 峰值速率(20MHz带宽):下行100M ...

  9. EChart将timeline图标设置为加号

    一 要实现的效果 二 官方文档 看一下官方文档上,替换symbol的描述: timeline.symbol string [ default: 'emptyCircle' ] timeline标记的图 ...

  10. Codeforces Round #635C Linova and Kingdom 思维

    Linova and Kingdom 题意 现在有一颗n个节点的树,每个节点是一个城市,现在要选出k个城市作为工业城市,其他城市作为旅游城市,现在每个工业城市要派出一名特使前往根节点,每个特使的幸福度 ...