zoukankan      html  css  js  c++  java
  • 201771010112罗松《面向对象程序设计(java)》第六周学习总结

     

                                                                                                                                                                                                        实验六 继承定义与使用

    实验目的与要求:

    在软件开发中,通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。因此,类的继承性使所建立的软件具有开放性开放性、可扩充性,这是信息组织与分类的行之有效的方法,通过类的继承关系,使公共的特性能够共享,简化了对象、类的创建工作量,增加了代码的可重用性。运行时多态性是面向对象程序设计代码重用的一个最强大机制,Java多态性的概念也可以被说成一个接口,多个方法Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制。方法的重写Overriding和重载OverloadingJava多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被屏蔽了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)Overloaded的方法是可以改变返回值的类型。方法的重写Overriding和重载OverloadingJava多态性的不同表现。当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。 (但是如果强制把超类转换成子类的话,就可以调用子类中新添加而超类没有的方法了

    二、(1) 理解继承的定义;(2) 掌握子类的定义要求(3) 掌握多态性的概念及用法;(4) 掌握抽象类的定义及用途;(5) 掌握类中4个成员访问权限修饰符的用途;(6) 掌握抽象类的定义方法及用途;(7)掌握Object类的用途及常用API(8) 掌握ArrayList类的定义方法及用法;(9) 掌握枚举类定义方法及用途。

    2、实验内容和步骤

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

    测试程序1:在elipse IDE中编辑、调试、运行程序5-1 (教材152-153 ;掌握子类的定义及用法;结合程序运行结果,理解并总结OO风格程序构造特点,理解EmployeeManager类的关系子类的用途,并在代码中添加注释。

    测试实验结果如下:

     

     

    插入此程序的代码并对其进行注释,进行更深一步的理解

    ManaManager

     

    Emloyee:

     

     

    子类的定义:在有继承关系的类中extends前面的类则是子类。

    超类和子类都是Java程序员常用的两个类。

    测试程序2

        编辑、编译、调试运行教材PersonTest程序(教材163-165)

       掌握超类的定义及其使用要求;

       掌握利用超类扩展子类的要求;

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

      超类:如果在程序中没有明确的之处超类,Object就是被认为是这个类的超类,如:Public class Employee extebds Object.java中,每个类都是Object类扩展而来的。当然也可以使用Object类型的变量引用任何类型的对象。

    超类扩展子类的要求

    代码的注释:

     

     

     

     

    测试程序3

        编辑、编译、调试运行教材程序5-85-95-10,结合程序运行结果理解程序(教材174-177页);

        掌握Object类的定义及用法;

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

    Employee.java:

    package equals;

     

    import java.time.*;

    import java.util.Objects;

     

    public class Employee

    {

       private String name;

       private double salary;

       private LocalDate hireDay;

     

       public Employee(String name, double salary, int year, int month, int day)

       {

          this.name = name;

          this.salary = salary;

          hireDay = LocalDate.of(year, month, day);

       }

     

       public String getName()

       {

          return name;

       }

     

       public double getSalary()

       {

          return salary;

       }

     

       public LocalDate getHireDay()

       {

          return hireDay;

       }

     

       public void raiseSalary(double byPercent)

       {

          double raise = salary * byPercent / 100;

          salary += raise;

       }

     

       public boolean equals(Object otherObject)

       {

          // 看看这些对象是否相同

          if (this == otherObject) return true;

     

          // 如果显式参数为空,则必须返回false

          if (otherObject == null) return false;

     

          // 如果类不匹配,它们就不能相等

          if (getClass() != otherObject.getClass()) return false;

     

          // 现在我们知道otherObject是一个非空雇员

          Employee other = (Employee) otherObject;

     

          // 测试字段是否具有相同的值

          return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);

       }

     

       public int hashCode()

       {

          return Objects.hash(name, salary, hireDay);

       }

     

       public String toString()

       {

          return getClass().getName() + "[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay

                + "]";

       }

    }

    Manager.java:

    package equals;

     

    public class Manager extends Employee//子类Manager继承父类Employee

    {

       private double bonus;

     

       public Manager(String name, double salary, int year, int month, int day)

       {

          super(name, salary, year, month, day);

          bonus = 0;

       }

     

       public double getSalary()

       {

          double baseSalary = super.getSalary();

          return baseSalary + bonus;

       }

     

       public void setBonus(double bonus)

       {

          this.bonus = bonus;

       }

     

       public boolean equals(Object otherObject)

       {

          if (!super.equals(otherObject)) return false;

          Manager other = (Manager) otherObject;

          // super.equals检查这个和其他属于同一个类

          return bonus == other.bonus;

       }

     

       public int hashCode()

       {

          return java.util.Objects.hash(super.hashCode(), bonus);

       }

     

       public String toString()

       {

          return super.toString() + "[bonus=" + bonus + "]";

       }

    }

    Equals.java:

    package equals;

     

    /**

     * This program demonstrates the equals method.

     * @version 1.12 2012-01-26

     * @author Cay Horstmann

     */

    public class EqualsTest

    {

       public static void main(String[] args)

       {

          Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);

          Employee alice2 = alice1;

          Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);

          Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);

     

          System.out.println("alice1 == alice2: " + (alice1 == alice2));

     

          System.out.println("alice1 == alice3: " + (alice1 == alice3));

     

          System.out.println("alice1.equals(alice3): " + alice1.equals(alice3));

     

          System.out.println("alice1.equals(bob): " + alice1.equals(bob));

     

          System.out.println("bob.toString(): " + bob);

     

          Manager carl = new Manager("Carl Cracker", 80000, 1987, 12, 15);

          Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);

          boss.setBonus(5000);

          System.out.println("boss.toString(): " + boss);

          System.out.println("carl.equals(boss): " + carl.equals(boss));

          System.out.println("alice1.hashCode(): " + alice1.hashCode());

          System.out.println("alice3.hashCode(): " + alice3.hashCode());

          System.out.println("bob.hashCode(): " + bob.hashCode());

          System.out.println("carl.hashCode(): " + carl.hashCode());

       }

    }

    package equals;

     

    /**

     * This program demonstrates the equals method.

     * @version 1.12 2012-01-26

     * @author Cay Horstmann

     */

    public class EqualsTest

    {

       public static void main(String[] args)

       {

          Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);

          Employee alice2 = alice1;

          Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);

          Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);

     

          System.out.println("alice1 == alice2: " + (alice1 == alice2));

     

          System.out.println("alice1 == alice3: " + (alice1 == alice3));

     

          System.out.println("alice1.equals(alice3): " + alice1.equals(alice3));

     

          System.out.println("alice1.equals(bob): " + alice1.equals(bob));

     

          System.out.println("bob.toString(): " + bob);

     

          Manager carl = new Manager("Carl Cracker", 80000, 1987, 12, 15);

          Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);

          boss.setBonus(5000);

          System.out.println("boss.toString(): " + boss);

          System.out.println("carl.equals(boss): " + carl.equals(boss));

          System.out.println("alice1.hashCode(): " + alice1.hashCode());

          System.out.println("alice3.hashCode(): " + alice3.hashCode());

          System.out.println("bob.hashCode(): " + bob.hashCode());

          System.out.println("carl.hashCode(): " + carl.hashCode());

       }

    }

    测试程序4:

         elipse IDE中调试运行程序5-11(教材182页),结合程序运行结果理解程序;

         掌握ArrayList类的定义及用法;

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

    插入程序相关代码

    ArrayList.java:

    package arrayList;

     

    import java.util.*;

     

    /**

     * This program demonstrates the ArrayList class.

     * @version 1.11 2012-01-26

     * @author Cay Horstmann

     */

    public class ArrayListTest

    {

       public static void main(String[] args)

       {

          // 用三个Employee对象填充staff数组列表

          ArrayList<Employee> staff = new ArrayList<>();

     

          staff.add(new Employee("Carl Cracker", 75000, 1987, 12, 15));

          staff.add(new Employee("Harry Hacker", 50000, 1989, 10, 1));

          staff.add(new Employee("Tony Tester", 40000, 1990, 3, 15));

     

          // 把每个人的薪水提高5%

          for (Employee e : staff)

             e.raiseSalary(5);

     

          // 打印所有Employee对象的信息

          for (Employee e : staff)

             System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay="

                   + e.getHireDay());

       }

    }

    Employee.java:

    package arrayList;

     

    import java.time.*;

     

    public class Employee

    {

       private String name;

       private double salary;

       private LocalDate hireDay;

     

       public Employee(String name, double salary, int year, int month, int day)

       {

          this.name = name;

          this.salary = salary;

          hireDay = LocalDate.of(year, month, day);

       }

     

       public String getName()

       {

          return name;

       }

     

       public double getSalary()

       {

          return salary;

       }

     

       public LocalDate getHireDay()

       {

          return hireDay;

       }

     

       public void raiseSalary(double byPercent)

       {

          double raise = salary * byPercent / 100;

          salary += raise;

       }

    }

    package arrayList;

     

    import java.time.*;

     

    public class Employee

    {

       private String name;

       private double salary;

       private LocalDate hireDay;

     

       public Employee(String name, double salary, int year, int month, int day)

       {

          this.name = name;

          this.salary = salary;

          hireDay = LocalDate.of(year, month, day);

       }

     

       public String getName()

       {

          return name;

       }

     

       public double getSalary()

       {

          return salary;

       }

     

       public LocalDate getHireDay()

       {

          return hireDay;

       }

     

       public void raiseSalary(double byPercent)

       {

          double raise = salary * byPercent / 100;

          salary += raise;

       }

    }

    程序测试结果如下:

     

    测试程序5

        编辑、编译、调试运行程序5-12(教材189页),结合运行结果理解程序;

       掌握枚举类的定义及用法;

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

    插入实例程序的代码:

    package enums;

     

    import java.util.*;

     

    /**

     * This program demonstrates enumerated types.

     * @version 1.0 2004-05-24

     * @author Cay Horstmann

     */

    public class EnumTest

    {  

       public static void main(String[] args)

       {  

          Scanner in = new Scanner(System.in);

          System.out.print("Enter a size: (SMALL, MEDIUM, LARGE, EXTRA_LARGE) ");

          String input = in.next().toUpperCase();

          Size size = Enum.valueOf(Size.class, input);

          System.out.println("size=" + size);

          System.out.println("abbreviation=" + size.getAbbreviation());

          if (size == Size.EXTRA_LARGE)

             System.out.println("Good job--you paid attention to the _.");      

       }

    }

     

    enum Size

    {

       SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");

     

       private Size(String abbreviation) { this.abbreviation = abbreviation; }

       public String getAbbreviation() { return abbreviation; }

     

       private String abbreviation;

    }

    测试结果如下:

     

    实验2编程练习1

        定义抽象类Shape

      属性不可变常量double PI,值为3.14

      方法public double getPerimeter()public double getArea())

      让Rectangle与Circle继承自Shape类。

        编写double sumAllArea方法输出形状数组中的面积和和double sumAllPerimeter方法输出形状数组中的周长和。

      main方法中

    1)输入整型值n,然后建立n个不同的形状。如果输入rect,则再输入长和宽。如果输入cir,则再输入半径。
    2 然后输出所有的形状的周长之和,面积之和。并将所有的形状信息以样例的格式输出。
    3 最后输出每个形状的类型与父类型使用类似shape.getClass()(获得类型)shape.getClass().getSuperclass()(获得父类型);

    思考sumAllArea和sumAllPerimeter方法放在哪个类中更合适?

    输入样例:

    3

    rect

    1 1

    rect

    2 2

    cir

    1

    输出样例:

    18.28

    8.14

    [Rectangle [width=1, length=1], Rectangle [width=2, length=2], Circle [radius=1]]

    class Rectangle,class Shape

    class Rectangle,class Shape

    class Circle,class Shape

     程序相关代码:

    shape:

    package shape;

    import java.util.Scanner;

    public class Test {

     public static void main(String[] args) {

      Scanner in = new Scanner(System.in);

      System.out.println("个数");

      int a = in.nextInt();

      System.out.println("种类");

      String rect="rect";

            String cir="cir";

      Shape[] num=new Shape[a];

      for(int i=0;i<a;i++){

       String input=in.next();

       if(input.equals(rect)) {

       System.out.println("长和宽");

       int length = in.nextInt();

       int width = in.nextInt();

             num[i]=new Rectangle(width,length);

             System.out.println("Rectangle["+"length:"+length+"  "+width+"]");

             }

       if(input.equals(cir)) {

             System.out.println("半径");

          int radius = in.nextInt();

          num[i]=new Circle(radius);

          System.out.println("Circle["+"radius:"+radius+"]");

             }

             }

             Test c=new Test();

             System.out.println("求和");

             System.out.println(c.sumAllPerimeter(num));

             System.out.println(c.sumAllArea(num));

             

             for(Shape s:num) {

                 System.out.println(s.getClass()+","+s.getClass().getSuperclass());

                 }

             }

     

               public double sumAllArea(Shape score[])

               {

               double sum=0;

               for(int i=0;i<score.length;i++)

                   sum+= score[i].getArea();

                   return sum;

               }

               public double sumAllPerimeter(Shape score[])

               {

               double sum=0;

               for(int i=0;i<score.length;i++)

                   sum+= score[i].getPerimeter();

                   return sum;

               }    

    }

    Test:

    package shape;

    import java.util.Scanner;

    public class Test {

     public static void main(String[] args) {

      Scanner in = new Scanner(System.in);

      System.out.println("个数");

      int a = in.nextInt();

      System.out.println("种类");

      String rect="rect";

            String cir="cir";

      Shape[] num=new Shape[a];

      for(int i=0;i<a;i++){

       String input=in.next();

       if(input.equals(rect)) {

       System.out.println("长和宽");

       int length = in.nextInt();

       int width = in.nextInt();

             num[i]=new Rectangle(width,length);

             System.out.println("Rectangle["+"length:"+length+"  "+width+"]");

             }

       if(input.equals(cir)) {

             System.out.println("半径");

          int radius = in.nextInt();

          num[i]=new Circle(radius);

          System.out.println("Circle["+"radius:"+radius+"]");

             }

             }

             Test c=new Test();

             System.out.println("求和");

             System.out.println(c.sumAllPerimeter(num));

             System.out.println(c.sumAllArea(num));

             

             for(Shape s:num) {

                 System.out.println(s.getClass()+","+s.getClass().getSuperclass());

                 }

             }

     

               public double sumAllArea(Shape score[])

               {

               double sum=0;

               for(int i=0;i<score.length;i++)

                   sum+= score[i].getArea();

                   return sum;

               }

               public double sumAllPerimeter(Shape score[])

               {

               double sum=0;

               for(int i=0;i<score.length;i++)

                   sum+= score[i].getPerimeter();

                   return sum;

               }    

    }

    实验结果如下所示:

     

    实验3 编程练习2

    编制一个程序,将身份证号.txt 中的信息读入到内存中,输入一个身份证号或姓名,查询显示查询对象的姓名、身份证号、年龄、性别和出生地。

     插入程序代码:

    Main :

     

     本周学习package id1;

     

    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.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 year = linescanner.next();

                    String province =linescanner.nextLine();

                    Student student = new Student();

                    student.setName(name);

                    student.setnumber(number);

                    student.setsex(sex);

                    student.setyear(year);

                    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("1.按姓名查询");

                System.out.println("2.按身份证号查询");

                System.out.println("3.退出");

                int nextInt = scanner.nextInt();

                switch (nextInt) {

                case 1:

                    System.out.println("请输入姓名");

                    String studentname = scanner.next();

                    int nameint = findStudentByname(studentname);

                    if (nameint != -1) {

                        System.out.println("查找信息为:身份证号:"

                                + studentlist.get(nameint).getnumber() + "    姓名:"

                                + studentlist.get(nameint).getName() +"    性别:"

                                +studentlist.get(nameint).getsex()   +"    年龄:"

                                +studentlist.get(nameint).getyaer()+"  地址:"

                                +studentlist.get(nameint).getprovince()

                                );

                    } else {

                        System.out.println("不存在该学生");

                    }

                    break;

                case 2:

                    System.out.println("请输入身份证号");

                    String studentid = scanner.next();

                    int idint = findStudentByid(studentid);

                    if (idint != -1) {

                        System.out.println("查找信息为:身份证号:"

                                + studentlist.get(idint ).getnumber() + "    姓名:"

                                + studentlist.get(idint ).getName() +"    性别:"

                                +studentlist.get(idint ).getsex()   +"    年龄:"

                                +studentlist.get(idint ).getyaer()+"   地址:"

                                +studentlist.get(idint ).getprovince()

                                );

                    } else {

                        System.out.println("不存在该学生");

                    }

                    break;

                case 3:

                    isTrue = false;

                    System.out.println("程序已退出!");

                    break;

                default:

                    System.out.println("输入有误");

                }

            }

        }

     

        public static int findStudentByname(String name) {

            int flag = -1;

            int a[];

            for (int i = 0; i < studentlist.size(); i++) {

                if (studentlist.get(i).getName().equals(name)) {

                    flag= i;

                }

            }

            return flag;

        }

     

        public static int findStudentByid(String id) {

            int flag = -1;

     

            for (int i = 0; i < studentlist.size(); i++) {

                if (studentlist.get(i).getnumber().equals(id)) {

                    flag = i;

                }

            }

            return flag;

        }   

    Student:

     

     

     

    public class Student {

     

        private String name;

        private String number ;

        private String sex ;

        private String year;

        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 String getyaer() {

            return year;

        }

        public void setyear(String year ) {

            this.year=year ;

        }

        public String getprovince() {

            return province;

        }

        public void setprovince(String province) {

            this.province=province ;

        }

    }

    实验结果如下所示:

     实验总结:

    通过这一周的学习以及自己在后期的自学过程当中,我深入了解了什么叫做继承,以及在继承中所包含的类型有哪些。继承是用已有类来构建新类的一种机制,当定义了一个新类继承了一个类时,这个新类继承一个类时,这个新类就继承了这个类的方法和域。而且继承是具有层次的,其代码也是可重用的,可以轻松定义子类。首先在学习过程当中我们学习了类,超类和子类的定义,让我明白了父类和子类时相对的。还学习了泛型数组列表与对象包装器与自动装箱,在后面还介绍了反射的概念,它是在程序运行期间发现更多的类及其属性的能力。并体会颇多,在今后的日子里我会好好深入学习java知识。

     

  • 相关阅读:
    Leetcode 1489找到最小生成树李关键边和伪关键边
    Leetcode 113 路径总和 II
    hdu 1223 还是畅通工程
    hdu 1087 Super Jumping! Jumping! Jumping!
    hdu 1008 Elevator
    hdu 1037 Keep on Truckin'
    湖工oj 1241 畅通工程
    湖工oj 1162 大武汉局域网
    hdu 2057 A + B Again
    poj 2236 Wireless Network
  • 原文地址:https://www.cnblogs.com/xuezhiqian/p/9750573.html
Copyright © 2011-2022 走看看