201874040116-李鑫《面向对象程序设计(java)》第8周学习总结
项目 |
内容 |
这个作业属于哪个课程 |
https://www.cnblogs.com/nwnu-daizh/ |
这个作业的要求在哪里 |
https://www.cnblogs.com/nwnu-daizh/p/11703678.html |
作业学习目标 |
|
第一部分:总结第六章理论知识
1.接口(interface):
接口的声明语法格式如下:
[可见度] interface 接口名称 [extends 其他的接口名] {
// 声明变量
// 抽象方法
}
// 声明变量
// 抽象方法
}
1)接口不是类,是对类的一组需求描述,由常量和抽象方法组成,不能包含实例域和静态方法
2)不能构造接口的对象,但可以声明接口的变量,接口变量必须引用实现了接口的类对象
3)接口可以象类的继承一样扩展 public interface 接口1 extends接口2 {...}
4)一个类可以实现多个接口
2.回调(callback):
指出某个特定事件发生时应该采取的动作;在java.swing包中有一个Timer类,可以使用它在到达给定的时间间隔时触发一个事件。
3.对象克隆
当浅拷贝一个对象变量时,原始变量与拷贝变量引用同一个对象。这样,改变一个变量所引用的对象会对另一个变量产生影响。不想这样就要重新定义clone方法建立一个深拷贝。
4.Lambda表达式(java 8 新特性)
语法:(parameters) -> expression
1) 使用 Lambda 表达式可以使代码变的更加简洁紧凑。
2)Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。
3) 即使Lambad表达式没有参数,仍然要提供空括号;如果可以推导出一个Lambda表达式的参数类型,则可以忽略其类型。
4) 函数式接口:对于有且仅有一个抽象方法,但是可以有多个非抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式,这种接口称为函数式接口。
5.方法引用
语法: class::method 例: System.out::println
1) 方法引用通过方法的名字来指向一个方法。
2) 方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
1. 构造器引用:语法:Class::new,或者更一般的Class< T >::new
2. 静态方法引用: 语法:Class::static_method
6.内部类(inner class)
1) 内部类是定义在另一个类中的类
2)使用内部类的理由: 1.内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据
2.内部类可以对同一个包中的其他类隐藏起来
3.当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷
3)内部类的特殊语法规则:outerclass.this 表示外围类引用
4)局部内部类: 被包含与方法中的类; 局部内部类就像是方法里面的一个局部变量一样,不能有public、protected、private以及static修饰符。它的作用域被限定在声明这个局部类的块中。局部类有一个优势,即对外部
世界完全隐藏起来。即使外部类中的其他代码也不能访问它。除了其所在的方法之外,没有任何方法知道该局部类的存在。局部内部类只能访问被final修饰的局部变量。
5)匿名内部类: 局部内部类的进一步使用:只创建这个类的一个对象的不必命名的类。
6)静态内部类: 有时候,使用内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外围类的元素。为此,可以为内部类加上static关键字声明为静态内部类,以便取消产生的引用。
7.代理(proxy)
1)利用代理可以在运行时创建一个实现了一组给定接口的新类。用在编译时无法确定需要使用实现哪一个接口时才有必要使用。
2)要想创建一个代理对象,需要使用Proxy类的newProxyInstance方法
第二部分:实验部分
实验1:测试程序1
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); // print out information about all Employee objects for (Employee e : staff) System.out.println("name=" + e.getName() + ",salary=" + e.getSalary()); } } 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) //实现Comparable接口中的comparaTo方法 { return Double.compare(salary, other.salary); } }
结果:
测试程序2:
public class Test{ public static void main(String[ ] args) { A a = new C();//定义接口变量a引用了C类的对象 a.show( ); System.out.println("g="+C.g); } } interface A { double g=9.8; //final 常量 void show( ); } class C implements A { public void show( ) {System.out.println("g="+g);} }
结果;
测试程序3:
import java.awt.*; import java.awt.event.*; import java.util.Date; import javax.swing.*; public class TimerTest { public static void main(String[] args) { ActionListener listener = new TimePrinter(); // construct a timer that calls the listener // once every second // 建立一个一秒触发一次的定时器 Timer t = new Timer(1000, listener); t.start(); // keep program running until the user selects "OK" // 弹出信息框同时持续程序的运行直到用户按下"OK"按钮 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:
1 public class CloneTest 2 { 3 public static void main(String[] args) throws CloneNotSupportedException 4 { 5 var original = new Employee("John Q. Public", 50000); 6 original.setHireDay(2000, 1, 1); 7 Employee copy = original.clone(); 8 copy.raiseSalary(10); 9 copy.setHireDay(2002, 12, 31); 10 System.out.println("original=" + original); 11 System.out.println("copy=" + copy); 12 } 13 } 14 15 16 17 import java.util.Date; 18 import java.util.GregorianCalendar; 19 20 public class Employee implements Cloneable 21 { 22 private String name; 23 private double salary; 24 private Date hireDay; 25 26 public Employee(String name, double salary) 27 { 28 this.name = name; 29 this.salary = salary; 30 hireDay = new Date(); 31 } 32 //创建深拷贝的clone方法 33 public Employee clone() throws CloneNotSupportedException 34 { 35 // call Object.clone() 调用Object类的clone方法 浅拷贝 36 Employee cloned = (Employee) super.clone(); 37 38 // clone mutable fields 克隆易变字段 39 cloned.hireDay = (Date) hireDay.clone(); 40 41 return cloned; 42 } 43 44 45 public void setHireDay(int year, int month, int day) 46 { 47 Date newHireDay = new GregorianCalendar(year, month - 1, day).getTime(); 48 49 // example of instance field mutation 50 hireDay.setTime(newHireDay.getTime()); 51 } 52 53 public void raiseSalary(double byPercent) 54 { 55 double raise = salary * byPercent / 100; 56 salary += raise; 57 } 58 59 public String toString() 60 { 61 return "Employee[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay + "]"; 62 } 63 }
结果;
实验2:
1 import java.util.*; 2 3 import javax.swing.*; 4 import javax.swing.Timer; 5 6 7 public class LambdaTest 8 { 9 public static void main(String[] args) 10 { 11 var planets = new String[] { "Mercury", "Venus", "Earth", "Mars", 12 "Jupiter", "Saturn", "Uranus", "Neptune" }; 13 System.out.println(Arrays.toString(planets)); 14 System.out.println("Sorted in dictionary order:"); 15 Arrays.sort(planets); //调用Arrays类的sort方法 16 System.out.println(Arrays.toString(planets)); 17 System.out.println("Sorted by length:"); 18 Arrays.sort(planets, (first, second) -> first.length() - second.length()); //lambda表达式 19 System.out.println(Arrays.toString(planets)); 20 21 var timer = new Timer(1000, event -> 22 System.out.println("The time is " + new Date())); 23 timer.start(); 24 25 // keep program running until user selects "OK" 26 JOptionPane.showMessageDialog(null, "Quit program?"); //弹出窗口信息 27 System.exit(0); 28 } 29 }
结果;
lambda表达式十分简洁
实验3:编程练习:
1 import java.io.File; 2 import java.io.FileNotFoundException; 3 import java.util.Scanner; 4 5 public class student { 6 7 public static void main(String[] args) throws FileNotFoundException { 8 Scanner in = new Scanner(new File("E:\\CSDN\\身份证号.txt")); 9 stu s[] = new stu[100]; 10 int i = 0; 11 12 //数据录入 13 while(in.hasNextLine()) 14 { 15 s[i] = new stu(); 16 s[i].setName(in.next()); 17 s[i].setID(in.next()); 18 s[i].setSex(in.next()); 19 s[i].setAge(in.nextInt()); 20 s[i].setBrithplace(in.nextLine()); 21 22 i++; 23 } 24 in.close(); 25 int n; 26 int e = 1; 27 Scanner k = new Scanner(System.in); 28 while(e==1) 29 { 30 System.out.println("选择操作:\n按1按姓名字典序输出人员信息\n按2查询最大年龄和最小年龄的人员信息\n按3输入你的年龄,查询年龄与你最近人的信息\n按4查询人员中是否有你的同乡\n按5退出"); 31 n = k.nextInt(); 32 switch(n) 33 { 34 case 1: 35 selectionSortandPrint(s,i); 36 break; 37 case 2: 38 findMaxMinage(s,i); 39 break; 40 case 3: 41 System.out.println("输入你的年龄:\n"); 42 findNearAge(s,i,k.nextInt()); 43 break; 44 case 4: 45 System.out.println("输入你的出生地:\n"); 46 String find = k.next(); 47 String place = find.substring(0, 3); 48 for (int j = 0; j < i; j++) { 49 if (s[j].getBrithplace().substring(1,4).equals(place)) 50 System.out.println("同乡\n"+s[j].ToString()); 51 } 52 break; 53 case 5: 54 e = 0; 55 break; 56 default: 57 System.out.println("请输入正确的数字!"); 58 break; 59 } 60 }; 61 k.close(); 62 } 63 //排序并输出 64 private static void selectionSortandPrint(stu[] s, int n){ 65 String a = new String(); 66 String b = new String(); 67 for (int i = 0; i < n - 1; i++) { 68 int min = i; 69 for (int j = i + 1; j < n; j++) { 70 a=s[min].getName(); 71 b=s[j].getName(); 72 if (a.compareTo(b)==1) 73 { 74 min = j; 75 } 76 } 77 if (min != i) { 78 stu tmp = s[min]; 79 s[min] = s[i]; 80 s[i] = tmp; 81 } 82 } 83 for(int i=0;i<n;i++) 84 { 85 System.out.print(s[i].ToString()); 86 } 87 } 88 //寻找年龄最接近的人 89 private static void findNearAge(stu[] s, int i, int n) { 90 int near=0,j; 91 for(j=1;j<i;j++) 92 { 93 if(Math.abs(s[near].getAge()-n)>Math.abs(s[j].getAge()-n)) 94 { 95 near=j; 96 } 97 } 98 System.out.println("年龄最接近的人的信息:\n"+s[near].ToString()); 99 } 100 //找最大年龄和最小年龄 101 private static int findMaxMinage(stu[] s, int i) 102 { 103 int n; 104 int max=0,min=0; 105 for(n=0;n<i;n++) 106 { 107 if(s[max].getAge()<s[n].getAge()) 108 { 109 max=n; 110 } 111 if(s[min].getAge()>s[n].getAge()) 112 { 113 min=n; 114 } 115 } 116 System.out.println("年龄最大的人的信息:\n"+s[max].ToString()); 117 System.out.println("年龄最小的人的信息:\n"+s[min].ToString()); 118 return 0; 119 } 120 } 121 122 class stu 123 { 124 private String name; 125 private String ID; 126 private String sex; 127 private int age; 128 private String brithplace; 129 130 public void setID(String id){ 131 ID = id; 132 } 133 public void setName(String n) { 134 name = n; 135 } 136 public String getID() { 137 return ID; 138 } 139 public String getName() { 140 return name; 141 } 142 public String getSex() { 143 return sex; 144 } 145 public void setSex(String sex) { 146 this.sex = sex; 147 } 148 public int getAge() { 149 return age; 150 } 151 public void setAge(int age) { 152 this.age = age; 153 } 154 public String getBrithplace() { 155 return brithplace; 156 } 157 public void setBrithplace(String brithplace) { 158 this.brithplace = brithplace; 159 } 160 public String ToString() 161 { 162 return name + "\t" + sex + "\t" + age + "\t" + ID + "\t" + brithplace + "\n"; 163 } 164 }
结果:
实验4:内部类语法验证实验
实验程序1:
结果:
实验程序2:
结果:
实验程序3:
结果:
实验总结:
通过这周的实验学习,掌握了接口的定义方法及使用方法;理解了程序回调设计模式的好处;掌握对象浅层拷贝与深层拷贝方法;了解了Lambda表达式的语法与使用它的好处;了解内部类的用途及语法要求。