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

Posted dlzyj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了201871010134-周英杰《面向对象程序设计(java)》第七周学习总结相关的知识,希望对你有一定的参考价值。

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:录入以下代码,结合程序运行结果了解方法的可变参数用法

 

 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

代码:

技术图片
 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:编程练习:参照输出样例补全程序,使程序输出结果与输出样例一致。

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

结果:

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)》第七周学习总结的主要内容,如果未能解决你的问题,请参考以下文章

王燕 201771010126《面向对象程序设计(java)》第一周学习总结

20182324 2019-2020-1 《数据结构与面向对象程序设计》第4周学习总结

《数据结构与面向对象程序设计》第01周学习总结

杨玲 201771010133《面向对象程序设计(java)》第五周学习总结

2018面向对象程序设计(Java)第18周学习指导及要求

20182323 2019-2020-1 《数据结构与面向对象程序设计》第4周学习总结