关键词:
实验六接口的定义与使用
实验时间 2018-10-18
一、实验目的与要求
(1) 掌握接口定义方法;
(2) 掌握实现接口类的定义要求;
(3) 掌握实现了接口类的使用要求;
(4) 掌握程序回调设计模式;
(5) 掌握Comparator接口用法;
(6) 掌握对象浅层拷贝与深层拷贝方法;
(7) 掌握Lambda表达式语法;
(8) 了解内部类的用途及语法要求。
二、实验内容和步骤
实验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);//静态方法sort // print out information about all Employee objects for (Employee e : staff) System.out.println("name=" + e.getName() + ",salary=" + e.getSalary());
package interfaces; public class Employee implements Comparable<Employee>//Employee实现JDK内置接口Comparable 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方法
测试程序2:
l 编辑、编译、调试以下程序,结合程序运行结果理解程序;
interface A
double g=9.8; void show( );
class C implements 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);
|
public interface A double g=9.8; void show( );
class C implements A public void show( ) System.out.println("g="+g);
package InterfaceTest; public 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的类对象 // construct a timer that calls the listener // once every 10 seconds Timer t = new Timer(10000, listener);//定义间隔 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();
测试程序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 Employee original = new Employee("John Q. Public", 50000); //Employee是一个自定义类 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();
实验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" ;//定义数组planets System.out.println(Arrays.toString(planets));//静态方法 System.out.println("Sorted in dictionary order:"); Arrays.sort(planets);//Arrays.sort方法接收实验Lambda类的对象 System.out.println(Arrays.toString(planets)); System.out.println("Sorted by length:"); Arrays.sort(planets, (first, second) -> first.length() - second.length());//Lambda表达式 System.out.println(Arrays.toString(planets)); Timer t = new Timer(1000, event -> System.out.println("The time is " + new Date()));//Lambda表达式 t.start(); // keep program running until user selects "Ok" JOptionPane.showMessageDialog(null, "Quit program?"); System.exit(0); //返回类型
package clone; import java.util.Date; import java.util.GregorianCalendar; public class Employee implements Cloneable //定义三个私有属性 private String name;//string类在lang包 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 + "]";
注:以下实验课后完成
实验3: 编程练习
l 编制一个程序,将身份证号.txt 中的信息读入到内存中;
l 按姓名字典序输出人员信息;
l 查询最大年龄的人员信息;
l 查询最小年龄人员信息;
l 输入你的年龄,查询身份证号.txt中年龄与你最近人的姓名、身份证号、年龄、性别和出生地;
l 查询人员中是否有你的同乡。
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 Search private static ArrayList<Person> Personlist1; public static void main(String[] args) Personlist1 = new ArrayList<>(); Scanner scanner = new Scanner(System.in); File file = new File("E:\\面向对象程序设计Java\\实验\\实验六\\身份证号.txt"); try FileInputStream F = new FileInputStream(file); BufferedReader in = new BufferedReader(new InputStreamReader(F)); 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); Personlist1.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("******************************************"); System.out.println("1:按姓名字典顺序输出信息;"); System.out.println("2:查询最大年龄与最小年龄人员信息;"); System.out.println("3:按省份找你的同乡;"); System.out.println("4:输入你的年龄,查询年龄与你最近人的信息;"); System.out.println("5:退出"); System.out.println("******************************************"); int type = scanner.nextInt(); switch (type) case 1: Collections.sort(Personlist1); System.out.println(Personlist1.toString()); break; case 2: int max=0,min=100;int j,k1 = 0,k2=0; for(int i=1;i<Personlist1.size();i++) j=Personlist1.get(i).getage(); if(j>max) max=j; k1=i; if(j<min) min=j; k2=i; System.out.println("年龄最大:"+Personlist1.get(k1)); System.out.println("年龄最小:"+Personlist1.get(k2)); break; case 3: System.out.println("place?"); String find = scanner.next(); String place=find.substring(0,3); String place2=find.substring(0,3); for (int i = 0; i <Personlist1.size(); i++) if(Personlist1.get(i).getbirthplace().substring(1,4).equals(place)) System.out.println("你的同乡:"+Personlist1.get(i)); break; case 4: System.out.println("年龄:"); int yourage = scanner.nextInt(); int close=ageclose(yourage); int d_value=yourage-Personlist1.get(close).getage(); System.out.println(""+Personlist1.get(close)); break; case 5: isTrue = false; System.out.println("再见!"); break; default: System.out.println("输入有误"); public static int ageclose(int age) int m=0; int max=53; int d_value=0; int k=0; for (int i = 0; i < Personlist1.size(); i++) d_value=Personlist1.get(i).getage()-age; if(d_value<0) d_value=-d_value; if (d_value<max) max=d_value; k=i; return k;
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) // int a = Integer.parseInt(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+" "+sex+" "+age+" "+id+" ";
实验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);//实现了TalkingClock的类对象 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//实现ActionListener的公共类TimePrinter 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();//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);
三、实验总结:
在这次实验中,我了解并学习了接口的实现用法、内置接口Compareable的用法、对象克隆实现技术以及Lambda表达式。通过自学,我接触了内部类、匿名内部类以及静态内部类的用法。在编程和编译过程中遇到的一些难题和出现的一些问题,我通过查阅资料、上网查找和同学讨论得以解决。
狄慧201771010104《面向对象程序设计(java)》第十周学习总结(代码片段)
实验十 泛型程序设计技术实验时间2018-11-1第一部分:理论知识学习部分(一)、泛型程序设计的定义1、JDK5.0中增加的泛型类型,是Java语言中类型安全的一次重要改进。2、泛型:也称参数化类型(parameterizedtype),就是在定义类、... 查看详情
狄慧201771010104《面向对象程序设计(java)》第七周学习总结(代码片段)
实验七继承附加实验实验时间2018-10-11一、实验目的与要求(1)进一步理解4个成员访问权限修饰符的用途;(2)掌握Object类的常用API用法;(3)掌握ArrayList类用法与常用API;(4)掌握枚举类使用方法;(5)结合本章知识,理... 查看详情
狄慧201771010104《面向对象程序设计(java)》第八周学习总结(代码片段)
实验六接口的定义与使用实验时间2018-10-18一、实验目的与要求(1)掌握接口定义方法;(2)掌握实现接口类的定义要求;(3)掌握实现了接口类的使用要求;(4)掌握程序回调设计模式;(5)掌握Comparator接口用法;(6)掌握对象浅层拷贝与... 查看详情
狄慧201771010104《面向对象程序设计(java)》第九周学习总结(代码片段)
实验九异常、断言与日志实验时间2018-10-25一、知识点总结:(一)处理错误:1、可能出现的问题获错误:用户输入错误、设备错误、物理限制、代码错误。2、异常具有自己的语法和特定的继承结构:异常分类:异常对象都是派... 查看详情
狄慧201771010104《面向对象程序设计(java)》第十三周学习总结(代码片段)
实验十三 图形界面事件处理技术实验时间2018-11-22一、知识点总结 1、AWT事件处理机制的概要:1>监听器对象是一个实现了特定监听器接口的类的实例;2>事件源是一个能够注册监听器对象并发送事件对象的对象;3>... 查看详情
狄慧201771010104《面向对象程序设计(java)》第十八周学习总结(代码片段)
实验十八 总复习实验时间2018-12-301、实验目的与要求(1)综合掌握java基本程序结构;(2) 综合掌握java面向对象程序设计特点;(3)综合掌握javaGUI 程序设计结构;(4)综合掌握java多线程编程模型;(5)综合编程练习。2、实验... 查看详情
狄慧201771010104《面向对象程序设计(java)》第十七周学习总结(代码片段)
一.理论知识部分 Java的线程调度采用优先级策略:优先级高的先执行,优先级低的后执行;多线程系统会自动为每个线程分配一个优先级,缺省时,继承其父类的优先级;任务紧急的线程,其优先级较高;同优先级的线程按“... 查看详情
08-面向对象----j
一面向对象的程序设计的由来请参考:http://www.cnblogs.com/linhaifeng/articles/6428835.html二什么是面向对象的程序设计及为什么要有它面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条... 查看详情
2020面向对象设计与构造第三单元博客总结(代码片段)
面向对象设计与构造第三单元总结一、JML规格化设计JML,全称TheJavaModelingLanguage,是用于对Java程序进行规格化描述的注释性质语言。笔者在本文总结了常见的JML语法描述。1.注释结构在注释行或注释块中,以@开头的行被认作JML注... 查看详情
面向对象
老王和隔壁的美女猜数字,一共有四次机会,猜到了就有特殊奖励publicclasstest{publicstaticvoidmain(String[]args){inti=(int)(Math.random()*10);Scannerinput=newScanner(System.in);for(intj=0;j<4;j++){System.out.println("老王第"+(j+1)+"次 查看详情
201771010126王燕《面向对象程序设计(java)》第二周学习总结
201771010126王燕《面向对象程序设计(java)》第二周学习总结一.理论知识学习部分3.1j简单的java应用程序标识符由字母、下划线、美元符号和数字组成,且第一个符号不能为数字。标识符可用作:类名、变量名、方法名、数组名... 查看详情
201823072019-2020-1《数据结构与面向对象程序设计》实验1报告
课程:《程序设计与数据结构》班级:1823姓名:王美皓学号:20182322实验教师:王美皓实验日期:2019年9月9日必修/选修:必修1.实验内容基于命令行和IDE(IntelljIDEA简易教程](http://www.cnblogs.com/rocedu/p/4421202.html)进行简单的Java程... 查看详情
杨其菊201771010134《面向对象程序设计(java)》第三周学习总结(代码片段)
《面向对象程序设计(Java)》第三周学习总结第一部分:理论知识 这周课程没有新进度,由于感觉对基础语法的不熟悉,复习了一遍前三章的细碎知识,学到一些之前不知道的原理: 1.计算机高级语言按程序的... 查看详情
c++面向对象的主要体现是啥?
...得对我有用的话,我会再追加分。)C++面向对象是表现在程序设计的过程上,它是突破了C的结构化设计而出现的完全以实际问题为入手点的。C++的面向对象3个特性:1.封装。2.继承。3.多态。尤其重要的是,它采用类的设计,杜... 查看详情
徐思201771010132《面向对象程序设计(java)》第十二周学习总结(代码片段)
一、理论知识部分Java的抽象窗口工具箱(AbstractWindowToolkit,AWT)包含在java.awt包中,它提供了许多用来设计GUI的组件类和容器类。大部分AWT组件都有其Swing的等价组件,Swing组件的名字一般是在AWT组件名前面添加一个字母“J”。通... 查看详情
201771010110孔维滢《面向对象程序设计(java)》第十二周学习总结
理论知识部分1.Java的抽象窗口工具箱(AbstractWindowToolkit,AWT)包含在java.awt包中,它提供了许多用来设计GUI的组件类和容器类。2.Swing用户界面库是非基于对等体的GUI工具箱。Swing类库被放在javax.swing包里。3.大部分AWT组件都有其Swing... 查看详情
马凯军201771010116《面向对象与程序设计java》第十二周学习总结(代码片段)
一、理论与知识学习部分Java的抽象窗口工具箱(AbstractWindowToolkit,AWT)包含在java.awt包中,它提供了许多用来设计GUI的组件类和容器类。大部分AWT组件都有其Swing的等价组件,Swing组件的名字一般是在AWT组件名前面添加一个字母“J... 查看详情
201771010134杨其菊《面向对象程序设计java》第十二周学习总结(代码片段)
...bsp; 内容概要: AWT与Swing简介;框架的创建;图形程序设计; 显示图像;1.AWT组件:2.Swing组件层次关系3.AWT与Swing的关系:大部分AWT组件都有其Swing的等价组件; Swing组件的名字一般是在AWT组件名前面添加一个字母“J 查看详情