201871010106-丁宣元 《面向对象程序设计(java)》第七周学习总结

正文开头:

项目

内容

这个作业属于哪个课程

https://home.cnblogs.com/u/nwnu-daizh/

这个作业的要求在哪里

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

作业学习目标

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

正文内容:

实验内容和步骤:

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

代码:

class Parent {
private String p1 = "这是Parent的私有属性";
public String p2 = "这是Parent的公有属性";
protected String p3 = "这是Parent受保护的属性";
String p4 = "这是Parent的默认属性";
private void pMethod1() {
System.out.println("我是Parent用private修饰符修饰的方法");
}
public void pMethod2() {
System.out.println("我是Parent用public修饰符修饰的方法");
}
protected void pMethod3() {
System.out.println("我是Parent用protected修饰符修饰的方法");
}
void pMethod4() {
System.out.println("我是Parent无修饰符修饰的方法");
}
}
class Son extends Parent{
private String s1 = "这是Son的私有属性";
public String s2 = "这是Son的公有属性";
protected String s3 = "这是Son受保护的属性";
String s4 = "这是Son的默认属性";
public void sMethod1() {
System.out.println(p2);//p1无法打印,因为是私有属性
System.out.println(p3);
System.out.println(p4);//分别尝试显示Parent类的p1、p2、p3、p4值
System.out.println("我是Son用public修饰符修饰的方法");
}
private void sMethod2() {
System.out.println("我是Son用private修饰符修饰的方法");
}
protected void sMethod() {
System.out.println("我是Son用protected修饰符修饰的方法");
}
void sMethod4() {
System.out.println("我是Son无修饰符修饰的方法");
}
}
public class Demo {
public static void main(String[] args) {
Parent parent=new Parent();
Son son=new Son();
parent.pMethod2();
parent.pMethod3();
parent.pMethod4();//分别尝试用parent调用Parent类的方法
son.sMethod();//用son调用Son类的方法
son.sMethod1();
son.sMethod4();//son.sMethod2()是private,只能在son类中使用
}
}

结果:

注:protected和friendly都只能访问同一个包中的,但protected权限更大些,可访问不同包,但必须是子类继承父类。

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

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

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

1.程序代码

5-8EqualsTest.java

package equals;

/**
* This program demonstrates the equals method.
* @version 1.12 2012-01-26
* @author Cay Horstmann
*/
public class EqualsTest //主类
{
public static void main(String[] args)
{
var alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
var alice2 = alice1;
var alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
var bob = new Employee("Bob Brandson", 50000, 1989, 10, 1); System.out.println("alice1 == alice2: " + (alice1 == alice2)); System.out.println("alice1 == alice3: " + (alice1 == alice3)); System.out.println("alice1.equals(alice3): " + alice1.equals(alice3)); System.out.println("alice1.equals(bob): " + alice1.equals(bob)); System.out.println("bob.toString(): " + bob); var carl = new Manager("Carl Cracker", 80000, 1987, 12, 15);
var boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
boss.setBonus(5000);
System.out.println("boss.toString(): " + boss);
System.out.println("carl.equals(boss): " + carl.equals(boss));
System.out.println("alice1.hashCode(): " + alice1.hashCode());
System.out.println("alice3.hashCode(): " + alice3.hashCode());
System.out.println("bob.hashCode(): " + bob.hashCode());
System.out.println("carl.hashCode(): " + carl.hashCode());
}
}

5-9Empolyee.java

package equals;

import java.time.*;
import java.util.Objects; public class Employee //用户自定义类
{
private String name; //三个私有属性
private double salary;
private LocalDate hireDay; public Employee(String name, double salary, int year, int month, int day)
{
this.name = name;
this.salary = salary;
hireDay = LocalDate.of(year, month, day);
} public String getName()
{
return name;
} public double getSalary()
{
return salary;
} public LocalDate getHireDay()
{
return hireDay;
} public void raiseSalary(double byPercent)//访问器
{
double raise = salary * byPercent / 100;
salary += raise;
} public boolean equals(Object otherObject)
{
// a quick test to see if the objects are identical 测试几个类是否相同,若引用同一个,则相等
if (this == otherObject) return true; // must return false if the explicit parameter is null 若显式参数为空必须返回false
if (otherObject == null) return false; // if the classes don't match, they can't be equal若几个类不匹配,则它们不相等
if (getClass() != otherObject.getClass()) return false; // now we know otherObject is a non-null Employee 已知otherObject是一个非空雇员
var other = (Employee) otherObject; // test whether the fields have identical values 检测是否具有相同的值
return Objects.equals(name, other.name)
&& salary == other.salary && Objects.equals(hireDay, other.hireDay);
} public int hashCode()//重写hashcode方法,使得相等的两个对象获取的HashCode相等
{
return Objects.hash(name, salary, hireDay);
} public String toString() //其他类型数据转为字符串型的数据
{
return getClass().getName() + "[name=" + name + ",salary=" + salary + ",hireDay="
+ hireDay + "]";
}
}

5-10Manager.java

package equals;

public class Manager extends Employee//子类Manager继承Employee
{
private double bonus; public Manager(String name, double salary, int year, int month, int day)
{
super(name, salary, year, month, day);//子类调用超类中的属性
bonus = 0;
} public double getSalary()//访问器
{
double baseSalary = super.getSalary();
return baseSalary + bonus;
} public void setBonus(double bonus)
{
this.bonus = bonus;
} public boolean equals(Object otherObject)
{
if (!super.equals(otherObject)) return false;
var other = (Manager) otherObject;
// super.equals checked that this and other belong to the same class 使用super.equals检查这个类和其他的是否属于同一个类
return bonus == other.bonus;
} public int hashCode()
{
return java.util.Objects.hash(super.hashCode(), bonus);
} public String toString()// toString()方法,可自动生成
{
return super.toString() + "[bonus=" + bonus + "]";
}
}

结果:

删除程序中Employee类、Manager类中的equals()、hasCode()、toString()方法,背录删除方法

代码:

Employee.java

package equals;

import java.time.*;
import java.util.Objects; public class Employee
{
   private String name;
   private double salary;
   private LocalDate hireDay;    public Employee(String name, double salary, int year, int month, int day)
   {
      this.name = name;
      this.salary = salary;
      hireDay = LocalDate.of(year, month, day);
   }    public String getName()
   {
      return name;
   }    public double getSalary()
   {
      return salary;
   }    public LocalDate getHireDay()
   {
      return hireDay;
   }    public void raiseSalary(double byPercent)
   {
      double raise = salary * byPercent / 100;
      salary += raise;
   } @Override
public boolean equals(Object otherObject) {  //重写equals方法
    // TODO Auto-generated method stub
    if(this==otherObject) return true;
    if(this==null) return false;
    if(getClass() != otherObject.getClass()) return false;
    Employee other=(Employee)otherObject;
    return Objects.equals(name,other.name)&&salary == other.salary&&Objects.equals(hireDay,other.hireDay);
} @Override
public int hashCode() {   //重写hashCode方法
    // TODO Auto-generated method stub
    return Objects.hash(name,salary,hireDay);
} @Override
public String toString() {  //重写toString方法
    // TODO Auto-generated method stub
    return getClass().getName()+"[name="+name+",salary="+salary+",hireday="+hireDay+"]";
}
}

Manager.java

package equals;

public class Manager extends Employee  //Manager类(子类)继承Employee类(父类)
{
   private double bonus;//私有属性    public Manager(String name, double salary, int year, int month, int day)
   {
      super(name, salary, year, month, day);  //
      bonus = 0;
   }    public double getSalary()
   {
      double baseSalary = super.getSalary();
      return baseSalary + bonus;
   }    public void setBonus(double bonus)
   {
      this.bonus = bonus;
   } @Override
public boolean equals(Object otherObject) {
    // TODO Auto-generated method stub
    if(!super.equals(otherObject)) return false;
    Manager other=(Manager)otherObject;
    return bonus==other.bonus;
} @Override
public int hashCode() {
    // TODO Auto-generated method stub
    return super.hashCode()+17*new Double(bonus).hashCode();
} @Override
public String toString() {
    // TODO Auto-generated method stub
     return super.toString()+"[bonus="+bonus+"]";
} }

EqualsTest.java

package equals;

/**
* This program demonstrates the equals method.
* @version 1.12 2012-01-26
* @author Cay Horstmann
*/
public class EqualsTest
{
public static void main(String[] args)
{
var alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
var alice2 = alice1;
var alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
var bob = new Employee("Bob Brandson", 50000, 1989, 10, 1); System.out.println("alice1 == alice2: " + (alice1 == alice2)); System.out.println("alice1 == alice3: " + (alice1 == alice3)); System.out.println("alice1.equals(alice3): " + alice1.equals(alice3)); System.out.println("alice1.equals(bob): " + alice1.equals(bob)); System.out.println("bob.toString(): " + bob); var carl = new Manager("Carl Cracker", 80000, 1987, 12, 15);
var boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
boss.setBonus(5000);
System.out.println("boss.toString(): " + boss);
System.out.println("carl.equals(boss): " + carl.equals(boss));
System.out.println("alice1.hashCode(): " + alice1.hashCode());
System.out.println("alice3.hashCode(): " + alice3.hashCode());
System.out.println("bob.hashCode(): " + bob.hashCode());
System.out.println("carl.hashCode(): " + carl.hashCode());
}
}

结果:

测试程序2:

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

      掌握ArrayList类的定义及用法;

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

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

5-11代码:

package arrayList;

import java.util.*;

/**
* This program demonstrates the ArrayList class.
* @version 1.11 2012-01-26
* @author Cay Horstmann
*/
public class ArrayListTest
{
public static void main(String[] args)
{
// fill the staff array list with three Employee objects用三个Employee类填充staff数组列表
var staff = new ArrayList<Employee>();//动态数组,可以灵活设置数组的大小 staff.add(new Employee("Carl Cracker", 75000, 1987, 12, 15));//在列表中插入元素,
staff.add(new Employee("Harry Hacker", 50000, 1989, 10, 1));
staff.add(new Employee("Tony Tester", 40000, 1990, 3, 15)); // raise everyone's salary by 5%每个人的薪水提高5%
for (Employee e : staff)
e.raiseSalary(5); // print out information about all Employee objects
for (Employee e : staff)//for each循环,遍历数组列表
System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay="
+ e.getHireDay());
}
}

Employee.java

package arrayList;

import java.time.*;

public class Employee
{
private String name;//私有属性
private double salary;//私有属性
private LocalDate hireDay;//私有属性 public Employee(String name, double salary, int year, int month, int day)//构造器
{
this.name = name;
this.salary = salary;
hireDay = LocalDate.of(year, month, day);
} public String getName()
{
return name;
} public double getSalary()
{
return salary;
} public LocalDate getHireDay()
{
return hireDay;
} public void raiseSalary(double byPercent)//访问器
{
double raise = salary * byPercent / 100;
salary += raise;
}
}

结果:

注:ArrayList :动态数组,可以动态增加和减少元素,灵活设置数组的大小。
              三个构造器: public ArrayList();默认构造器  public ArrayList(ICollection); 
        public ArrayList(int); 指定大小来初始化内部的数组

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

package arrayList;

import java.util.*;

/**
* This program demonstrates the ArrayList class.
* @version 1.11 2012-01-26
* @author Cay Horstmann
*/
public class ArrayListTest
{
public static void main(String[] args)
{
// fill the staff array list with three Employee objects
var staff = new ArrayList<Employee>(); staff.add(new Employee("Carl Cracker", 75000, 1987, 12, 15));//在列表中插入元素,
staff.add(new Employee("Harry Hacker", 50000, 1989, 10, 1));
staff.add(new Employee("Tony Tester", 40000, 1990, 3, 15));
System.out.println(staff.get(1));
staff.set(2, new Employee("DXY", 1000, 1999, 7, 21));
System.out.println(staff.size());
staff.remove(0); // raise everyone's salary by 5%
for (Employee e : staff)
e.raiseSalary(5); // print out information about all Employee objects
for (Employee e : staff)//for each循环,遍历数组列表
System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay="
+ e.getHireDay());
}
}

注:get()方法获得下标的储存位置

      set()方法修改ArrayList<>并添加new Employee("DXY", 1000, 1999, 7, 21)

    get()方法获得元素输出

    remove()方法删除数组元素

    size()方法得到长度。

   测试程序3:

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

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

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

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

5-12:

package enums;

import java.util.*;

/**
* This program demonstrates enumerated types.
* @version 1.0 2004-05-24
* @author Cay Horstmann
*/
public class EnumTest//主类
{
public static void main(String[] args)
{
var in = new Scanner(System.in);
System.out.print("Enter a size: (SMALL, MEDIUM, LARGE, EXTRA_LARGE) ");
String input = in.next().toUpperCase(); //字符串转换为大写
Size size = Enum.valueOf(Size.class, input);
System.out.println("size=" + size);
System.out.println("abbreviation=" + size.getAbbreviation());
if (size == Size.EXTRA_LARGE)
System.out.println("Good job--you paid attention to the _.");
}
} enum Size//枚举类型,是enum的子类
{
SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");//需传入参数 private Size(String abbreviation) { this.abbreviation = abbreviation; }
public String getAbbreviation() { return abbreviation; } private String abbreviation;
}

结果:

删除程序中Size枚举类,背录删除代码

代码:


package equals;

public class Manager extends Employee  //Manager类(子类)继承Employee类(父类)
{
private double bonus;//私有属性 public Manager(String name, double salary, int year, int month, int day)
{
super(name, salary, year, month, day); //
bonus = 0;
} public double getSalary()
{
double baseSalary = super.getSalary();
return baseSalary + bonus;
} public void setBonus(double bonus)
{
this.bonus = bonus;
} @Override
public boolean equals(Object otherObject) {
// TODO Auto-generated method stub
if(!super.equals(otherObject)) return false;
Manager other=(Manager)otherObject;
return bonus==other.bonus;
} @Override
public int hashCode() {
// TODO Auto-generated method stub
return super.hashCode()+17*new Double(bonus).hashCode();
} @Override
public String toString() {
// TODO Auto-generated method stub
return super.toString()+"[bonus="+bonus+"]";
} }

 

  测试程序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);
}
}

结果:

注:int... intArray,...是可变参数,是int型,也可以改为其他型的   eg:String...StringArray

     实验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()

代码:

public class Demo1 {
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 { //补全本类定义
Son(){
super(false);
System.out.println("Son's Constructor without parameter");
}
public void method() {
System.out.println("Son's method()");
super.method();
}
}

结果:

3. 实验总结:

  通过本次实验,我学习到了:1.四种访问权限修饰符的使用特点   2.Object类   3.ArrayList类的方法    4.枚举类定义方法及用途

通过本次实验,加深了我对java继承特点的理解,并在助教讲解后对四种访问权限修饰符有了更深层面的认识,掌握了ArrayList类,枚举类,对java的学习有了更深的了解。通过线上线下学习,及实验课的练习,我对继承这一章的知识有了明确的把握,但在知识掌握上还是不足。在实验中遇到了许多问题,归根结底是知识掌握的不熟,在同学的帮助下基本解决了问题。在课余时间还是要加强对知识的理解,多练习。

201871010106-丁宣元 《面向对象程序设计(java)》第七周学习总结的更多相关文章

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

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

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

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

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

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

  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. Pwnable-random

    ssh连接,输入密码查看目录下的文件 看看random.c的源码 #include <stdio.h> int main(){ unsigned int random; random = ...

  2. mysql命令大全一

    mysql -u root -p;create database qa;show databases;use qa; create table results(id int not null auto ...

  3. CF613B Skills

    CF613B Skills 洛谷评测传送门 题目描述 Lesha plays the recently published new version of the legendary game hack ...

  4. Tensorflow加载预训练模型和保存模型(ckpt文件)以及迁移学习finetuning

    转载自:https://blog.csdn.net/huachao1001/article/details/78501928 使用tensorflow过程中,训练结束后我们需要用到模型文件.有时候,我 ...

  5. Java中怎么合理的使用redis?

    redis 支撑许多言语的客户端.在官方网站上有支撑的一切的 [redis 客户端列表]. 因为往常运用 java 作为开发言语,所以这儿描绘一下怎样通过 java 来联接和操作 redis 服务器. ...

  6. 第八周论文学习03 An Efficient Tree-based Power Saving Scheme for Wireless Sensor Networks with Mobile Sink

    来源:IEEE Sensors Journal Year: 2016, Volume: 16, Issue: 20 Pages: 7545 - 7557, DOI: 10.1109/JSEN.2016 ...

  7. LeetCode 231.2的幂

    LeetCode 231.2的幂 题目: 给定一个整数,编写一个函数来判断它是否是 2 的幂次方. 算法: 若一个数是2的幂次的话定会有n & (n - 1) == 0这个关系成立 所以直接用 ...

  8. Ubuntu18.04下修改快捷键

    Ubuntu下修改快捷键 Intelij Idea在Ubuntu下的快捷键几乎和windows差不多,最常用的一个快捷键与系统冲突: Ctrl + Alt + T idea是surround with ...

  9. C#获取文件夹下所有的文件名称

    例如想获取后缀名为.txt的文件 //第一种方法 var files = Directory.GetFiles(path, "*.txt"); foreach (var file ...

  10. C#进阶之路(八)集合的应用

    集合是我们编程时候常用的类库,本文主要讨论具体每个类型的区别,每个集合对应的时间复杂度.先上一个时间复杂度图: C#集体类型( Collections in C#) 集合是.NET FCL(Frame ...