1. 程式人生 > >劉志梅 201771010115 《面向物件程式設計(java)》 第八週學習總結

劉志梅 201771010115 《面向物件程式設計(java)》 第八週學習總結

實驗六 介面的定義與使用

實驗時間 2018-10-18

1、實驗目的與要求

(1) 介面定義介面不是類,而是對類的一組需求描述,這些類要遵從介面描述的統一格式進行定義;由常量和一組抽象方法組成;介面中的是所有方法自動地屬於public。

任何實現Comparable介面的類都需要包含compareTo方法,並且這個方法的引數必須是一個Object物件,返回一個整型數值。

為了讓類實現一個介面,兩個步驟:1、將類宣告為實現給定的介面

2、對介面中的所有方法進行定義

要讓一個類使用排序服務必須讓它實現compareTo方法。

2)介面的特性:介面不是類,尤其不能使用new運算子例項化一個介面;介面變數必須引用實現了介面的類物件;使用instance檢查一個物件是否實現了某個特定的介面;介面也可以被擴充套件;雖然在介面中不能包含例項域或靜態方法,但卻可以包含常量;儘管每個類只能夠擁有一個超類,但卻可以實現多個介面。

(3)回撥回撥是一種常見的程式設計模式,在這種模式中,可以指出某個特定事件時應該採取的動作。

java.swing包中有一個Timer類,可以使用它在到達給定的時間間隔時發出通告

(4) Comparator介面對於每一個類,需要確定:1、預設的clone方法是否滿足要求2、是否可以在可變的子物件上呼叫clone來修補預設的clone方法3、是否不該使用clone。

(5) Lambdajava中的一種lambda的表達形式:引數,箭頭(->)以及一個表示式;無需指定lambda表示式的返回型別,lambda表示式的返回型別總是會由上下文推匯出。

(6) 預設的克隆操作是

“淺拷貝”,並沒有克隆物件中引用的其他物件;如果物件中的所有資料域都是數值或其他基本型別,拷貝這些域沒有任何問題,但如果物件包含子物件的引用,拷貝域就會得到相同子物件的另一個引用,這樣一來,原物件和克隆的物件仍然會共享一些資訊。

淺拷貝的影響:如果原物件和淺克隆物件共享的子物件不是可變的,那麼這種共享就是安全的;或者在物件的生命期中,子物件一直包含不變的常量,沒有更改器方法會改變它,也沒有方法會生成它的引用,這種情況下同樣是安全的。

不過,通常子物件都是可變的,必須重新定義clone方法來建立一個深拷貝,同時克隆所有子物件。

(7) 內部類內部類是定義在另一個類中的類。

使用內部類的原因如下:

1、內部類方法可以訪問給類定義所在的作用域中的資料,包括私有的資料。2、內部類可以對同一個包中的其他類隱藏起來。3、當想要定義一個回撥函式且不想編寫大量程式碼時,使用匿名(anonymous)內部類比較便捷。

內部類既可以訪問自身的資料域,也可以訪問建立它的外圍類物件的資料域(外圍類的引用在構造器中設定),編譯器修改了所有的內部類的構造器,新增一個外圍類引用的引數。

(注意,在外圍類的作用域之外,可以這樣引用內部類:OuterClass.InnerClass)

內部類中宣告的所有靜態域都必須是final(如果這個域不是final,它可能就不是唯一的);內部類不能有static方法。

2、實驗內容和步驟

實驗1 匯入第6章示例程式,測試程式並進行程式碼註釋。

測試程式1:

編輯、編譯、除錯執行閱讀教材214-215頁程式6-16-2,理解程式並分析程式執行結果;

在程式中相關程式碼處新增新知識的註釋。

掌握介面的實現用法;

掌握內建介面Compareable的用法。

測試程式2

編輯、編譯、除錯以下程式,結合程式執行結果理解程式;

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

elipse IDE中除錯執行教材2236-3,結合程式執行結果理解程式;

l 26行、36行程式碼參閱224頁,詳細內容涉及教材12章。

在程式中相關程式碼處新增新知識的註釋。

掌握回撥程式設計模式;

實驗結果;

測試程式4

除錯執行教材229-231頁程式6-46-5,結合程式執行結果理解程式;

在程式中相關程式碼處新增新知識的註釋。

掌握物件克隆實現技術;

掌握淺拷貝和深拷貝的差別。

實驗2 匯入第6章示例程式6-6,學Lambda表示式用法。

除錯執行教材233-234頁程式6-6,結合程式執行結果理解程式;

在程式中相關程式碼處新增新知識的註釋。

27-29行程式碼與教材223頁程式對比,將27-29行程式碼與此程式對比,體會Lambda表示式的優點。

實驗截圖:

注:以下實驗課後完成

實驗3: 程式設計練習

編制一個程式,將身份證號.txt 中的資訊讀入到記憶體中;

按姓名字典序輸出人員資訊;

查詢最大年齡的人員資訊;

查詢最小年齡人員資訊;

輸入你的年齡,查詢身份證號.txt中年齡與你最近人的姓名、身份證號、年齡、性別和出生地;

查詢人員中是否有你的同鄉。

 

package Test;

public class Student implements Comparable<Student> {

    private String name;
    private String number ;
    private String sex ;
    private int age;
    private String province;
   
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getnumber() {
        return number;
    }
    public void setnumber(String number) {
        this.number = number;
    }
    public String getsex() {
        return sex ;
    }
    public void setsex(String sex ) {
        this.sex =sex ;
    }
    public int getage() {

        return age;
        }
        public void setage(int age) {
            // int a = Integer.parseInt(age);
        this.age= age;
        }

    public String getprovince() {
        return province;
    }
    public void setprovince(String province) {
        this.province=province ;
    }

    public int compareTo(Student o) {
       return this.name.compareTo(o.getName());
    }

    public String toString() {
        return  name+"\t"+sex+"\t"+age+"\t"+number+"\t"+province+"\n";
    }    
}

 

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;
                
             }

   

 }








//jiekouwenjiaan


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+"\t"+sex+"\t"+age+"\t"+id+"\t";

}

 

實驗4:內部類語法驗證實驗

實驗程式1:

編輯、除錯執行教材246-247頁程式6-7,結合程式執行結果理解程式;

瞭解內部類的基本用法。

實驗程式2

編輯、除錯執行教材254頁程式6-8,結合程式執行結果理解程式;

瞭解匿名內部類的用法。

實驗截圖:

實驗程式3

elipse IDE中除錯執行教材257-258頁程式6-9,結合程式執行結果理解程式;

瞭解靜態內部類的用法。

實驗截圖:

實驗總結:通過本週實驗學習了介面,lambda表示式與內部類,學習了其定義瞭解了其用法,但是在真正寫程式的應用中並不能很好的掌握和應用,對淺拷貝和深拷貝不明白,寫程式時還有困難,然後自己會                   好好看程式碼、多多練習編碼的編寫;這次的實驗編寫程式碼的確實有困難。