zoukankan      html  css  js  c++  java
  • 201771010128王玉兰《面向对象程序设计(Java)》第八周学习总结

    第一部分:理论知识部分总结

    (1)接口:接口不是类,而是对类胡一组需求描述,由常量肯一组抽象方法组成。

    a:接口中不包括变量和有具体实现的方法

    b:只要类实现了接口,则该类要遵从接口描述的统 一格式进行定义,并且可以在任何需要该接口的 地方使用这个类的对象。

    c:接口声明方式: public interface 接口名 { …… } 接口体中包含常量定义和方法定义,接口中只进 行方法的声明,不提供方法的实现。接口类似建立类的继承关系,接口也可以扩展。 接口的扩展技术使得从具有较高通用性的接口存在 多条链延伸到具有较高专用性的接口。 

    d:接口的实现:在类声明时用implements关键字声明使用一个或 多个接口 class Employee implementsPrintable { …… } 一个类使用了某个接口,那么这个类必须实现该 接口的所有方法,即为这些方法提供方法体。 一个类可以实现多个接口,接口间应该用逗号分 隔开。 class Employee implements Cloneable,Comparable

    e:接口的使用:接口不能构造接口对象,但可以声明接口变量以 指向一个实现了该接口的类对象。

    (2)接口与抽象类

    抽象类:用abstract来声明,没有具体实例对象的类,不 能用new来创建对象。可包含常规类所包含的任何东西。 抽象类必须由子类继承,如果abstract类的子类不是抽 象类,那么子类必须重写父类中所有的abstract方法。 接口:用interface声明,是抽象方法和常量值定义的集 合。从本质上讲,接口是一种特殊的抽象类,这种抽象 类中只包含常量和方法的定义,而没有变量和方法的定 义。接口中只能定义抽象方法,而且这些方法默认为是 public的。只要类实现了接口,就可以在任何需要该接 口的地方使用这个类的对象。此外,一个类可以实现多 个接口。
    (3)接口与抽象类的区别:

    1)接口不能实现任何方法,而抽象类可以。

    2)类可以实现许多接口,但只有一个父类。

    3)接口不是类分级结构的一部分,无任何联 系的类可以实现相同的接口。

    (4)接口与回调

    a:回调(callback):一种程序设计模式,在这种模 式中,可指出某个特定事件发生时程序应该采取 的动作。

    b:接口在java.swing包中有一个Timer类,可以使用它 在到达给定的时间间隔时触发一个事件。

    (5)浅层拷贝与深层拷贝

    浅层拷贝:被拷贝对象的所有常量成员和基本类 型属性都有与原来对象相同的拷贝值,而若成员 域是一个对象,则被拷贝对象该对象域的对象引 用仍然指向原来的对象。

    深层拷贝:被拷贝对象的所有成员域都含有与原 来对象相同的值,且对象域将指向被复制过的新对 象,而不是原有对象被引用的对象。

    (6)lambda表达式

    Java Lambda 表达式是Java 8 引入的一个新的功能,主 要用途是提供一个函数化的语法来简化编码。 

    (7)内部类

    内部类(inner class)是定义在一个类内部的类。 外层的类成为外部类(outer class). 内部类主要用于事件处理。 使用内部类的原因有以下三个:

    –内部类方法可以访问该类定义所在的作用域中 的数据,包括私有数据。

    –内部类能够隐藏起来,不为同一包中的其他类 所见。

    –想要定义一个回调函数且不想编写大量代码时, 使用匿名内部类比较便捷。

    内部类可以直接访问外部类的成员,包括 private成员,但是内部类的成员却不能被外部 类直接访问。

    第二部分:实验部分

    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;
    
    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);//Arrays类的sort方法
    
          // 打印Employee对象的信息
          for (Employee e : staff)
             System.out.println("name=" + e.getName() + ",salary=" + e.getSalary());
          //按工资高低进行排序输出
       }
    }
    
    package interfaces;
    //将类声明为实现某个接口,需要使用关键字implements
    public class Employee implements Comparable<Employee>
    {
    	//定义两个私有属性
       private String name;
       private double salary;
     //构造方法
       public Employee(String name, double salary)
       {
          this.name = 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
        */
     //compareTo方法的实现
       public int compareTo(Employee other)
       {
          return Double.compare(salary, other.salary);
       }
    }
    

     运行结果:

    测试程序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:

    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)
       { 
    	//构造这个类的一个对象,并将它传递给Timer构造器
          ActionListener listener = new TimePrinter();
          Timer t = new Timer(10000, listener);
          // Timer构造器的第一个参数是发出通告的时间间隔,单位是毫秒,每隔10秒打印一条消息。第二个参数是监听器对象
          t.start();//启动定时器
    //显示一个包含一条消息和OK按钮的对话框
          JOptionPane.showMessageDialog(null, "Quit program?");
          System.exit(0);
       }
    }
    //定义一个实现ActionListener接口的类
    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//try里面可能出现的错误
          {
             Employee original = new Employee("John Q. Public", 50000);
             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();
          }
       }
    }
    
    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();
       }
    //创建深拷贝的clone方法
       public Employee clone() throws CloneNotSupportedException
       //如果在一个对象上调用clone,但这个对象的类并没有实现Cloneable接口,Object类的clone方法就会抛出一个CloneNotSupportedException
       {
          // call Object.clone()
          Employee cloned = (Employee) super.clone();//super的父类是object
    
          // 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 + "]";
       }
    }
    

    运行结果:

    实验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" };
          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:");
          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()));
          /**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);         
       }
    }
    

     运行结果:

    注:以下实验课后完成

    实验3: 编程练习

    l  编制一个程序,将身份证号.txt 中的信息读入到内存中;

    l  按姓名字典序输出人员信息;

    l  查询最大年龄的人员信息;

    l  查询最小年龄人员信息;

    l  输入你的年龄,查询身份证号.txt中年龄与你最近人的姓名、身份证号、年龄、性别和出生地;

    l  查询人员中是否有你的同乡。

    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);
          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 TimePerine();
          Timer t = new Timer(interval, listener);
          t.start();
       }
    //TimePerine类位于TalkingClock类内部
    public class TimePerine 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  了解匿名内部类的用法。

    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();
          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);//避免产生名字冲突,将Pair定义为ArrayAlg的内部公有类
          System.out.println("min = " + p.getFirst());
          System.out.println("max = " + p.getSecond());//minmax方法的调用者可以使用getFirst和getSecond方法获得答案
       }
    }
    //minmax方法可以返回一个Pair类型的对象
    class ArrayAlg
    {
       /**
        * A pair of floating-point numbers
        */
    //定义一个包含两个值的类Pair
       public static class Pair//只用内部类可以声明为static
       {
          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);
    
       }
    }
    

     运行结果:

    实验总结:

    本章我们学习了接口的相关知识,接口与继承类似可以扩展,用关键字extends,通过这次实验测试基本理解了接口与回调、Comparator接口、对象克隆方法等,其中对象克隆有深层拷贝和浅层拷贝,课本上的具体图示更好帮助我们理解了这两概念;老师在周四的实验中着重强调要掌握lambada表达式,关于代码的注释,还需要加强,学长也教会了不懂代码时要看源代码可以更好理解;学习Java的路上需要潜心钻研,与所学知识结合,尝试编辑程序。

  • 相关阅读:
    CodeForces 659F Polycarp and Hay
    CodeForces 713C Sonya and Problem Wihtout a Legend
    CodeForces 712D Memory and Scores
    CodeForces 689E Mike and Geometry Problem
    CodeForces 675D Tree Construction
    CodeForces 671A Recycling Bottles
    CodeForces 667C Reberland Linguistics
    CodeForces 672D Robin Hood
    CodeForces 675E Trains and Statistic
    CodeForces 676D Theseus and labyrinth
  • 原文地址:https://www.cnblogs.com/wang963/p/9824725.html
Copyright © 2011-2022 走看看