项目

内容

这个作业属于哪个课程

https://www.cnblogs.com/nwnu-daizh/

这个作业的要求在哪里

https://www.cnblogs.com/nwnu-daizh/p/11435127.html

作业学习目标

  1. 掌握四种访问权限修饰符的使用特点;
  2. 掌握Object类的用途及常用API;
  3. 掌握ArrayList类的定义方法及用途;
  4. 掌握枚举类定义方法及用途;
  5. 结合本章实验内容,理解继承与多态性两个面向对象程序设计特征,并体会其优点。

实验六 Object类、ArrayList类与枚举类

实验时间 2019-10-11

1、实验目的与要求

(1) 掌握四种访问权限修饰符的使用特点;

(2) 掌握Object类的用途及常用API;

(3) 掌握ArrayList类的定义方法及用法;

(4)掌握枚举类定义方法及用途;

(5)结合本章实验内容,理解继承与多态性两个面向对象程序设计特征,并体会其优点。

2、实验内容和步骤

实验1: 在“System.out.println(...);”语句处按注释要求设计代码替换...,观察代码录入中IDE提示,以验证四种权限修饰符的用法。

  1. package hello;
  2.  
  3. class Parent {
  4. private String p1 = "这是Parent的私有属性";
  5. public String p2 = "这是Parent的公有属性";
  6. protected String p3 = "这是Parent受保护的属性";
  7. String p4 = "这是Parent的默认属性";
  8. private void pMethod1() {
  9. System.out.println("我是Parent用private修饰符修饰的方法");
  10. }
  11. public void pMethod2() {
  12. System.out.println("我是Parent用public修饰符修饰的方法");
  13. }
  14. protected void pMethod3() {
  15. System.out.println("我是Parent用protected修饰符修饰的方法");
  16. }
  17. void pMethod4() {
  18. System.out.println("我是Parent无修饰符修饰的方法");
  19. }
  20. }
  21. class Son extends Parent{
  22. private String s1 = "这是Son的私有属性";
  23. public String s2 = "这是Son的公有属性";
  24. protected String s3 = "这是Son受保护的属性";
  25. String s4 = "这是Son的默认属性";
  26. public void sMethod1() {
  27. System.out.println(p2);
  28. System.out.println(p3);
  29. System.out.println(p4);
  30. //分别尝试显示Parent类的p1、p2、p3、p4值
  31. System.out.println("我是Son用public修饰符修饰的方法");
  32. }
  33. private void sMethod2() {
  34. System.out.println("我是Son用private修饰符修饰的方法");
  35. }
  36. protected void sMethod() {
  37. System.out.println("我是Son用protected修饰符修饰的方法");
  38. }
  39. void sMethod4() {
  40. System.out.println("我是Son无修饰符修饰的方法");
  41. }
  42. }
  43. public class multiplication {
  44. public static void main(String[] args) {
  45. Parent parent=new Parent();
  46. Son son=new Son();
  47. //System.out.println();
  48. parent.pMethod2();//用parent调用parent类的方法
  49. parent.pMethod3();//
  50. parent.pMethod4();//
  51. son.sMethod1();//用son调用son类的方法
  52. son.sMethod4();
  53. son.sMethod();
  54. son.pMethod2();//用son类调用parent类的方法
  55. son.pMethod4();
  56. son.pMethod3();
  57. }
  58. }

输出结果:

实验2:导入第5章以下示例程序,测试并进行代码注释。

测试程序1:

l  运行教材程序5-8、5-9、5-10,结合程序运行结果理解程序(教材174页-177页);

l  删除程序中Employee类、Manager类中的equals()、hasCode()、toString()方法,背录删除方法,在代码录入中理解类中重写Object父类方法的技术要点。

5-8

  1. package equals;
  2.  
  3. /**
  4. * This program demonstrates the equals method.
  5. * @version 1.12 2012-01-26
  6. * @author Cay Horstmann
  7. */
  8. public class EqualsTest
  9. {
  10. public static void main(String[] args)
  11. {
  12. Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
  13. Employee alice2 = alice1;
  14. Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
  15. Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);
  16.  
  17. System.out.println("alice1 == alice2: " + (alice1 == alice2));
  18.  
  19. System.out.println("alice1 == alice3: " + (alice1 == alice3));
  20.  
  21. System.out.println("alice1.equals(alice3): " + alice1.equals(alice3));
  22.  
  23. System.out.println("alice1.equals(bob): " + alice1.equals(bob));
  24.  
  25. System.out.println("bob.toString(): " + bob);
  26.  
  27. Manager carl = new Manager("Carl Cracker", 80000, 1987, 12, 15);
  28. Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
  29. boss.setBonus(5000);
  30. System.out.println("boss.toString(): " + boss);
  31. System.out.println("carl.equals(boss): " + carl.equals(boss));
  32. System.out.println("alice1.hashCode(): " + alice1.hashCode());
  33. System.out.println("alice3.hashCode(): " + alice3.hashCode());
  34. System.out.println("bob.hashCode(): " + bob.hashCode());
  35. System.out.println("carl.hashCode(): " + carl.hashCode());
  36. }
  37. }
  1. 5-9
    package equals;
  2.  
  3. import java.time.*;
  4. import java.util.Objects;
  5.  
  6. public class Employee
  7. {
  8. private String name;
  9. private double salary;
  10. private LocalDate hireDay;
  11.  
  12. public Employee(String name, double salary, int year, int month, int day)
  13. {
  14. this.name = name;
  15. this.salary = salary;
  16. hireDay = LocalDate.of(year, month, day);
  17. }
  18.  
  19. public String getName()
  20. {
  21. return name;
  22. }
  23.  
  24. public double getSalary()
  25. {
  26. return salary;
  27. }
  28.  
  29. public LocalDate getHireDay()
  30. {
  31. return hireDay;
  32. }
  33.  
  34. public void raiseSalary(double byPercent)
  35. {
  36. double raise = salary * byPercent / 100;
  37. salary += raise;
  38. }
  39.  
  40. public boolean equals(Object otherObject)
  41. {
  42. // a quick test to see if the objects are identical
  43. if (this == otherObject) return true;
  44.  
  45. // must return false if the explicit parameter is null
  46. if (otherObject == null) return false;
  47.  
  48. // if the classes don't match, they can't be equal
  49. if (getClass() != otherObject.getClass()) return false;
  50.  
  51. // now we know otherObject is a non-null Employee
  52. Employee other = (Employee) otherObject;
  53.  
  54. // test whether the fields have identical values
  55. return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);
  56. }
  57.  
  58. public int hashCode()
  59. {
  60. return Objects.hash(name, salary, hireDay);
  61. }
  62.  
  63. public String toString()
  64. {
  65. return getClass().getName() + "[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay
  66. + "]";
  67. }
  68. }

5-10

  1. package equals;
  2.  
  3. import java.time.*;
  4. import java.util.Objects;
  5.  
  6. public class Employee
  7. {
  8. private String name;
  9. private double salary;
  10. private LocalDate hireDay;
  11.  
  12. public Employee(String name, double salary, int year, int month, int day)
  13. {
  14. this.name = name;
  15. this.salary = salary;
  16. hireDay = LocalDate.of(year, month, day);
  17. }
  18.  
  19. public String getName()
  20. {
  21. return name;
  22. }
  23.  
  24. public double getSalary()
  25. {
  26. return salary;
  27. }
  28.  
  29. public LocalDate getHireDay()
  30. {
  31. return hireDay;
  32. }
  33.  
  34. public void raiseSalary(double byPercent)
  35. {
  36. double raise = salary * byPercent / 100;
  37. salary += raise;
  38. }
  39.  
  40. public boolean equals(Object otherObject)
  41. {
  42. // a quick test to see if the objects are identical
  43. if (this == otherObject) return true;
  44.  
  45. // must return false if the explicit parameter is null
  46. if (otherObject == null) return false;
  47.  
  48. // if the classes don't match, they can't be equal
  49. if (getClass() != otherObject.getClass()) return false;
  50.  
  51. // now we know otherObject is a non-null Employee
  52. Employee other = (Employee) otherObject;
  53.  
  54. // test whether the fields have identical values
  55. return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);
  56. }
  57.  
  58. public int hashCode()
  59. {
  60. return Objects.hash(name, salary, hireDay);
  61. }
  62.  
  63. public String toString()
  64. {
  65. return getClass().getName() + "[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay
  66. + "]";
  67. }
  68. }

运行结果

总结:Object是所有类的父类,它有很多类对象会用到的方法,例如比较常用的toString 、equals,当你新建xx类时,你可以重写Object已经定义的方法,也可以直接调用Object中的方法,如果你写一个封装的方法,不确定传进来的是什么类型的值,就可以使用Object作为一个笼统类。

测试程序2:

在elipse IDE中调试运行程序5-11(教材182页),结合程序运行结果理解程序;

掌握ArrayList类的定义及用法;

在程序中相关代码处添加新知识的注释;

设计适当的代码,测试ArrayList类的set()、get()、remove()、size()等方法的用法。

  1. package arrayList;
  2.  
  3. import java.util.*;
  4.  
  5. /**
  6. * This program demonstrates the ArrayList class.
  7. * @version 1.11 2012-01-26
  8. * @author Cay Horstmann
  9. */
  10. public class ArrayListTest
  11. {
  12. public static void main(String[] args)
  13. {
  14. // fill the staff array list with three Employee objects
  15. ArrayList<Employee> staff = new ArrayList<>();
  16.  
  17. staff.add(new Employee("Carl Cracker", 75000, 1987, 12, 15));
  18. staff.add(new Employee("Harry Hacker", 50000, 1989, 10, 1));
  19. staff.add(new Employee("Tony Tester", 40000, 1990, 3, 15));
  20.  
  21. // 把每个员工的薪资提高5%
  22. for (Employee e : staff)
  23. e.raiseSalary(5);
  24.  
  25. //打印所有雇员对象的信息
  26. for (Employee e : staff)
  27. System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay="
  28. + e.getHireDay());
  29. }
  30. }

运行结果:

设计适当的代码,测试ArrayList类的set()、get()、remove()、size()等方法的用法

  1. package arrayList;
  2.  
  3. import java.util.*;
  4.  
  5. /**
  6. * This program demonstrates the ArrayList class.
  7. * @version 1.11 2012-01-26
  8. * @author Cay Horstmann
  9. */
  10. public class ArrayListTest
  11. {
  12. public static void main(String[] args)
  13. {
  14. // 用三个Employee对象填充staff数组列表
  15. var staff = new ArrayList<Employee>();
  16.  
  17. staff.add(new Employee("Carl Cracker", 75000, 1987, 12, 15));
  18. staff.add(new Employee("Harry Hacker", 50000, 1989, 10, 1));
  19. staff.add(new Employee("Tony Tester", 40000, 1990, 3, 15));
  20.  
  21. System.out.println(staff.get(1));
  22. staff.set(1, new Employee("liyansong", 20000, 2018, 10, 10));
  23. System.out.println(staff.size());
  24. staff.remove(2);
  25.  
  26. // 把每个人的薪水提高5%
  27. for (Employee e : staff)
  28. e.raiseSalary(5);
  29.  
  30. // 打印所有Employee对象的信息
  31. for (Employee e : staff)
  32. System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay="
  33. + e.getHireDay());
  34. }
  35. }

测试结果:

总结:ArrayList就是传说中的动态数组,动态的增加和减少元素 ,ArrayList内部封装了一个Object类型的数组,从一般的意义来说,它和数组没有本质的差别,

并且可以灵活的设置数组的大小。

测试程序3:

编辑、编译、调试运行程序5-12(教材189页),结合运行结果理解程序;

掌握枚举类的定义及用法;

在程序中相关代码处添加新知识的注释;

删除程序中Size枚举类,背录删除代码,在代码录入中掌握枚举类的定义要求。

5-12

  1. package enums;
  2.  
  3. import java.util.*;
  4.  
  5. /**
  6. * This program demonstrates enumerated types.
  7. * @version 1.0 2004-05-24
  8. * @author Cay Horstmann
  9. */
  10. public class EnumTest
  11. {
  12. public static void main(String[] args)
  13. {
  14. var in = new Scanner(System.in);
  15. System.out.print("Enter a size: (SMALL, MEDIUM, LARGE, EXTRA_LARGE) ");
  16. String input = in.next().toUpperCase();
  17. Size size = Enum.valueOf(Size.class, input);
  18. System.out.println("size=" + size);
  19. System.out.println("abbreviation=" + size.getAbbreviation());
  20. if (size == Size.EXTRA_LARGE)
  21. System.out.println("Good job--you paid attention to the _.");
  22. }
  23. }
  24.  
  25. enum Size
  26. {
  27. SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");
  28.  
  29. private Size(String abbreviation) { this.abbreviation = abbreviation; }
  30. public String getAbbreviation() { return abbreviation; }
  31.  
  32. private String abbreviation;
  33. }
  34.  
  35. 运行结果:

总结:枚举是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁,安全性以及便捷性。创建枚举类型要使用enum关键字,隐含了所创建的类型都是java.lang.Enum类的子类(java.lang.Enum是一个抽象类)。

测试程序4:录入以下代码,结合程序运行结果了解方法的可变参数用法:

代码:

  1. public class TestVarArgus {
  2. public static void dealArray(int... intArray){
  3. for (int i : intArray)
  4. System.out.print(i +" ");
  5.  
  6. System.out.println();
  7. }
  8. public static void main(String args[]){
  9. dealArray();
  10. dealArray(1);
  11. dealArray(1, 2, 3);
  12. }
  13. }

运行结果:

实验:3:编程练习:参照输出样例

  1. public class Demo {
  2. public static void main(String[] args) {
  3. Son son = new Son();
  4. son.method();
  5. }
  6. }
  7. class Parent {
  8. Parent() {
  9. System.out.println("Parent's Constructor without parameter");
  10. }
  11. Parent(boolean b) {
  12. System.out.println("Parent's Constructor with a boolean parameter");
  13. }
  14. public void method() {
  15. System.out.println("Parent's method()");
  16. }
  17. }
  18. class Son extends Parent {
  19. //补全本类定义
  20. }

补全程序,使程序输出结果与输出样例一致。

程序运行结果如下:

Parent's Constructor with a boolean parameter

Son's Constructor without parameter

Son's method()

Parent's method()

补全代码:

  1. package enums;
  2. public class Demo {
  3. public static void main(String[] args) {
  4. Son son = new Son();
  5. son.method();
  6. }
  7. }
  8. class Parent {
  9. Parent() {
  10. System.out.println("Parent's Constructor without parameter");
  11. }
  12. Parent(boolean b) {
  13. System.out.println("Parent's Constructor with a boolean parameter");
  14. }
  15. public void method() {
  16. System.out.println("Parent's method()");
  17. }
  18. }
  19. class Son extends Parent {
  20. Son()
  21. {
  22. super(true);
  23. }
  24. public void method() {
  25. System.out.println("Son's Constructor without parameter");
  26. System.out.println("Son's method()");
  27. super.method();
  28. //补全本类定义
  29. }
  30. }

运行结果:

第三部分:总结

通过这周的实验,使我更进一步的理解了继承的相关知识,尤其是对四种权限修饰符的理解,还有Object类的常用API用法;ArrayList类用法与常用API,枚举类使用方法;在本章知识中,继承与多态性两个面向对象程序设计特征,利用已掌握Java语言程序设计知识,通过一次一次的练习,我觉得阅读已有的代码,理解其中的方法,并将其转化为自己的知识,是一种很重要的能力,编程没有捷径,只有不断地训练。

201871010114-李岩松《面向对象程序设计(java)》第七周学习总结的更多相关文章

  1. 201771010134杨其菊《面向对象程序设计java》第九周学习总结

                                                                      第九周学习总结 第一部分:理论知识 异常.断言和调试.日志 1.捕获 ...

  2. 扎西平措 201571030332《面向对象程序设计 Java 》第一周学习总结

    <面向对象程序设计(java)>第一周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 ...

  3. 201871010132-张潇潇《面向对象程序设计(java)》第一周学习总结

    面向对象程序设计(Java) 博文正文开头 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cn ...

  4. 杨其菊201771010134《面向对象程序设计Java》第二周学习总结

    第三章 Java基本程序设计结构 第一部分:(理论知识部分) 本章主要学习:基本内容:数据类型:变量:运算符:类型转换,字符串,输入输出,控制流程,大数值以及数组. 1.基本概念: 1)标识符:由字母 ...

  5. 201871010124 王生涛《面向对象程序设计JAVA》第一周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://edu.cnblogs.com/campus/xbsf/ ...

  6. 201871010115——马北《面向对象程序设计JAVA》第二周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  7. 201777010217-金云馨《面向对象程序设计(Java)》第二周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  8. 201871010132——张潇潇《面向对象程序设计JAVA》第二周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  9. 201771010123汪慧和《面向对象程序设计Java》第二周学习总结

    一.理论知识部分 1.标识符由字母.下划线.美元符号和数字组成, 且第一个符号不能为数字.标识符可用作: 类名.变量名.方法名.数组名.文件名等.第二部分:理论知识学习部分 2.关键字就是Java语言 ...

  10. 201521123061 《Java程序设计》第七周学习总结

    201521123061 <Java程序设计>第七周学习总结 1. 本周学习总结 2. 书面作业 ArrayList代码分析 1.1 解释ArrayList的contains源代码 贴上源 ...

随机推荐

  1. asp.net core 腾讯验证码的接入

    asp.net core 腾讯验证码的接入 Intro 之前使用的验证码服务是用的极验验证,而且是比较旧的,好久之前接入的,而且验证码服务依赖 Session,有点不太灵活,后来发现腾讯也有验证码服务 ...

  2. 一个“Hello World”理解JVM运行时数据区

    先上一张JVM体系结构图: 1)运行时数据区:经过编译生成的字节码文件(class文件),由class loader(类加载子系统)加载后交给执行引擎执行.在执行引擎执行的过程中产生的数据会存储在一块 ...

  3. RF自定义库和关键字

    1:在D:\work_software\python\Lib\site-packages 文件夹下, 新建python package文件夹 ,例如我的是TestLibrary 建好后的完整路径:D: ...

  4. 经典的Redis的主从复制搭建

    ##### 配置服务器   1).打开redis.conf文件修改 bind 指定的ip地址: ![image](https://img2018.cnblogs.com/blog/1334966/20 ...

  5. python-Flask模版注入攻击SSTI(python沙盒逃逸)

    一篇以python Flask 模版渲染为例子的SSTI注入教学~ 0x01 Flask使用和渲染 这里简化了flask使用和渲染的教程 只把在安全中我们需要关注的部分写出来 来一段最简单的FLASK ...

  6. 懒要懒到底,能自动的就不要手动,Hibernate正向工程完成Oracle数据库到MySql数据库转换(含字段转换、注释)

    需求描述 需求是这样的:因为我们目前的一个老项目是Oracle数据库的,这个库呢,数据库是没有注释的,而且字段名和表名都是大写风格,比如 在代码层面的po呢,以前也是没有任何注释的,但是经过这些年,大 ...

  7. 《Java并发编程实战》读书笔记-第一部分 基础知识小结

    并发技巧清单 可变状态是至关重要的 所有的并发问题都可以归结为如何协调对并发状态的访问.可变状态越少,就越容易确保线程安全性. 尽量将域声明为final类型,除非需要它们是可变的. 不可变对象一定是线 ...

  8. LeetCode初级算法--动态规划01:爬楼梯

    LeetCode初级算法--动态规划01:爬楼梯 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...

  9. python学习-类的继承

    1.继承的语法 2.多继承 3.override(子类重写父类的方法) 4.子类调用父类中被重写的实例方法 5.使用super函数调用父类的构造方法

  10. 学习Spring的思考框架

    引子 很早之前听同事说:“要开会了.我都知道领导要问什么,就那几板斧.”其实领导之所以为领导,人家问的问题确实很合情合理,甚至可以说一针见血.而之所以能问出来这些合理的问题,就是因为头脑中有自己的思考 ...