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. 201871010113-刘兴瑞《面向对象程序设计(java)》第六-七周学习总结

    项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>htt ...

  2. [C10] 异常检测(Anomaly Detection)

    异常检测(Anomaly Detection) 问题的动机 (Problem Motivation) 异常检测(Anomaly detection)问题是机器学习算法中的一个常见应用.这种算法的有趣之 ...

  3. SpringBoot(十八)_springboot打成war包部署

    最近在做项目的时候,由于使用的是springboot,需要打成war包.我就按照正常的思路去打包,结果部署后无法访问,一直报错404.后续问了问 公司同事,他给解决了.说大部分都是这个原因. 如果需要 ...

  4. java jvm虚拟机类加载过程

    加载 在加载阶段, 虚拟机需要完成以下3件事情:1) 通过一个类的全限定名来获取定义此类的二进制字节流.2) 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构.3) 在内存中生成一个代表这 ...

  5. goroutine使用

    Goroutine是建立在线程之上的轻量级的抽象.它允许我们以非常低的代价在同一个地址空间中并行地执行多个函数或者方法.相比于线程,它的创建和销毁的代价要小很多,并且它的调度是独立于线程的.在gola ...

  6. git 关联vs code

    {     "window.zoomLevel": 1,     "editor.fontSize": 15,     "gitlens.advanc ...

  7. 关于一个.2lf和.2f的战争!(貌似书上错了,静待打脸。)

    在山东理工oj上做题,谈到了输入数据... double i: scanf(“%lf”,&i): 谨记呀,lf时,可以输入任何类型的数据,而.2f,只能输入符合其规格的数据. 再谈输出,dou ...

  8. ES2019 的新特性

    JavaScript 不断演变,每次迭代都会得到一些新的内部更新.让我们来看看 ES2019 有哪些新的特性,并加入到我们日常开发中 Array.prototype.flat() Array.prot ...

  9. Eclipse左侧的工程目录消失解决办法

    菜单栏window---->show view--->other--->project explorer

  10. vue数据更改视图不更新问题----深入响应式原理

    Vue响应式原理之官方解释 当你把一个普通的JavaScript对象传给Vue实例的data选项,Vue将遍历此对象所有的属性,并使用Object.defineProperty把这些属性全部转为get ...