关键词:
1、实验目的与要求
(1) 掌握接口定义方法;
(2) 掌握实现接口类的定义要求;
(3) 掌握实现了接口类的使用要求;
(4) 掌握程序回调设计模式;
(5) 掌握Comparator接口用法;
(6) 掌握对象浅层拷贝与深层拷贝方法;
(7) 掌握Lambda表达式语法;
(8) 了解内部类的用途及语法要求。
一、理论学习
6.1 接口:用interface声明,是抽象方法和常量值定义的集 合。从本质上讲,接口是一种特殊的抽象类。
(1)在Java程序设计语言中,接口不是类,而是对类 的一组需求描述,由常量和一组抽象方法组成。 ? 接口中不包括变量和有具体实现的方法。
(2)接口体中包含常量定义和方法定义,接口中只进 行方法的声明,不提供方法的实现。
(3)通常接口的名字以able或ible结尾;
(4)接口中的所有常量必须是public static final,方法必须是public abstract,这是 系统默认的,不管你在定义接口时,写不写 修饰符都是一样的.
(5)接口的实现:一个类使用了某个接口,那么这个类必须实现该 接口的所有方法,即为这些方法提供方法体。一个类可以实现多个接口,接口间应该用逗号分 隔开。
(6)接口的使用:接口不能构造接口对象,但可以声明接口变量以指向一个实现了该接口的类对象。
(7)可以用instanceof检查对象是否实现了某个接口。
(8)抽象类:用abstract来声明,没有具体实例对象的类,不 能用new来创建对象。
6.2 接口示例
(1)回调(callback):一种程序设计模式,在这种模 式中,可指出某个特定事件发生时程序应该采取 的动作。
(2)Comparator接口所在包: java.util.*
(3)Object类的Clone方法:当拷贝一个对象变量时,原始变量与拷贝变量 引用同一个对象。这样,改变一个变量所引用 的对象会对另一个变量产生影响。
(4)如果要创建一个对象新的copy,它的最初状态与 original一样,但以后可以各自改变状态,就需 要使用Object类的clone方法。
(5)Object.clone()方法返回一个Object对象。必须进行强 制类型转换才能得到需要的类型。
(6)浅层拷贝与深层拷贝
(7)Java中对象克隆的实现:在子类中实现Cloneable接口。
(8)在子类的clone方法中,调用super.clone()。
6.3 lambda表达式
(1)Java Lambda 表达式是 Java 8 引入的一个新的功能,主 要用途是提供一个函数化的语法来简化编码。
(2)Lambda 表达式的语法基本结构 (arguments) -> body
(3)有如下几种情况: 1、参数类型可推导时,不需要指定类型,如 (a) -> System.out.println(a)
2、 只有一个参数且类型可推导时,不强制写 (), 如 a -> System.out.println(a)
3、 参数指定类型时,必须有括号,如 (int a) -> System.out.println(a)
4、参数可以为空,如 () -> System.out.println(“hello”)
5、 body 需要用 包含语句,当只有一条语句时 可省略
6.4 内部类:是定义在一个类内部的类。
(1)使用内部类的原因有以下三个: –内部类方法可以访问该类定义所在的作用域中 的数据,包括私有数据。
–内部类能够隐藏起来,不为同一包中的其他类 所见。
–想要定义一个回调函数且不想编写大量代码时, 使用匿名内部类比较便捷。
(2)内部类可以直接访问外部类的成员,包括 private成员,但是内部类的成员却不能被外部 类直接访问。
(3)内部类并非只能在类内定义,也可以在程序块内 定义局部内部类。
(4)如果构造参数的闭圆括号跟一个开花括号,表明正 在定义的就是匿名内部类。
6.5 代理(Proxy)
2、实验内容和步骤
实验1: 导入第6章示例程序,测试程序并进行代码注释。
测试程序1:
l 编辑、编译、调试运行阅读教材214页-215页程序6-1、6-2,理解程序并分析程序运行结果;
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 编辑、编译、调试以下程序,结合程序运行结果理解程序;
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 在程序中相关代码处添加新知识的注释。
4)掌握回调程序设计模式
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 在程序中相关代码处添加新知识的注释。
将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中年龄与你最近人的姓名、身份证号、年龄、性别和出生地;
|查询人员中是否有你的同乡
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<People> Peoplelist; public static void main(String[] args) Peoplelist = new ArrayList<>(); Scanner scanner = new Scanner(System.in); File file = new File("D:\\java\\1\\身份证号.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(); People People = new people(); People.setname(name); People.setID(ID); People.setsex(sex); int a = Integer.parseInt(age); People.setage(a); People.setbirthplace(place); Peoplelist.add(People); 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:查询人员中是否有你的同乡"); int nextInt = scanner.nextInt(); switch (nextInt) case 1: Collections.sort( Peoplelist); System.out.println( Peoplelist.toString()); break; case 2: int max=0,min=100;int j,k1 = 0,k2=0; for(int i=1;i< Peoplelist.size();i++) j= Peoplelist.get(i).getage(); if(j>max) max=j; k1=i; if(j<min) min=j; k2=i; System.out.println("年龄最大:"+ Peoplelist.get(k1)); System.out.println("年龄最小:"+ Peoplelist.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 < Peoplelist.size(); i++) if( Peoplelist.get(i).getbirthplace().substring(1,4).equals(place)) System.out.println(Peoplelist.get(i)); break; case 4: System.out.println("年龄:"); int yourage = scanner.nextInt(); int near=agenear(yourage); int d_value=yourage-Peoplelist.get(near).getage(); System.out.println(""+Peoplelist.get(near)); /* for (int i = 0; i < Peoplelist.size(); i++) int p=Personlist.get(i).getage()-yourage; if(p<0) p=-p; if(p==d_value) System.out.println(Peoplelist.get(i)); */ break; case 5: isTrue = false; System.out.println("退出程序!"); break; default: System.out.println("输入有误"); public static int agenear(int age) int min=25,d_value=0,k=0; for (int i = 0; i < Peoplelist.size(); i++) d_value= Peoplelist.get(i).getage()-age; if(d_value<0) d_value=-d_value; if (d_value<min) min=d_value; k=i; return k;
package ID; public abstract class People implements Comparable<People> 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(People o) return this.name.compareTo(o.getname()); public String toString() return name+" "+sex+" "+age+" "+ID+" "+birthplace+" ";
结果如下:
实验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,结合程序运行结果理解程序;
了解匿名内部类的用法。
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,结合程序运行结果理解程序;
了解静态内部类的用法。
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);
结果如下:
实验总结:本章我们学习了接口定义方法,了解和熟悉了接口的使用方法,Lambda表达式语法,Comparator接口用法,还能够区分浅拷贝和深拷贝的异同之处,最后基本了解了内部类的定义和使用。通过本章的知识,我们可以更好的了解代码的新的含义,学习到更多的定义方法,学会使用更多的语句,虽然对于内部类的一些东西还是不能掌握彻底,但还是了解了很多,收获满满。然后实验是在实验六的身份证编程题基础上对其修改,添加,得到的。
201771010135杨蓉庆《面对对象程序设计(java)》第九周学习总结(代码片段)
第7章异常、日志、断言和调试1、实验目的与要求(1)掌握java异常处理技术;(2)了解断言的用法;(3)了解日志的用途;(4)掌握程序基础调试技巧;一、理论知识1、异常:在程序的执行过程中所发生的异常事件,它中断指令的正常执... 查看详情
201771010135杨蓉庆《面对对象程序设计(java)》第七周学习总结(代码片段)
学习目标1、深入理解OO程序设计的特征:继承、多态;2、熟练掌握Java语言中基于类、继承技术构造程序的语法知识;3、利用继承定义类设计程序,能够设计开发含有1个主类、2个以上用户自定义类的应用程序。1、实验目的与要... 查看详情
201771010135杨蓉庆《面对对象程序设计(java)》第十八周学习总结(代码片段)
1、实验目的与要求(1) 综合掌握java基本程序结构; (2) 综合掌握java面向对象程序设计特点;(3) 综合掌握java GUI 程序设计结构;(4) 综合掌握java多线程编程模型;(5) 综合编程练习。 2、实验内容和... 查看详情
杨蓉庆201771010135《面向对象程序设计(java)》第一周学习总结
第一部分:课程准备部分填写课程学习平台注册账号,平台名称注册账号博客园:www.cnblogs.com艾特大家程序设计评测:https://pintia.cn/艾特你代码托管平台:https://github.com/艾特你@m中国大学MOOC: https://www.icourse163.org/1063769427以下... 查看详情
201771010135杨蓉庆《面向对象程序设计(java)》第四周学习总结(代码片段)
学习目标1、掌握类与对象的基础概念,理解类与对象的关系;2、掌握对象与对象变量的关系;3、掌握预定义类的基本使用方法,熟悉Math类、String类、math类、Scanner类、LocalDate类的常用API;4、掌握用户自定义类的语法规则,包... 查看详情
201771010135杨蓉庆《面向对象程序设计(java)》第二周学习总结
第一部分:理论知识学习部分3.1标识符:由字母、下划线、美元符号和数字组成,且第一个符号不能为数字,可用作:类名、变量名、方法名、数组名、文件名等。有Hello、$1234、程序名、www_123等。(2)关键词:是java语言中已经被... 查看详情
201771010135杨蓉庆《面对对象程序设计(java)》第十六周学习总结(代码片段)
1、实验目的与要求(1) 掌握线程概念;(2) 掌握线程创建的两种技术;(3) 理解和掌握线程的优先级属性及调度方法;(4) 掌握线程同步的概念及实现技术;一、理论知识?线程的概念 (1)多线程是进程执行过程中... 查看详情
201771010135杨蓉庆《面向对象程序设计(java)》第六周学习总结(代码片段)
实验六 继承定义与使用1、实验目的与要求(1) 理解继承的定义;(2) 掌握子类的定义要求(3) 掌握多态性的概念及用法;(4) 掌握抽象类的定义及用途;(5) 掌握类中4个成员访问权限修饰符的用途;(6) 掌握... 查看详情
201771010142张燕/杨蓉庆实验十三图形界面事件处理技术(代码片段)
实验十三 图形界面事件处理技术实验时间 2018-11-22 基础知识: ?事件源(eventsource):能够产生事件的对象都可以成为事件源,如文本框、按钮等。一个事件源是一个能够注册监听器并向监听器发送事件对象... 查看详情
java面对对象程序设计——面对对象(代码片段)
重点掌握1.类是对一类事物描述,是抽象的、概念上的定义;对象是实际存在的该类事物的每个个体,因而也称为实例2.创建对象的格式是:类名对象名称=new类名();3.方法的声明格式是:[<修饰符>]<返... 查看详情
面对对象的程序设计
面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。 一、理解对象: 第一种:基于Object对象1varperson=newObject(... 查看详情
day-8:面对对象编程
面对过程的程序设计方法意在将函数分成子函数,再依次调用这些函数来解决问题。 而面对对象的程序设计方法,来源于自然界,类是实例的抽象,实例是类的具体。自定义出来的对象是类,而所有的数据都可以看成是... 查看详情
java面对对象程序设计——面对对象(代码片段)
重点掌握1.类是对一类事物描述,是抽象的、概念上的定义;对象是实际存在的该类事物的每个个体,因而也称为实例2.创建对象的格式是:类名对象名称=new类名();3.方法的声明格式是:[<修饰符>]<返... 查看详情
设计模式面对面之订阅模式
订阅模式订阅模式主要涉及到三种对象:订阅对象,发布对象,分发对象。案例没对这三种对象做抽像,大家可以根据应用场景去扩展。类图:常用的实现方式:订阅对象//订阅对象publicclassSubscribe{publicstringName;publicSubscribe(stringn... 查看详情
java面对对象入门-程序块初始化
Java实例初始化程序是在执行构造函数代码之前执行的代码块。每当我们创建一个新对象时,这些初始化程序就会运行。1.实例初始化语法用花括号创建实例初始化程序块。对象初始化语句写在括号内。publicclassDemoClass{//Thisisinitial... 查看详情
《设计模式之禅》笔记整理--面对对象设计六大原则
第一章、面对对象设计六大原则:(1)、单一职责原则:应该有且只有一个原因引起类的变更。为什么要用单一职责原则:(1)、类的复杂性降低,实现什么职责都有清晰明确的定义。 (2)、可读性提高,... 查看详情
java——面对对象
软件出现的目的:*用计算机的语言来描述世界*用计算机解决现实世界的问题面向对象的思想描述面向对象的世界面向对象设计和开发程序的好处:*交流更加流畅*提高设计和开发效率构造方法:构造方法是用来描述对象创建的... 查看详情
面对对象编程
面向对象编程标签(空格分隔):python基础---面向过程:根据业务逻辑从上到下写代码面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程面向对象(object-oriented;简称:OO)至今... 查看详情