201871010134-周英杰《面向对象程序设计(java)》第七周学习总结

项目 内容
这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/
这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/11654436.html
作业学习目标
  1. 掌握四种访问权限修饰符的使用特点;
  2. 掌握Object类的用途及常用API;
  3. 掌握ArrayList类的定义方法及用途;
  4. 掌握枚举类定义方法及用途;
  5. 结合本章实验内容,理解继承与多态性两个面向对象程序设计特征,并体会其优点。

一、实验内容和步骤

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

代码:

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

结果:

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

测试程序1:

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

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

测试程序2:

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

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

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

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

测试程序3:

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

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

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

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

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

 public class TestVarArgus {
public static void dealArray(int... intArray){
for (int i : intArray)
System.out.print(i +" "); System.out.println();
}
public static void main(String args[]){
dealArray();
dealArray(1);
dealArray(1, 2, 3);
}
}

测试程序1

代码:

 1 public class EqualsTest
2 {
3 public static void main(String[] args)
4 {
5 var alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
6 var alice2 = alice1;
7 var alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
8 var bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);
9
10 System.out.println("alice1 == alice2: " + (alice1 == alice2));
11
12 System.out.println("alice1 == alice3: " + (alice1 == alice3));
13
14 System.out.println("alice1.equals(alice3): " + alice1.equals(alice3));
15
16 System.out.println("alice1.equals(bob): " + alice1.equals(bob));
17
18 System.out.println("bob.toString(): " + bob);
19
20 var carl = new Manager("Carl Cracker", 80000, 1987, 12, 15);
21 var boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
22 boss.setBonus(5000);
23 System.out.println("boss.toString(): " + boss);
24 System.out.println("carl.equals(boss): " + carl.equals(boss));
25 System.out.println("alice1.hashCode(): " + alice1.hashCode());
26 System.out.println("alice3.hashCode(): " + alice3.hashCode());
27 System.out.println("bob.hashCode(): " + bob.hashCode());
28 System.out.println("carl.hashCode(): " + carl.hashCode());
29 }
30 }
 1 package zyj;
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 var other = (Employee) otherObject;
53 return false;
54 }
55
56 public int hashCode()
57 {
58 return Objects.hash(name, salary, hireDay);
59 }
60
61 public String toString()
62 {
63 return getClass().getName() + "[name=" + name + ",salary=" + salary + ",hireDay="
64 + hireDay + "]";
65 }
66 }
 1 package zyj;
2
3 public class Manager extends Employee
4 {
5 private double bonus;
6
7 public Manager(String name, double salary, int year, int month, int day)
8 {
9 super(name, salary, year, month, day);
10 bonus = 0;
11 }
12
13 public double getSalary()
14 {
15 double baseSalary = super.getSalary();
16 return baseSalary + bonus;
17 }
18
19 public void setBonus(double bonus)
20 {
21 this.bonus = bonus;
22 }
23
24 }

结果:

1)Object类是所有Java类的祖先。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法在不明确给出超类的情况下,java会自动把object作为要定义类的超类。

2)可以使用类型为object的变量指向任意类型的对象。

3)object类有一个默认构造方法public object(),在构造子类时,都会先调用这个默认构造方法。

测试程序2:

代码:

 1 import java.util.*;
2
3 /**
4 * This program demonstrates the ArrayList class.
5 * @version 1.11 2012-01-26
6 * @author Cay Horstmann
7 */
8 public class ArrayListTest//主类
9 {
10 public static void main(String[] args)
11 {
12 //用三个Employee类填充staff数组列表
13 ArrayList<Employee> staff = new ArrayList<>();//动态数组,可以灵活设置数组的大小
14
15 staff.add(new Employee("Carl Cracker", 75000, 1987, 12, 15));
16 staff.add(new Employee("Harry Hacker", 50000, 1989, 10, 1));
17 staff.add(new Employee("Tony Tester", 40000, 1990, 3, 15));
18
19 //将每个人的薪水提高5%
20 for (Employee e : staff)
21 e.raiseSalary(5);
22
23 //打印出所有Employee类的信息
24 for (Employee e : staff)
25 System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay="
26 + e.getHireDay());
27 }
28 }
 1 import java.time.*;
2
3 public class Employee
4 {
5 private String name;
6 private double salary;
7 private LocalDate hireDay;
8 //创建三个私有属性
9 public Employee(String name, double salary, int year, int month, int day)//构造器
10 {
11 this.name = name;
12 this.salary = salary;
13 hireDay = LocalDate.of(year, month, day);
14 }
15
16 public String getName()
17 {
18 return name;
19 }
20
21 public double getSalary()
22 {
23 return salary;
24 }
25
26 public LocalDate getHireDay()
27 {
28 return hireDay;
29 }
30 //访问器
31 public void raiseSalary(double byPercent)
32 {
33 double raise = salary * byPercent / 100;
34 salary += raise;
35 }//定义两个局部变量
36 }

结果:

ArrayList 即动态数组,它可以动态的增加和减少元素,灵活设置数组的大小。

ArrayList提供了三个构造器: 
public ArrayList(); 默认的构造器
public ArrayList(ICollection); 
public ArrayList(int); 用指定的大小来初始化内部的数组

测试程序3:

实验代码:

 1 import java.util.*;
2
3 /**
4 * This program demonstrates enumerated types.
5 * @version 1.0 2004-05-24
6 * @author Cay Horstmann
7 */
8 public class EnumTest//主类
9 {
10 public static void main(String[] args)
11 {
12 Scanner in = new Scanner(System.in);
13 System.out.print("Enter a size: (SMALL, MEDIUM, LARGE, EXTRA_LARGE) ");
14 String input = in.next().toUpperCase();//字符串转换为大写
15 Size size = Enum.valueOf(Size.class, input);
16 System.out.println("size=" + size);
17 System.out.println("abbreviation=" + size.getAbbreviation());
18 if (size == Size.EXTRA_LARGE)
19 System.out.println("Good job--you paid attention to the _.");
20 }
21 }
22
23 enum Size//枚举类型(都是enum的子类)
24 {
25 SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");//传入参数
26
27 private Size(String abbreviation) { this.abbreviation = abbreviation; }
28 public String getAbbreviation() { return abbreviation; }
29
30 private String abbreviation;
31 }

结果:

创建枚举类型要使用 Enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类。

枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰。

枚举类的使用private final 修饰的属性应该在构造器中为其赋值。
若枚举类显式的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数。
测试程序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 }

结果:

输出字符串

代码:

 1 public class TestVarArgus {
2 public static void dealArray(String... StringArray){ //定义为字符串,在下面就只能输入字符串,不能输入其他的,例如整型等等
3 for (String string : StringArray)
4 System.out.print(string +" ");
5
6 System.out.println();
7 }
8 public static void main(String args[]){
9 dealArray("计算机与工程学院");
10 dealArray("计算机科学与技术一班");
11 dealArray("周英杰");
12 }
13 }

结果:

实验:3:编程练习:参照输出样例补全程序,使程序输出结果与输出样例一致。

 public class Demo {

 public static void main(String[] args) {

 Son son = new Son();

 son.method();

 }

 }

 class Parent {

 Parent() {

 System.out.println("Parent's Constructor without parameter");

 }

 Parent(boolean b) {

 System.out.println("Parent's Constructor with a boolean parameter");

 }

 public void method() {

 System.out.println("Parent's method()");

 }

 }

 class Son extends Parent {

 //补全本类定义

 }

结果:

Parent's Constructor with a boolean parameter

Son's Constructor without parameter

Son's method()

Parent's method()

代码:

 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 Son(){
21 super(false);
22 System.out.println("Son's Constructor without parameter");
23 }
24 public void method() {
25 System.out.println("Son's method()");
26 super.method();
27 }
28 }

结果:

二、实验总结

通过这几周的学习,对继承类、抽象类以及多态有了大致的了解。但是后面的好多内容,好比枚举类等新知识,在学习理论知识时,掌握的本身就不太清楚。实验过程中就觉得自己太难了,感觉这门语言“玉女无瓜”。好在在做测试题的时候,那些结果吸引了我的兴趣,所以最终还是有恃无恐的把他搞完了(虽然有点烂)。对于编程题,那可是一窍不通,但是还是在我的刻苦拼命地不懈追求下,使出浑身解数,最终完美收工。

201871010134-周英杰《面向对象程序设计(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. Jupyter notebook and Octave kernel installation

    Jupyter notebook 安装 为了更加方便地写 Python 代码,还需要安装 Jupyter notebook. 利用 pip 安装 Jupyter notebook. 为什么要使用 Ju ...

  2. LeetCode 62. Unique Paths不同路径 (C++/Java)

    题目: A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). ...

  3. 20191031 牛客网CSP-S Round2019-2

    花了 \(50min\) 打了 \(130\) 分的暴力... T2想到正解之后开始 VP CF了...

  4. 42 在Raspberry Pi上安装dlib表情识别

    https://www.jianshu.com/p/848014d8dea9 https://www.pyimagesearch.com/2017/05/01/install-dlib-raspber ...

  5. 《Java多线程设计模式》学习

    还是别人的笔记比较详细: https://segmentfault.com/blog/ressmix_multithread?page=3 mark.

  6. 机器学习之KNN

    KNN做回归和分类的主要区别在于最后做预测时候的决策方式不同.KNN做分类预测时,一般是选择多数表决法,即训练集里和预测的样本特征最近的K个样本,预测为里面有最多类别数的类别.而KNN做回归时,一般是 ...

  7. 近似计算一个对象在js占用内存

    内存 在很久之前,我就想查看一个对象在JS里占用多少内存了,直到最近由于线上使用了需要计算从服务端传输数据的大小,让这个需求尤为强烈. 预备知识 我们现在使用的js是高级语言,它在内存细节之上建立一个 ...

  8. Springboot使用ehcache缓存

    本文部分步骤继承于springboot使用cache缓存,如果有不清楚的,请移驾springboot使用cache缓存 ehcache是一种广泛使用的开源Java分布式缓存.主要面向通用缓存,Java ...

  9. 《Linux内核原理与分析》教学进程

    目录 2019-2020-1 <Linux内核原理与分析>教学进程 考核方案 第一周: 第二周: 第三周: 第四周: 第五周 第六周 第七周: 第八周 第九周 第十周 第十一周: 第十二周 ...

  10. 使用Docker搭建HttpRunnerManager环境

    建立一个HttpRunnerManager的环境需要Mysql,RabbitMQ服务,为简单部署,全部使用Docker 1. 在服务器建立Docker环境 2.建立Mysql容器 docker run ...