实验六 接口的定义与使用

实验时间 2018-10-18

理论知识:

接口体中包含常量定义和方法定义,接口中只进行方法的声明,不提供方法的实现。

类似建立类的继承关系,接口也可以扩展。接口的扩展技术使得从具有较高通用性的接口存在多条链延伸到具有较高专用性的接口。

通常接口的名字以able或ible结尾;可以使用extends来继承接口的常量和抽象方法,扩展形成新的接口;接口中的所有常量必须是public static final,方法必须是public abstract,这是系统默认的,不管你在定义接口时,写不写修饰符都是一样的。

一个类使用了某个接口,那么这个类必须实现该接口的所有方法,即为这些方法提供方法体。一个类可以实现多个接口,接口间应该用逗号分隔开。例:class Employee implements Cloneable,Comparable

若实现接口的类不是抽象类,则必须实现所有接口的所有方法,即为所有的抽象方法定义方 法体。一个类在实现某接口抽象方法时,必须使用完全相同的方法名、参数列表和返回值类型。接口抽象方法的访问控制符已指定为public, 所以类在实现时,必须显式地使用public修饰符,否则被警告缩小了接口中定义的方法的访问控制范围。

接口不能构造接口对象,但可以声明接口变量以指向一个实现了该接口的类对象。可以用instanceof检查对象是否实现了某个接口

对象克隆

Object类的Clone方法

 Object类的clone()方法是一个native方法。

 Object类中的 clone()方法被protected修饰符修饰。 这意味着在用户编写的代码中不能直接调用它。如果要直接应用clone()方法,就需 覆盖clone()方法,并要把clone()方法的属性设置为 public。

 Object.clone()方法返回一个Object对象。必须进行强 制类型转换才能得到需要的类型。

Lambda 表达式的语法基本结构 (arguments) -> body

1、实验目的与要求

(1) 掌握接口定义方法;

(2) 掌握实现接口类的定义要求;

(3) 掌握实现了接口类的使用要求;

(4) 掌握程序回调设计模式;

(5) 掌握Comparator接口用法;

(6) 掌握对象浅层拷贝与深层拷贝方法;

(7) 掌握Lambda表达式语法;

(8) 了解内部类的用途及语法要求。

2、实验内容和步骤

实验1 导入第6章示例程序,测试程序并进行代码注释。

测试程序1:

l 编辑、编译、调试运行阅读教材214页-215页程序6-1、6-2,理解程序并分析程序运行结果;

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

l 掌握接口的实现用法;

l 掌握内置接口Compareable的用法

package interfaces;import java.util.*;/** * This program demonstrates the use of the Comparable interface. * @version 1.30 2004-02-27 * @author Cay Horstmann */ public class EmployeeSortTest { public static void main(String[] args) { Employee[] staff = new Employee[3]; staff[0] = new Employee("Harry Hacker", 35000); staff[1] = new Employee("Carl Cracker", 75000); staff[2] = new Employee("Tony Tester", 38000); Arrays.sort(staff); //输出所有关于Employee对象的信息 for (Employee e : staff) System.out.println("name=" + e.getName() + ",salary=" + e.getSalary()); } }第二
package interfaces;public class Employee implements Comparable<Employee>
//创建一个泛型Comparable接口,提供一个类型参数,比较Employee类的对象并进行排序 { private String name; private double salary; public Employee(String name, double salary) { this.name = name; this.salary = salary; } public String getName() { return name; } public double getSalary() { return salary; } public void raiseSalary(double byPercent) { double raise = salary * byPercent / 100; salary += raise; } /** * Compares employees by salary * @param other another Employee object * @return a negative value if this employee has a lower salary than * otherObject, 0 if the salaries are the same, a positive value otherwise */ public int compareTo(Employee other) { return Double.compare(salary, other.salary);//运用double调用compare来进行比较 //salary的大小两两互相比较,升序排出salary的大小  } }结果:

测试程序2:

编辑、编译、调试以下程序,结合程序运行结果理解程序

interface  A

{

  double g=9.8;

  void show( );

}

class C implements A

//对C使用A接口的方法

{

  public void show( )

  {

  System.out.println("g="+g);

  }

}

 

class InterfaceTest

{

  public static void main(String[ ] args)

  {

       A a=new C( );

       a.show( );

System.out.println("g="+C.g);

}

结果;

测试程序3:

l 在elipse IDE中调试运行教材223页6-3,结合程序运行结果理解程序;

l 26行、36行代码参阅224页,详细内容涉及教材12章。

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

l 掌握回调程序设计模式

package timer;/**@version 1.01 2015-05-12@author Cay Horstmann */ import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.Timer; // to resolve conflict with java.util.Timer public class TimerTest { public static void main(String[] args) { ActionListener listener = new TimePrinter();// ActionListener listener被new TimePrinter接口引用
// 构造一个timer对象存放在变量里,叫做listener // 每次间隔10秒 Timer t = new Timer(10000, listener); t.start();//用T调用start对象 JOptionPane.showMessageDialog(null, "Quit program?"); System.exit(0); } } class TimePrinter implements ActionListener {public void actionPerformed(ActionEvent event) { System.out.println("At the tone, the time is " + new Date()); Toolkit.getDefaultToolkit().beep(); //每隔10秒响一次  } }结果:

测试程序4:

l 调试运行教材229页-231页程序6-4、6-5,结合程序运行结果理解程序;

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

l 掌握对象克隆实现技术;

l 掌握浅拷贝和深拷贝的差别。

package clone;/*** This program demonstrates cloning.* @version 1.10 2002-07-01 * @author Cay Horstmann */ public class CloneTest { public static void main(String[] args) { try //放入try中,配合后面的语句捕获异常  { Employee original = new Employee("John Q. Public", 50000); original.setHireDay(2000, 1, 1); Employee copy = original.clone(); copy.raiseSalary(10); copy.setHireDay(2002, 12, 31); System.out.println("original=" + original); System.out.println("copy=" + copy); } catch (CloneNotSupportedException e) //捕获异常  { e.printStackTrace(); } } }
package clone;import java.util.Date;
import java.util.GregorianCalendar; public class Employee implements Cloneable { private String name; private double salary; private Date hireDay; public Employee(String name, double salary) { this.name = name; this.salary = salary; hireDay = new Date(); } public Employee clone() throws CloneNotSupportedException { // call Object.clone() Employee cloned = (Employee) super.clone(); // clone mutable fields cloned.hireDay = (Date) hireDay.clone(); return cloned; } /** * Set the hire day to a given date. * @param year the year of the hire day * @param month the month of the hire day * @param day the day of the hire day */ public void setHireDay(int year, int month, int day) { Date newHireDay = new GregorianCalendar(year, month - 1, day).getTime(); // Example of instance field mutation  hireDay.setTime(newHireDay.getTime()); } public void raiseSalary(double byPercent) { double raise = salary * byPercent / 100; salary += raise; } public String toString() { return "Employee[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay + "]"; } }结果“


实验2 导入第6章示例程序6-6,学习Lambda表达式用法。

l 调试运行教材233页-234页程序6-6,结合程序运行结果理解程序;

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

l 将27-29行代码与教材223页程序对比,将27-29行代码与此程序对比,体会Lambda表达式的优点。

package lambda;import java.util.*;import javax.swing.*; import javax.swing.Timer; /** * This program demonstrates the use of lambda expressions. * @version 1.0 2015-05-12 * @author Cay Horstmann */ public class LambdaTest { public static void main(String[] args) { String[] planets = new String[] { "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune" }; System.out.println(Arrays.toString(planets)); System.out.println("Sorted in dictionary order:"); Arrays.sort(planets); System.out.println(Arrays.toString(planets)); System.out.println("Sorted by length:"); Arrays.sort(planets, (first, second) -> first.length() - second.length()); System.out.println(Arrays.toString(planets)); Timer t = new Timer(1000, event -> System.out.println("The time is " + new Date())); t.start(); // keep program running until user selects "Ok" JOptionPane.showMessageDialog(null, "Quit program?"); System.exit(0); } }结果:


实验3: 编程练习

l 编制一个程序,将身份证号.txt 中的信息读入到内存中;

l 按姓名字典序输出人员信息;

l 查询最大年龄的人员信息;

l 查询最小年龄人员信息;

l 输入你的年龄,查询身份证号.txt中年龄与你最近人的姓名、身份证号、年龄、性别和出生地;

查询人员中是否有你的同乡。

package ID;public class Person implements Comparable<Person> {
private String name;
private String ID;
private int age;
private String sex;
private String birthplace;public String getname() {
return name;
}
public void setname(String name) {
this.name = name;
}
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID= ID;
}
public int getage() {return age;
}
public void setage(int age) {this.age= age;
}
public String getsex() {
return sex;
}
public void setsex(String sex) {
this.sex= sex;
}
public String getbirthplace() {
return birthplace;
}
public void setbirthplace(String birthplace) {
this.birthplace= birthplace;
}public int compareTo(Person o) {return this.name.compareTo(o.getname());
}
public String toString() {return  name+"\t"+sex+"\t"+age+"\t"+ID+"\t"+birthplace+"\n";
}}
package ID;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;public class Main{private static ArrayList<Person> Personlist;public static void main(String[] args) {Personlist = new ArrayList<>();Scanner scanner = new Scanner(System.in);File file = new File("C:\\mydirectory\\身份证号.txt");try {FileInputStream fis = new FileInputStream(file);BufferedReader in = new BufferedReader(new InputStreamReader(fis));String temp = null;while ((temp = in.readLine()) != null) {Scanner linescanner = new Scanner(temp);linescanner.useDelimiter(" ");    String name = linescanner.next();String ID = linescanner.next();String sex = linescanner.next();String age = linescanner.next();String place =linescanner.nextLine();Person Person = new Person();Person.setname(name);Person.setID(ID);Person.setsex(sex);int a = Integer.parseInt(age);Person.setage(a);Person.setbirthplace(place);Personlist.add(Person);}} catch (FileNotFoundException e) {System.out.println("查找不到信息");e.printStackTrace();} catch (IOException e) {System.out.println("信息读取有误");e.printStackTrace();}boolean isTrue = true;while (isTrue) {System.out.println("1:按姓名字典序输出人员信息");System.out.println("2:查询最大年龄与最小年龄人员信息");System.out.println("3:按省份找同乡");System.out.println("4:输入你的年龄,查询年龄与你最近人的信息");System.out.println("5:退出");int nextInt = scanner.nextInt();   switch (nextInt) {case 1:Collections.sort(Personlist);System.out.println(Personlist.toString());break;case 2:                 int max=0,min=100;int j,k1 = 0,k2=0;for(int i=1;i<Personlist.size();i++){j=Personlist.get(i).getage();if(j>max){max=j; k1=i;}if(j<min){min=j; k2=i;}}  System.out.println("年龄最大:"+Personlist.get(k1));System.out.println("年龄最小:"+Personlist.get(k2));break;case 3:System.out.println("省份?");String find = scanner.next();        String place=find.substring(0,3);String place2=find.substring(0,3);for (int i = 0; i <Personlist.size(); i++) {if(Personlist.get(i).getbirthplace().substring(1,4).equals(place)) System.out.println("同乡 "+Personlist.get(i));} break;case 4:System.out.println("年龄:");int yourage = scanner.nextInt();int near=agenear(yourage);int d_value=yourage-Personlist.get(near).getage();System.out.println(""+Personlist.get(near));break;case 5:isTrue = false;System.out.println("欢迎使用!");break;default:System.out.println("输入有误");}}}public static int agenear(int age) {int j=0,min=53,d_value=0,k=0;for (int i = 0; i < Personlist.size(); i++){d_value=Personlist.get(i).getage()-age;if(d_value<0) d_value=-d_value; if (d_value<min) {min=d_value;k=i;}}    return k;}}

实验4:内部类语法验证实验

实验程序1:

l 编辑、调试运行教材246页-247页程序6-7,结合程序运行结果理解程序;

l 了解内部类的基本用法。

package innerClass;import java.awt.*;
import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.Timer; /** * This program demonstrates the use of inner classes. * @version 1.11 2015-05-12 * @author Cay Horstmann */ public class InnerClassTest { public static void main(String[] args) { TalkingClock clock = new TalkingClock(1000, true); clock.start(); // keep program running until user selects "Ok" JOptionPane.showMessageDialog(null, "Quit program?"); System.exit(0); } } /** * A clock that prints the time in regular intervals. */ class TalkingClock { private int interval; private boolean beep; /** * Constructs a talking clock * @param interval the interval between messages (in milliseconds) * @param beep true if the clock should beep */ public TalkingClock(int interval, boolean beep) { this.interval = interval; this.beep = beep; } /** * Starts the clock. */ public void start() { ActionListener listener = new TimePrinter(); Timer t = new Timer(interval, listener); t.start(); } public class TimePrinter implements ActionListener { public void actionPerformed(ActionEvent event) { System.out.println("At the tone, the time is " + new Date()); if (beep) Toolkit.getDefaultToolkit().beep(); } } }结果:

实验程序2:

l 编辑、调试运行教材254页程序6-8,结合程序运行结果理解程序;

l 了解匿名内部类的用法。

package anonymousInnerClass;import java.awt.*;
import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.Timer; /** * This program demonstrates anonymous inner classes. * @version 1.11 2015-05-12 * @author Cay Horstmann */ public class AnonymousInnerClassTest { public static void main(String[] args) { TalkingClock clock = new TalkingClock(); clock.start(1000, true); // keep program running until user selects "Ok" JOptionPane.showMessageDialog(null, "Quit program?"); System.exit(0); } } /** * A clock that prints the time in regular intervals. */ class TalkingClock { /** * Starts the clock. * @param interval the interval between messages (in milliseconds) * @param beep true if the clock should beep */ public void start(int interval, boolean beep) { ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent event) { System.out.println("At the tone, the time is " + new Date()); if (beep) Toolkit.getDefaultToolkit().beep(); } }; Timer t = new Timer(interval, listener); t.start(); } }结果:

实验程序3:

l 在elipse IDE中调试运行教材257页-258页程序6-9,结合程序运行结果理解程序;

l 了解静态内部类的用法。

package staticInnerClass;/*** This program demonstrates the use of static inner classes.* @version 1.02 2015-05-12 * @author Cay Horstmann */ public class StaticInnerClassTest { public static void main(String[] args) { double[] d = new double[20]; for (int i = 0; i < d.length; i++) d[i] = 100 * Math.random(); ArrayAlg.Pair p = ArrayAlg.minmax(d); System.out.println("min = " + p.getFirst()); System.out.println("max = " + p.getSecond()); } } class ArrayAlg { /** * A pair of floating-point numbers */ public static class Pair { private double first; private double second; /** * Constructs a pair from two floating-point numbers * @param f the first number * @param s the second number */ public Pair(double f, double s) { first = f; second = s; } /** * Returns the first number of the pair * @return the first number */ public double getFirst() { return first; } /** * Returns the second number of the pair * @return the second number */ public double getSecond() { return second; } } /** * Computes both the minimum and the maximum of an array * @param values an array of floating-point numbers * @return a pair whose first element is the minimum and whose second element * is the maximum */ public static Pair minmax(double[] values) { double min = Double.POSITIVE_INFINITY; double max = Double.NEGATIVE_INFINITY; for (double v : values) { if (min > v) min = v; if (max < v) max = v; } return new Pair(min, max); } }结果:

实验总结:通过这次学习了解了接口的定义和接口的种种知识,还有克隆和拷贝知识。


转载于:https://www.cnblogs.com/qiongji/p/9824838.html

201771010119穷吉第八周相关推荐

  1. 实验九201771010119穷吉

    实验九异常.断言与日志 理论知识: 异常:在程序的执行过程中所发生的异常事件,它中断指令的正常执行. Java的异常处理机制可以控制程序从错误产生的位置转移到能够进行错误处理的位置. 程序中出现的常见 ...

  2. 2018-2019-1 20165318《信息安全系统设计基础》第八周课上测试

    2018-2019-1 20165318<信息安全系统设计基础>第八周课上测试 测试-1-ch03 任务详情 通过输入gcc -S -o main.s main.c,将下面c程序" ...

  3. 20172328 2018-2019《Java软件结构与数据结构》第八周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第八周学习总结 概述 Generalization 本周学习了二叉树的另一种有序扩展?是什么呢?你猜对了!ヾ(◍°∇°◍) ...

  4. 20165315 第八周考试课下补做

    20165315 第八周考试课下补做 测试-2-ch03 1.通过输入gcc -S -o main.s main.c 将下面c程序"week0303学号.c"编译成汇编代码 int ...

  5. 20172310 2017-2018-2 《程序设计与数据结构》第八周学习总结

    20172310 2017-2018-2 <程序设计与数据结构>第八周学习总结 教材学习内容总结 我的总结主要是按照课本的顺序,对一些重要的知识点做出的总结和记录,方便后期的查看,当然其中 ...

  6. 20165302第八周总结

    20165302第八周总结 进程与线程 线程是比进程更小的执行单位,一个进程在其执行过程中,可以产生多个线程,形成多条执行线索,没有进程就不会有线程,就像没有操作系统就不会有进程一样 main线程 当 ...

  7. 2019夏第八周学习编辑总结

    这个作业属于哪个课程 C语言程序设计二 这个作业要求在哪里 2019春季学期第八周作业 我的课程目标 掌握常用字符串函数以及使用指针操作字符串的方法,掌握动态内存分配. 这个作业在哪个具体方面帮助我实 ...

  8. 20172311《程序设计与数据结构》第八周学习总结

    20172311<程序设计与数据结构>第八周学习总结 教材学习内容总结 第十二章 优先队列与堆 堆(heap)就是具有两个附加属性的一颗二叉树 1.它是一颗完全树 2.对每一个节点,它小于 ...

  9. 20172322 《程序设计与数据结构》第八周学习总结

    20172322 <程序设计与数据结构>第八周学习总结 教材学习内容总结 本章的内容主要讲堆的知识,而所谓堆就是一种具有一些特殊属性的树,就像二叉查找树一样.而堆也有两种分类,分别是 最大 ...

最新文章

  1. pinpoint的id的生成
  2. 使用 Python 的基于边缘和基于区域的分割
  3. Web服务器和应用程序服务器有什么区别
  4. yum 安装php7和相关扩展
  5. Python快速学习07:文本文件的操作
  6. html不可选择的按钮,HTML功能无法使用按钮
  7. vue路由详解版一目了然
  8. 第1步 新建spring+springmvc+mybatis项目 每步都有 讲解 巨详细
  9. c++中在堆和栈中申请空间的差别
  10. mac安装python环境教程_python mac下安装虚拟环境的图文教程
  11. 怎么把页面内容填满一页_【2020手帐体系】超详细的设置思路和内容介绍~
  12. 社会工程学+Web hacked***某游戏公司
  13. Linux查看最近开关机记录
  14. Linux命令对应的英文及整体学习法
  15. 吉林公主岭玉米丰收将成定局
  16. mysql 不会丢失数据吗_讨论MySQL丢失数据的几种情况
  17. 【抽样调查】CH3 分层随机抽样
  18. 【视频】什么是梯度下降?用线性回归解释和R语言估计GARCH实例
  19. WDM 驱动程序开发
  20. Terracotta Server集群

热门文章

  1. Android工程模块化平台的设计
  2. 区块链学堂(6):以太坊生产网络/测试网络/私有网络
  3. WatchDog工作原理
  4. android的窗口机制分析------ViewRoot类
  5. Android Full-Disk Encryption
  6. Binder源码分析之ServiceManager(原)
  7. JZOJ 5926. 【NOIP2018模拟10.25】naive 的图
  8. 两点之间的连线java_java计算图两点之间的路径实例代码
  9. 如何查看无线网卡型号_如何检查笔记本电脑是否具有内置无线网卡?
  10. 摄像头poe供电原理_什么是POE供电,这种POE套装有什么优势呢?