zoukankan      html  css  js  c++  java
  • 学号:201521123116 《java程序设计》第四周学习总结

    1. 本周学习总结

    2. 书面作业

    Q1. 注释的应用
    使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看。(截图)

    答:
    注释的插入:
    注释以/开始,以/结束
    类注释
    /**
    .......你要注释的内容
    /

    Q2.面向对象设计(大作业1,非常重要)
    2.1 将在网上商城购物或者在班级博客进行学习这一过程,描述成一个故事。(不得少于50字,参考QQ群中PPT的范例)
    2.2 通过这个故事我们能发现谁在用这个系统,系统中包含的类及其属性方法,类与类之间的关系。尝试找到这些类与属性,并使用思维导图描述类、属性、方法及类与类之间的关系。
    2.3 尝试使用Java代码实现故事中描述的这一过程(不必很完善),将来要在这个基础上逐渐完善、扩展成一个完整的面向对象的系统。(可选:加分)

    2.1答:小明平常喜欢购物,就经常在淘宝网上购物,他一般都在淘宝网首页挑选商品,买的大都是书籍,他看的一本书很是喜欢,就点进去查看书本详细信息,觉得还满意就先加入了购物车,后来又选了几本书,最后点击到购物车界面准备查看买了多少东西和多少钱,发现有点贵,就把一本书删除了。最后在网上用支付宝付完款。
    2.2答:小明在用这个购物系统,包含的类有商品,书籍类商品,其他商品,商品列表,购物车,支付宝。
    商品(Goods):属性有编号(id),名字(name),价格(price);
    书籍类商品(Books):继承商品类所有属性,特有属性有作者(author);(其他商品(Others)类似);
    商品列表(GoodsList):属性有商品(Goods),购物车(ShoppingCar),方法有搜索(search),筛选(select);
    购物车(ShoppingCar):属性有商品(Goods),总价(sumPrice),数目(nummber),方法有添加(add),删除(delete);
    支付界面(PayWay);属性有总价(sumPrice),方法有支付(pay);

    Q3:ManagerTest.zip代码分析
    分析ManagerTest.zip中的代码,回答几个问题:
    3.1 在本例中哪里体现了使用继承实现代码复用?回答时要具体到哪个方法、哪个属性。

    class Employee
    {
       public Employee(String n, double s, int year, int month, int day)
       {
          name = n;
          salary = s;
          GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
          hireDay = calendar.getTime();
       }
       public double getSalary()
       {
          return salary;
       }
    }
    
    class Manager extends Employee
    {
       public Manager(String n, double s, int year, int month, int day)
       {
          super(n, s, year, month, day);
          bonus = 0;
       }
    
       public double getSalary()
       {
          double baseSalary = super.getSalary();
          return baseSalary + bonus;
       }
    }

    其中Employee为父类,Manager为子类(Manager extends Employee);
    super(n, s, year, month, day);super关键字-调用父类的构造函数Employee;
    super.getSalary();super关键字-调用父类方法getSalary()。

    3.2 Employee类及其子类Manager都有getSalary方法,那怎么区分这两个方法呢?

    本例中子类Manager重新定义了父类Employee中已有的getSalary方法,所以如果调用父类该方法需写成super.getSalary();
    对于这种情况,JVM根据调用该方法的实际对象的类型来决定选择调用哪个方法。

    3.3 文件第26行e.getSalary(),到底是调用Manager类的getSalary方法还是Employee类的getSalary方法。

    Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
    boss.setBonus(5000);
    Employee[] staff = new Employee[3];
    staff[0] = boss;
    staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
    staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15);

    根据代码可得出:boss是Manager类,而staff[0] = boss;此时e.getSalary()调用Manager类的getSalary方法;
    staff数组为Employee类,其中staff[1] = new Employee,staff[2] = new Employee,此时e.getSalary()调用Employee类的getSalary方法。

    3.4 Manager类的构造函数使用super调用父类的构造函数实现了代码复用,你觉得这样的有什么好处?为什么不把父类构造函数中的相关代码复制粘贴到Manager的构造函数中,这样看起来不是更直观吗?

    代码复用的好处:无需重新编写相同的代码,节约了时间。
    因为JVM执行子类的构造函数之前,会先自动调用父类中的构造函数,其目的是帮助继承自父类的成员进行初始化操作,
    也就是说创建子类时父类构造函数无论如何都会被调用,所以没有必要把父类构造函数中的相关代码复制粘贴到Manager的构造函数中。

    Q4.Object类
    4.1 编写一个Fruit类及属性String name,如没有extends自任何类。使用System.out.println(new Fruit());是调用Fruit的什么方法呢?该方法的代码是从哪来的?尝试分析这些代码实现了什么功能?
    4.2 如果为Fruit类添加了toString()方法,那么使用System.out.println(new Fruit());调用了新增的toString方法。那么其父类中的toString方法的代码就没有了吗?如果同时想要复用其父类的toString方法,要怎么操作?(使用代码演示)
    4.3 Fruit类还继承了Object类的eqauls方法。尝试分析其功能?自己编写一个equals方法覆盖父类的相应方法,功能为当两个Fruit对象name相同时(忽略大小写),那么返回true。(使用代码证明你自己覆盖的eqauls方法是正确的)
    4.4 在4.3的基础上使用ArrayList

    4.1.编写的代码如下

    `class Fruit {
        private String name;
    }
    
    public class Main {
        public static void main(String[] args) {
            System.out.println(new Fruit());
        }
    }

    运行结果为:Fruit@2a139a55,调运了Fruit的toString方法呢,该方法的代码是从object类来,因为object是所有类的父类。功能就是输出“类名加上16进制的哈希码”形式字符串。

    4.2.在Fruit类添加了toString()方法后的代码

    class Fruit {
        private String name;
    
        public String toString() {
            return "Fruit [name=" + name + "]";
            //return "Fruit [name=" + name + "]\n"+super.toString();
        }
        
    }
    
    public class Main {
        public static void main(String[] args) {
            System.out.println(new Fruit().toString());
        }
    }

    调用了新增的toString方法,那么其父类中的toString方法的代码还在,如果同时想要复用其父类的toString方法,可运用super关键字,如上述代码中被注释部分,最后输出结果为:

    4.3
    答:Object类中的equals()方法是比较引用的,即引用相同就返回true,不同返回false。
    Eclipse中自动生成的eqauls方法如下


    输出结果为:

    4.4

    输出结果为:

    ArrayList的contatins方法实现分析:根据HashCode()地址计算的值作比较,如果相同则不用添加,否则添加。

    Q5.代码阅读:PersonTest.java(abstract、多态)
    5.1 画出类的继承关系
    5.2 读懂main函数,将自己推测的出代码运行结果与真正运行结果进行比较。尝试分析原因
    5.3 子类中里面使用了super构造函数,作用是什么?如果将子类中的super构造函数去掉,行不行?
    5.4 PersonTest.java中的代码哪里体现了多态?你觉得多态有什么好处?多态和继承有什么关系吗?

     
    (5.1)类的继承关系

     
    (5.2)建立Person()数组person[],长度为4,peoples[0]=new Employee,peoples[1] = new Student,peoples[2] = new Programmer,peoples[3] = new Manager,接着根据年龄大小,由小到大排序输出,与运行结果比较相同
     
    (5.3)使用super方法,可以调用在子类中方法与参数相同的父类的属性和方法;不行,若是去掉,则无法继承父类中的属性或方法,用不了,导致那些继承的属性用的是默认值
     
    (5.4)体现多态的代码:

    peoples[0] = new Employee("zhang", "136", "1360", "1360@mail.com", 21, "female", 1000.0);
    peoples[1] = new Student("wang", "110", "15959", "15959@163.com", 18, "male", "1");
    peoples[2] = new Programmer("Gates", "usa", "911", "911@com", 59, "male", 100000.0, 50000.0);
    peoples[3] = new Manager("Clark", "GE", "111", "111@mail.com", 10, "mail", 90000.1, 12000.3);
    

    创建父类的对象可以构造多个不同的对象(不同的类),节约成本(例如求圆和长方形的面积和周长的和,可以创建一个父类class Shape(){},存放形状属性,继承方法求面积和 和 周长和,这样可以在圆和长方形中直接用super()引用这个方法,节约成本);只有子类继承父类才能在建立对象时,有多个不同的对象(多态)

     

    3. 码云代码提交记录

    4. PTA实验实验总结

    (1)对toString()方法了解更加深刻;

    (2)开始没理解题目意思,一直通不过,后来问了下同学,原来是用父类开数组,然后每个元素用子类去实例化,最后输出;

    (3)抽象类的定义,用到abstract关键字,且抽象类是必须被继承的,在求周长和 和 面积和就可以在抽象类中定义,求周长和 和 面积和的方法代码一样,可以在抽象类Shape中编写

    (4)可以通过Eclipse中自动生成的代码完成大半。




  • 相关阅读:
    CF1264E Beautiful League 解题报告
    CF1411G No Game No Life 解题报告
    Data structure on Bitcoin
    bitcoin Cryptography
    弹性布局Flex的基本语法
    Linq操作list
    dt某字段赋值
    List 添加数据
    dt 转 json 转实体
    队列
  • 原文地址:https://www.cnblogs.com/gysbettrer/p/6574850.html
Copyright © 2011-2022 走看看