zoukankan      html  css  js  c++  java
  • 201871010113刘兴瑞《面向对象程序设计(java)》第八周学习总结 201871010113

    项目

    内容

    这个作业属于哪个课程

    <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/

    这个作业的要求在哪里

    <作业链接地址>https://www.cnblogs.com/nwnu-daizh/p/11703678.html

    作业学习目标

    1. 掌握接口定义方法;
    2. 掌握实现接口类的定义要求;
    3. 掌握实现了接口类的使用要求;
    4. 理解程序回调设计模式;
    5. 掌握Comparator接口用法;
    6. 掌握对象浅层拷贝与深层拷贝方法;
    7. 掌握Lambda表达式语法;
    8. 了解内部类的用途及语法要求。

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

    一: 接口:

    ●Java为了克股单继承的缺点。Java使用了接口,一个类可以实现一个或多个接口.

    ●在Java中。 接口不是类而是对类的一组需求描述。由常量和一组抽象方法组成.

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

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

    ●声明方式: public interface 接口名

                        {     ......     }

    ●接口体中包含常量定义和抽象方法定义,接口中只进行方法的声明,不提供方法的实现。

    ●接口的实现:

      class Employee implements Printable

       {     ......       }

      一个类使用了某个接口,那么这个类必须实现该接口的所有方法。一个类可以实现多个接口,接口间应该用逗号间隔开。

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

    二:接口示例:

    ●接口与回调:回调:一种程序设计模式,可以指出某个特定事件发生时应该采取的动作。java.swing包中Timer类,可以使用它在到达给定的时间间隔时触发一个事件。

    ●Comparator接口:所在包是Java.util.*

    ●对象克隆:

      当拷贝一个对家文里时,原始变量与拷贝变量引用同-个对象。这样,改变一个变里所引用的对象会对另一个变量产生影响。

      如果要创建一个对象新的copy,它的最初状态与original一样,但以后可以各自改变状态,就需要使用0bject类的clone方法。

    三:Lambda表达式:

    ●Java Lambda主要用途是提供一个函数化的语法来简化编码。

    ●Lambda表达式本质上是-一个匿名方法。

    ●Lambda 表达式的语法基本结构

    (arguments) > body

    有如下几种情况:

    ●参数类型可推导时.不得要指定类型.如(a)> System.out.println(a)

    ●只有一个参数且类型可推导时。不强制写()

    ●参数指定类型时。必须有括号。

    四:内部类:
    ●内部类可以直接访问外部类的成员保括private成员,但是内部类的成员却不能被外部类直接访问。
    ●在内部类对象保存了一个对外部类对象的引用,当内部类的成员方法中访问某一变量时, 如果在该方法和内部类中都未定义过这个变里,内部类中对变里的引用会被传递给外部类对象的引用。
    局部内部类
    ●内部类并非只能在类内定义,也可以在程序块内定义局部内部类。例如,在方法中,甚至在for循环体内部。

    ●局部内部类不能用publi c或pr ivate访问修饰符进行声明,它的作用域被限定在声明这个局部类的块中。

    匿名内部类
    ●若只创建类的一个对象,则不必为该类命名,这种类称为匿名内部类。
    ●由于匿名类没有类名,所以匿名类不能有构造器,取而代之的是将构造器参数传递给超类的构造器。若匿名内部类实现接口时,则匿名内部类不能有任何构造参数。
    ●如果构造参数的闭圆括号跟一个开花括号,表明正在定义的就是匿名内部类

    第二部分:实验部分

    实验1 导入第6章示例程序,测试程序并进行代码注释。

    测试程序1

    1.编辑、编译、调试运行阅读教材214页-215页程序6-1、6-2,理解程序并分析程序运行结果;

    2.在程序中相关代码处添加新知识的注释。

    3.掌握接口的实现用法;

    4.掌握内置接口Compareable的用法。

    EmployeeSortTest.java代码如下:

    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)
       {
          var 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发表方法可以对对象数组进行排序,但必须满足<对象所属的类必须实现了Comparable接口
    
          //输出所有雇员的信息
          for (Employee e : staff)
             System.out.println("name=" + e.getName() + ",salary=" + e.getSalary());
       }
    }

    Employee.java代码如下:

    package interfaces;
    
    public class Employee implements Comparable<Employee>
    //用关键字implements将类声明为实现某个接口,并且为泛型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
        */
       //任何实现Comparable接口的类都需要包含compareTo方法
       public int compareTo(Employee other)
       //使用静态Double.compare方法,如果第一个参数小于第二个参数,返回一个负值;相等返回零;否则返回正值
       {
          return Double.compare(salary, other.salary);
       }
    }

    程序运行如下:

    改变排序属性为name:

    EmployeeSortTest.java代码如下:

    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)
       {
          var 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发表方法可以对对象数组进行排序,但必须满足<对象所属的类必须实现了Comparable接口
    
          //输出所有雇员的信息
          for (Employee e : staff)
             System.out.println("name=" + e.getName() + ",salary=" + e.getSalary());
       }
    }

    Employee.java代码如下:

    package interfaces;
    
    public class Employee implements Comparable<Employee>
    //用关键字implements将类声明为实现某个接口,并且为泛型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
        */
       //任何实现Comparable接口的类都需要包含compareTo方法
       public int compareTo(Employee other)
       //str1.compareTo(str2)比较字符串大小
       {
          return name.compareTo(other.name);
       }
    }

    程序结果如图:

    总结:这个实验让我了解了接口的实现用法,以及内置接口Compareable的用法,还有对象数组的排序要求,更改排序属性让我更加了解到compareTo方法的应用。

    测试程序2:

    编辑、编译、调试以下程序,结合程序运行结果理解程序;

    程序代码如下:

    interface  A
    //定义了一个接口A
    {
      double g=9.8;
      void show( );
    }
    class C implements A//实现接口
    {
      //方法
      public void show( )
      {
    	  System.out.println("g="+g);
      }
    }
    
    class test
    {
      public static void main(String[ ] args)
      {
           A a=new C( );
           //接口变量必须引用实现了接口的类对象
         
           a.show( );//引用方法
           System.out.println("g="+C.g);
      }
    }

    运行结果如图:

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

    测试程序3:

    1. 在elipse IDE中调试运行教材223页6-3,结合程序运行结果理解程序;

    2. 26行、36行代码参阅224页,详细内容涉及教材12章。

    3. 在程序中相关代码处添加新知识的注释。掌握回调程序设计模式;

    程序代码如下:

    package timer;
    
    /**
       @version 1.02 2017-12-14
       @author Cay Horstmann
    */
    
    import java.awt.*;
    import java.awt.event.*;
    import java.time.*;
    import javax.swing.*;
    import javax.swing.Timer;//在到达给定时间间隔时发出通告
    
    public class TimerTest
    {  
       public static void main(String[] args)
       {  
    	   //构造类对象
          var listener = new TimePrinter();
    
          //传递对象给Timer构造器
          var timer = new Timer(10000, listener);//第一个参数是发出通告的时间间隔,单位为毫秒;第二个对象是监听器对象
          timer.start();//启动定时器
    
          //程序启动后,将会显示一个包含"Quit program?"字样对话框
      JOptionPane.showMessageDialog(null, "Quit program?");
          System.exit(0);
       }
    }
    
    class TimePrinter implements ActionListener//ActionListener接口
    {  
       //当到达指定时间间隔时定时器调用actionPerformed方法
       public void actionPerformed(ActionEvent event)//ActionEvent参数提供了时间的相关信息
       {  
          System.out.println("At the tone, the time is " 
             + Instant.ofEpochMilli(event.getWhen()));
          Toolkit.getDefaultToolkit().beep();
       }
    }
    

     运行结果如图:

    总结:了解到回调程序设计模式:指出某个特定事件发生时应该采取的动作。和java.swing包中Timer类的作用。

    测试程序4:

    1. 调试运行教材229页-231页程序6-4、6-5,结合程序运行结果理解程序;

    2. 在程序中相关代码处添加新知识的注释。

    3. 掌握对象克隆实现技术;

    4.掌握浅拷贝和深拷贝的差别。

    CloneTest.java代码:

    package clone;
    
    /**
     * This program demonstrates cloning.
     * @version 1.11 2018-03-16
     * @author Cay Horstmann
     */
    public class CloneTest
    {
       public static void main(String[] args) throws CloneNotSupportedException
       {
          var original = new Employee("John Q. Public", 50000);
          original.setHireDay(2000, 1, 1);
          //clone方法 创建新对象copy,初始状态与Original相同,之后有不同的状态
          Employee copy = original.clone(); 
          copy.raiseSalary(10);
          copy.setHireDay(2002, 12, 31);
          System.out.println("original=" + original);
          System.out.println("copy=" + copy);
       }
    }
    

    Employee.java代码:

    package clone;
    
    import java.util.Date;
    import java.util.GregorianCalendar;
    
    public class Employee implements Cloneable //深拷贝的clone方法
    {
       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
       //如果在一个对象上调用clone,如果对象的类没有实现Cloneable的接口。clone方法就会抛出CloneNotSupportedException
       {
          //调用Object.clone()方法
          Employee cloned = (Employee) super.clone();
          //克隆可变字段
          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 + "]";
       }
    }

    程序运行如下:

    总结:对象克隆需要实现Cloneable接口,如果没有实现Cloneable接口,且调用了Object的clone()方法,就会抛出CloneNotSupportedException异常 ,在类中覆盖超类的clone方法需要声明为public。

    实验2 导入第6章示例程序6-6,学习Lambda表达式用法。

    1. 调试运行教材233页-234页程序6-6,结合程序运行结果理解程序;

    2. 在程序中相关代码处添加新知识的注释。

    3. 将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)
       {
          var planets = new String[] { "Mercury", "Venus", "Earth", "Mars", 
             "Jupiter", "Saturn", "Uranus", "Neptune" };
          //toString方法输出planets对象
          System.out.println(Arrays.toString(planets));
          System.out.println("Sorted in dictionary order:");
          //Arrays.sort方法按照字符顺序排序
          Arrays.sort(planets);
          System.out.println(Arrays.toString(planets));
          System.out.println("Sorted by length:");
          //Arrays.sort方法按照字符串长度排序
          Arrays.sort(planets, (first, second) -> first.length() - second.length());
          System.out.println(Arrays.toString(planets));
                
          //lambda表达式: (argument)-> body
          var timer = new Timer(1000, event -> System.out.println("The time is " + new Date()));
          timer.start();   
             
          //直到选择OK程序将一直进行
          JOptionPane.showMessageDialog(null, "Quit program?");
          System.exit(0);         
       }
    }

    程序运行如图:

    总结:lambda表达式可以简化代码,只有一个参数且类型可推导时不强制写()。

    实验3: 编程练习

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

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

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

    4. 查询最小年龄人员信息;

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

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

    程序代码如下:

    package Six;
    
    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<Student> studentlist;
        public static void main(String[] args) {
            studentlist = new ArrayList<>();
            Scanner scanner = new Scanner(System.in);
            File file = new File("D:\\身份证号.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 number = linescanner.next();
                    String sex = linescanner.next();
                    String age = linescanner.next();
                    String province =linescanner.nextLine();
                    Student student = new Student();
                    student.setName(name);
                    student.setnumber(number);
                    student.setsex(sex);
                    int a = Integer.parseInt(age);
                    student.setage(a);
                    student.setprovince(province);
                    studentlist.add(student);
    
                }
            } 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("a.字典排序");
                System.out.println("b.输出年龄最大和年龄最小的人");
                System.out.println("c.寻找老乡");
                System.out.println("d.寻找年龄相近的人");
                System.out.println("e.退出");
                String m = scanner.next();
                switch (m) {
                case "a":
                    Collections.sort(studentlist);              
                    System.out.println(studentlist.toString());
                    break;
                case "b":
                     int max=0,min=100;
                     int j,k1 = 0,k2=0;
                     for(int i=1;i<studentlist.size();i++)
                     {
                         j=studentlist.get(i).getage();
                     if(j>max)
                     {
                         max=j; 
                         k1=i;
                     }
                     if(j<min)
                     {
                       min=j; 
                       k2=i;
                     }
                     
                     }  
                     System.out.println("年龄最大:"+studentlist.get(k1));
                     System.out.println("年龄最小:"+studentlist.get(k2));
                    break;
                case "c":
                     System.out.println("老家?");
                     String find = scanner.next();        
                     String place=find.substring(0,3);
                     for (int i = 0; i <studentlist.size(); i++) 
                     {
                         if(studentlist.get(i).getprovince().substring(1,4).equals(place)) 
                             System.out.println("老乡"+studentlist.get(i));
                     }             
                     break;
                     
                case "d":
                    System.out.println("年龄:");
                    int yourage = scanner.nextInt();
                    int near=agenear(yourage);
                    int value=yourage-studentlist.get(near).getage();
                    System.out.println(""+studentlist.get(near));
                    break;
                case "e":
                    isTrue = false;
                    System.out.println("退出程序!");
                    break;
                    default:
                    System.out.println("输入有误");
    
                }
            }
        }
            public static int agenear(int age) {      
            int j=0,min=53,value=0,k=0;
             for (int i = 0; i < studentlist.size(); i++)
             {
                 value=studentlist.get(i).getage()-age;
                 if(value<0) value=-value; 
                 if (value<min) 
                 {
                    min=value;
                    k=i;
                 } 
              }    
             return k;         
          }
    
    }
    
    
    package Six;
    
    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";
        }    
    }
    

     运行结果如图:

     

    实验总结:在这次实验中我大致掌握接口定义方法;实现接口类的定义要求,实现了接口类的使用要求,理解程序回调设计模式,掌握了Comparator接口用法:对象克隆需要实现Cloneable接口,如果没有实现Cloneable接口,且调用了Object的clone()方法,就会抛出CloneNotSupportedException异常 ,掌握到对象浅层拷贝与深层拷贝方法了解到它们的区别,Lambda表达式语法等等的要求。这次的实验让我收获很多在学长讲解之后,对代码有了更多的理解。

  • 相关阅读:
    把影响集中到一个点
    How to avoid Over-fitting using Regularization?
    适定性问题
    Numerical Differentiation 数值微分
    What Every Computer Scientist Should Know About Floating-Point Arithmetic
    Generally a good method to avoid this is to randomly shuffle the data prior to each epoch of training.
    What is the difference between iterations and epochs in Convolution neural networks?
    Every norm is a convex function
    Moore-Penrose Matrix Inverse 摩尔-彭若斯广义逆 埃尔米特矩阵 Hermitian matrix
    perl 类里的函数调用其他类的函数
  • 原文地址:https://www.cnblogs.com/lxr0/p/11697177.html
Copyright © 2011-2022 走看看