达拉草201771010105《面向对象程序设计(java)》第七周学习总结

实验七继承附加实验

实验时间 2018-10-11

1、实验目的与要求

(1)进一步理解4个成员访问权限修饰符的用途;

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

(3)掌握ArrayList类用法与常用API;

(4)掌握枚举类使用方法;

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

(6)熟练掌握Java语言中基于类、继承技术构造程序的语法知识(ch1-ch5);

(7)利用已掌握Java语言程序设计知识,学习设计开发含有1个主类、2个以上用户自定义类的应用程序。

如何使用ArrayList

最简单的例子:

ArrayList List = new ArrayList();
for( int i=0;i <10;i++ ) //给数组增加10个Int元素
List.Add(i);
//..程序做一些处理
List.RemoveAt(5);//将第6个元素移除
for( int i=0;i <3;i++ ) //再增加3个元素
List.Add(i+20);
Int32[] values = (Int32[])List.ToArray(typeof(Int32));//返回ArrayList包含的数组

这是一个简单的例子,虽然没有包含ArrayList所有的方法,但是可以反映出ArrayList最常用的用法

ArrayList重要的方法和属性

1)构造器

ArrayList提供了三个构造器:
public ArrayList();
默认的构造器,将会以默认(16)的大小来初始化内部的数组
public ArrayList(ICollection);
用一个ICollection对象来构造,并将该集合的元素添加到ArrayList
public ArrayList(int);
用指定的大小来初始化内部的数组

object是类层次的根类,所有类的父(超)类

getClass()

public final native Class getClass();

返回该对象运行时的类的对象

例如 定义一个类Person ,创建一个Person对象, Person p= new Person();

此时调用p.getClass() 返回值即为Person类的对象即: Class c=p.getClass();

可通过方法获取该类的名称等信息:c.getName() ,结果为"Person"

此方法常用于反射

hashCode()

public native int hashCode();

返回当前对象的哈希值 本地方法

hashCode常规协定:

在java应用执行期间,对同一对象多次调用haseCode方法,必须返回相同的整数(前提:equals比较时信息没有被修改)

通过equals方法比较,两个对象相等,返回的值必须相同整数

通过equals方法比较,两个对象不同,不一定生成不同的整数,但是不同对象生成不同的整数可以提高哈希表的性能

equals(Object obj)

public boolean equals(Object obj) {

return (this == obj);

}

返回布尔值,表示其他对象是否与本对象相等

参数:Object类型

返回值:

特点:

自反性:对于任何非空引用值X,自己和自己比较即:X.equals(x),结果都为true

对称性:对于任何非空引用值X和Y,当X.equals(Y)结果为true时,Y.equals(X)的结果一定为true

传递性:对于任何非空引用值X、Y和Z,当X.equals(Y)结果为true,Y.equals(Z)的结果为true时,X.equals(Z)的值一定为true

一致性:对于任何非空引用值X和Y,多次调用X.equals(Y)始终返回相同的值true或者false (前提equals对比的信息没有修改)

对于任何非空引用值X,X.equals(null) 的结果都为false

注意:

Object中对于任何非空引用值X和Y,当且仅当X和Y指向同一对象时,返回值为true

重写equals方法时建议要重写hashCode()方法以便维护haseCode的常规协定

2、实验内容和步骤

实验1  补充以下程序中主类内main方法体,以验证四种权限修饰符的用法。

public class TEST1 {

private String t1 = "这是TEST1的私有属性";

public String t2 = "这是TEST1的公有属性";

protected String t3 = "这是TEST1受保护的属性";

String t4 = "这是TEST1的默认属性";

private void tese1() {

System.out.println("我是TEST1用private修饰符修饰的方法");

}

public void tese2() {

System.out.println("我是TEST1用public修饰符修饰的方法");

}

protected void tese3() {

System.out.println("我是TEST1用protected修饰符修饰的方法");

}

void tese4() {

System.out.println("我是TEST1无修饰符修饰的方法");

}

}

public class TEST2 extends TEST1{

private String e1 = "这是TEST2的私有属性";

public String e2 = "这是TEST2的公有属性";

protected String e3 = "这是TEST2受保护的属性";

String e4 = "这是TEST2的默认属性";

public void demo1() {

System.out.println("我是TEST2用public修饰符修饰的方法");

}

private void demo2() {

System.out.println("我是TEST2用private修饰符修饰的方法");

}

protected void demo3() {

System.out.println("我是TEST2用protected修饰符修饰的方法");

}

void demo4() {

System.out.println("我是TEST2无修饰符修饰的方法");

}

}

public class Main {

public static void main(String[] args) {

TEST2 test2 = new TEST2();

/*以下设计代码分别调用 demo1 demo2 demo3 demo4 test1 test2 test3 test4方法和t1 t2 t3 t3 e1 e2 e3 e4属性,结合程序运行结果理解继承和权限修饰符的用法与区别*/

}

}

实验代码补充如下:

 public class TEST1 {
private String t1 = "这是TEST1的私有属性";
public String t2 = "这是TEST1的公有属性";
protected String t3 = "这是TEST1受保护的属性";
String t4 = "这是TEST1的默认属性";
private void tese1() {
System.out.println("我是TEST1用private修饰符修饰的方法");
}
public void tese2() {
System.out.println("我是TEST1用public修饰符修饰的方法");
}
protected void tese3() {
System.out.println("我是TEST1用protected修饰符修饰的方法");
}
void tese4() {
System.out.println("我是TEST1无修饰符修饰的方法");
}
}
 public class TEST2 extends TEST1{
private String e1 = "这是TEST2的私有属性";
public String e2 = "这是TEST2的公有属性";
protected String e3 = "这是TEST2受保护的属性";
String e4 = "这是TEST2的默认属性";
public void demo1() {
System.out.println("我是TEST2用public修饰符修饰的方法");
}
private void demo2() {
System.out.println("我是TEST2用private修饰符修饰的方法");
}
protected void demo3() {
System.out.println("我是TEST2用protected修饰符修饰的方法");
}
void demo4() {
System.out.println("我是TEST2无修饰符修饰的方法");
}
}
 public class Main {
public static void main(String[] args) {
TEST2 test2 = new TEST2();
/*以下设计代码分别调用 demo1 demo2 demo3 demo4 test1 test2 test3 test4方法和t1 t2 t3 t3 e1 e2 e3 e4属性,结合程序运行结果理解继承和权限修饰符的用法与区别*/
test2.demo1();
test2.demo3();
test2.demo4();
test2.tese2();
test2.tese3();
test2.tese4();
System.out.println(test2.e2);
System.out.println(test2.e3);
System.out.println(test2.e4);
System.out.println(test2.t2);
System.out.println(test2.t3);
System.out.println(test2.t4);
}
}

实验结果如下:

实验2  第五章测试程序反思,继承知识总结。

测试程序1:

Ÿ   编辑、编译、调试运行教材程序5-8、5-9、5-10(教材174页-177页);

Ÿ   结合程序运行结果,理解程序代码,掌握Object类的定义及用法;

代码如下:

EqualsTest类;

 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)
{
Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
Employee alice2 = alice1;
Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
Employee 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); Manager carl = new Manager("Carl Cracker", 80000, 1987, 12, 15);
Manager 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());
}
}

Employee类:

 package equals;

 import java.time.*;
import java.util.Objects; public class Employee
{
private String name;//private定义了一个只能在该类中访问的字符串变量
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)
{
// 快速测试这些对象是否相同
if (this == otherObject) return true; // 如果显示参数为空,必须返回flase
if (otherObject == null) return false; // 如果几个类不匹配,则他们不相同
if (getClass() != otherObject.getClass()) return false; // 其他对象为非空Employee类
Employee other = (Employee) otherObject; // 测试是不是有相同值
return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);
} public int hashCode()
{
return Objects.hash(name, salary, hireDay);
} public String toString()//把其他类型的数据转换为字符串类型的数据
{
return getClass().getName() + "[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay
+ "]";
}
}

Manager类:

 package equals;

 public class Manager extends Employee//扩展了一个子类Manager
{
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;
Manager other = (Manager) otherObject;
// 用super.equals检查这个类和其他类是否属于同一个类
return bonus == other.bonus;
} public int hashCode()
{
return java.util.Objects.hash(super.hashCode(), bonus);
} public String toString()//把其他类型的数据转换为字符串类型的数据
{
return super.toString() + "[bonus=" + bonus + "]";
}
}

代码运行结果如下:

总结:

1.object是所有类的基类:Java中所有类(包括用户自己定义的类)都自动继承Object类,即Object类是所有类的父类。位于java.lang包中。

2.数组也是Object类的子类。

3.Object类的常用方法有:

toString();Object类的toString方法返回一个代表该对象域值的字符串。

equals();Object类中的equals方法用于测试某个对象是否同另一 个对象相等。它在Object类中的实现是判断两个对象是 否具有相同的引用。如果两个对象具有相同的引用,它 们一定是相等的。

hashCode();Object类中的hashCode方法导出某个对象的散列 码。散列码是任意整数,表示对象的存储地址。

测试程序2:

Ÿ   编辑、编译、调试运行教材程序5-11(教材182页);

Ÿ   结合程序运行结果,理解程序代码,掌握ArrayList类的定义及用法;

代码如下:

ArrayListTest类:

 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)
{
// 用三个Employee类填充staff数组列表
ArrayList<Employee> staff = new ArrayList<>();//构造了一个ArrayList数组 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%
for (Employee e : staff)
e.raiseSalary(5); //打印出所有Employee类的信息
for (Employee e : staff)
System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay="
+ e.getHireDay());
}
}

Employee类:

 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;
}
}

代码运行如下:

总结:

测试程序3:

Ÿ   编辑、编译、调试运行程序5-12(教材189页);

Ÿ   结合运行结果,理解程序代码,掌握枚举类的定义及用法;

复制代码
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)
{
Scanner 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//定义了枚举类
{
SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");//规定的不同枚举值 private Size(String abbreviation) { this.abbreviation = abbreviation; }
public String getAbbreviation() { return abbreviation; } private String abbreviation;
} 复制代码

实验3:采用个人账号登录https://pintia.cn/,完成《2018秋季西北师范大学面向对象程序设计(Java)(ch1-ch5)测试题2》,测试时间60分钟;

实验4: 课后完成实验3未完成的测试内容。

达拉草201771010105《面向对象程序设计(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. 达拉草201771010105《面向对象程序设计(java)》第三周学习总结

    达拉草201771010105«面向对象程序设计(java)»第三周学习总结 第一部分:实验部分  1.实验目的与要求 (1)进一步掌握Eclipse集成开发环境下java程序开发基本步骤: (2)熟 ...

随机推荐

  1. day53-线程池

    #1.from concurrent import futures可以开启进程池和线程池.concurrent是包,futures是模块,ThreadPoolExecutor是类,submit是方法. ...

  2. Python访问Amazon官网异常

    使用Python访问亚马逊(Amazon)官网,如果没有将headers更改为浏览器的信息, 有几率会触发:检测到当前可能是自动程序,需要输入验证码: 将header修改成浏览器后,需要等一段时间或者 ...

  3. TPO3-2Depletion of Ogallala Aquifer

    The vast grasslands of the High Plains in the central United States were settled by farmers and ranc ...

  4. CentOS本地挂载镜像

    title date tags layout CentOS6.5 ISO镜像挂载,创建本地yum源 2018-08-23 Linux post 1.虚拟机挂载光盘选择相应的镜像 2.@#¥%--&am ...

  5. Maven中settings.xml文件各标签含义

    原文地址:http://www.cnblogs.com/jingmoxukong/p/6050172.html?utm_source=gold_browser_extension settings.x ...

  6. [LC] 543. Diameter of Binary Tree

    Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a b ...

  7. iOS炫酷动画图案、多种选择器、网络测速、滑动卡片效果等源码

    iOS精选源码 对网络进行测速 自实现大标题,配合原生骨架屏demo 简单方便的pickerVIew记录数据 LZPickerView 科技风绘制组件,简单快速"画"出炫酷图案 R ...

  8. python语法基础-常用模块-re模块

    ###############     re模块   ################ 正则表达式的规则: # re模块 # 正则表达式,就是做字符串匹配的,在re模块出现之前就有这个正则表达式了,任 ...

  9. python-django-celery的安装和配置_20191122

    celery的介绍 celery有三个核心的概念: 任务的发出者(需要发邮件的一方),我们项目的代码就相当于发出者, 中间是一个任务队列(中间人broker),这里我们使用Redis来承担任务队列的作 ...

  10. MyBatis注解及动态Sql

    一.注解实现MyBatis配置 java注解是在jdk1.5版本之后开始加入的,不得不说注解对于我们开发人员来说是个很方便的东西,实现起来也非常的简单,下边我们说一下在MyBatis中使用注解来替换M ...