201771010118马昕璐《面向对象程序设计java》第八周学习总结
?第一部分:理論知識學習部分
1.接口
?在Java程序設計語言中,接口不是類,而是對類的一組需求描述,由常量和一組抽象方法組成。Java為了克服單繼承的缺點,Java使用了接口,一個類可以實現一個或多個接口
?聲明方式:
?public interface 接口名
?{ …… }
?? 接口體中包含常量定義和方法定義,接口中只進行方法的聲明,不提供方法的實現。
?接口中不包括變量和有具體實現的方法。
只要類實現了接口,則該類要遵從接口描述的統一格式進行定義,并且可以在任何需要該接口的地方使用這個類的對象。
?類似建立類的繼承關系,接口也可以擴展。
?? 擴展方法:
?public interface 接口1 extends 接口2
?{ …… };
?接口中的所有常量必須是public static final,方法必須是public abstract,這是?系統默認的?在類聲明時用implements關鍵字聲明使用一個或多個接口
?class Employee implements Printable
?{ …}
?接口不能構造接口對象,但可以聲明接口變量以指向一個實現了該接口的類對象
?2. 接口與回調
?回調(callback):一種程序設計模式,在這種模式中,可指出某個特定事件發生時程序應該采取的動作
?在java.swing包中有一個Timer類,可以使用它在到達給定的時間間隔時觸發一個事件。
?– Timer(int interval, ActionListener listener)
?– void start()
?– void s
?
3. Comparator接口
??? 所在包: java.util.*
?? Comparator接口定義
?? Public interface Comparator<T>{
? ? ???Int compare(T o1,To2);
}
?? 用途:處理字符串按長度進行排序的操作
?4. 對象克隆
??當拷貝一個對象變量時,原始變量與拷貝變量引用同一個對象。這樣,改變一個變量所引用的對象會對另一個變量產生影響。
?如果要創建一個對象新的copy,它的最初狀態與original一樣,但以后可以各自改變狀態,就需要使用Object類的clone方法
?Employee copy = original.clone();
?淺層拷貝:被拷貝對象的所有常量成員和基本類型屬性都有與原來對象相同的拷貝值,而若成員域是一個對象,則被拷貝對象該對象域的對象域用仍然指向有原來的對象。
?深層拷貝:被拷貝對象的所有成員域都含有與原來對象相同的值,且對象域將指向被復制過的新象,而不是原有對象被引用的對象。換言之,深層拷貝將拷貝對象內引用的對象也拷貝一遍。
?Lambda的主要用途是提供一個函數化的語法來簡化編碼。
?Lambda 表達式的語法基本結構
?(arguments) -> body
?有如下幾種情況:
?? 參數類型可推導時,不需要指定類型,如(a) -> System.out.println(a)
?? 只有一個參數且類型可推導時,不強制寫 (), 如a -> System.out.println(a)
?? 參數指定類型時,必須有括號,如 (int a) -> System.out.println(a)
?? 參數可以為空,如 () -> System.out.println(“hello”)
?? body 需要用 {} 包含語句,當只有一條語句時 {} 可省略
?
內部類(inner class)是定義在一個類內部的類
內部類方法可以訪問外圍類的數據,包括私有的數據.
? 內部類可以對同一個包種的其他類隱藏起來.
?使用anonymous內部類定義回調函數類.
第二部分:實驗學習部分
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;public class Employee implements Comparable<Employee> {//聲明屬性;private String name;private double salary;//構造方法;public Employee(String name, double salary){this.name = name;this.salary = salary;}//Name屬性訪問器;public String getName(){return name;}//Salary屬性訪問器;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)//compareTo方法; {return Double.compare(salary, other.salary);//包裝器 調用compare方法; } } 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);//靜態方法// print out information about all Employee objectsfor (Employee e : staff)System.out.println("name=" + e.getName() + ",salary=" + e.getSalary());} }程序測試結果:
?
測試程序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); ??} } |
程序測試結果:
?
測試程序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; // 解決與java.util.Timer的矛盾public class TimerTest { public static void main(String[] args){ ActionListener listener = new TimePrinter();//構造一個調用偵聽器的計時器;//每十秒一次;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?掌握對象克隆實現技術;
掌握淺拷貝和深拷貝的差別。
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{Employee cloned = (Employee) super.clone();//返回Object對象后強制類型轉換;// 克隆可變部分;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();// 實例字段變異實例; 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?在程序中相關代碼處添加新知識的注釋。
將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類數組;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:");//按單詞長度排序后,使用lambda表達式;Arrays.sort(planets, (first, second) -> first.length() - second.length());System.out.println(Arrays.toString(planets));////方法引用;lambda表達式; Timer t = new Timer(1000, event ->System.out.println("The time is " + new Date()));//每隔一秒輸出當前時間; t.start(); // 繼續運行程序,知道用戶選擇OK;JOptionPane.showMessageDialog(null, "Quit program?");System.exit(0); } }程序測試結果:
?
?
實驗3:?編程練習
l?編制一個程序,將身份證號.txt 中的信息讀入到內存中;
l?按姓名字典序輸出人員信息;
l?查詢最大年齡的人員信息;
l?查詢最小年齡人員信息;
l?輸入你的年齡,查詢身份證號.txt中年齡與你最近人的姓名、身份證號、年齡、性別和出生地;
查詢人員中是否有你的同鄉。
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;}}//jiekouwenjiaanpublic 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+"\t"+sex+"\t"+age+"\t"+id+"\t";}}程序測試結果:
?
?
實驗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();// 保持程序運行知道用戶選擇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?了解匿名內部類的用法。
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);// 保持程序運行知道用戶選擇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);} }程序測試結果:
?
實驗總結:這一周主要學習了接口的主要知識,其中主要進行了克隆和回調知識的學習以及lambda表達式的學習。但在接口方面我深刻感受到了自己的不足,也有很多跟不上的地方,需要再多研究一二。
轉載于:https://www.cnblogs.com/maxinlu/p/9824726.html
總結
以上是生活随笔為你收集整理的201771010118马昕璐《面向对象程序设计java》第八周学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 201771010119穷吉第八周
- 下一篇: [Swift]LeetCode927.