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

    1. 本周学习总结

    1.1 尝试使用思维导图总结有关继承的知识点。

    1.2 使用常规方法总结其他上课内容。

    这个思维导图比较简单,详细内容点击此处

    2. 书面作业

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

    public class Circle {
     private double r;
     
     public Circle(double r) {
      this.r = r;
     }
     
     public double getR() {
      return r;
     }
     
     public void setR(double r) {
      this.r = r;
     }
     
     /**
      * 面积
      * 
      * @return
      */
     public double getArea() {
      return Math.PI * Math.pow(r, 2);
     }
     
     /**
      * 周长
      * 
      * @return
      */
     public double getLong() {
      return Math.PI * r * 2;
     }
    }
    
    class Cylinder extends Circle {
     private double h;
     
     public Cylinder(double r, double h) {
      super(r);
      this.h = h;
     }
     
     public double getH() {
      return h;
     }
     
     public void setH(double h) {
      this.h = h;
     }
     
     /**
      * 体积 = 底面积*高
      * 
      * @return
      */
     public double getVolume() {
      return super.getArea() * h;
     }
     
     /***
      * 表面积=测面积+2个底面积
      * 
      * @return
      */
     public double getSurfacearea() {
      return super.getLong() * h + 2 * super.getArea();
     }
     
    }
    

    面向对象设计

    2.1 将在网上商城购物或者在班级博客进行学习这一过程,描述成一个故事。(不得少于50字,参考QQ群中PPT的范例)

    答: 感觉自己的电脑有点卡顿,于是我想要去淘宝买一个新的笔记本电脑。我先打开淘宝网,输入用户名和密码,进入购物页面,我先找到数码产品这一项,然后再其中找到笔记本电脑,在笔记本下选择宏碁笔记本电脑,在3000-4000价位上选择了其中一款,并把它加入了购物车,然后成功支付。

    2.2 通过这个故事我们能发现谁在用这个系统,系统中包含的类及其属性方法,类与类之间的关系。尝试找到这些类与属性,并使用思维导图描述类、属性、方法及类与类之间的关系。

     

    ManagerTest.zip代码分析

    分析ManagerTest.zip中的代码,回答几个问题:

    3.1 在本例中哪里体现了使用继承实现代码复用?回答时要具体到哪个方法、哪个属性。

    class Manager extends Employee
    {
       /**
        * @param n the employee's name
        * @param s the salary
        * @param year the hire year
        * @param month the hire month
        * @param day the hire day
        */
       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;
       }
    
       public void setBonus(double b)
       {
          bonus = b;
       }
    
       private double bonus;
    }
    

    Manager继承了Employee类的getSlaray()方法,name、salary、hireDay等属性。

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

    答:子类中:

     public double getSalary()
       {
      double baseSalary = super.getSalary();
      return baseSalary + bonus;
       }
    

    在子类中用super关键字来调用父类的函数。

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

    调用的是Employee类的getSalary方法。因为for循环里调用的是Employee类

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

    减少了代码的数量,提高了我们的效率,避免了一些不必要的错误

    Object类

    4.1 编写一个Fruit类及属性String name,如没有extends自任何类。使用System.out.println(new Fruit());是调用Fruit的什么方法呢?该方法的代码是从哪来的?尝试分析这些代码实现了什么功能?

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

    运行结果:Fruit@2a139a55**

    会输出这种结果是因为系统调用了Fruit.toString方法,而该方法的代码来自于Object类,因为当自己写的类没有是写入自己的方法时,系统默认自己写的类继承自Object类。我们进入查看println的源代码,会发现如下代码段:

    public void println(Object x) {
            String s = String.valueOf(x);
            synchronized (this) {
                print(s);
                newLine();
            }
        }
    

    从println的源代码可以看出,object类的输出是一串字符串。

    4.2 如果为Fruit类添加了toString()方法,那么使用System.out.println(new Fruit());调用了新增的toString方法。那么其父类中的toString方法的代码就没有了吗?如果同时想要复用其父类的toString方法,要怎么操作?(使用代码演示)

    class Fruit{
        private String name;
    
        @Override
        public String toString() {
            return "Apple";
        }
    }
    
    public class som {
    
        public static void main(String[] args) {
            System.out.println(new Fruit());
    
        }
    
    }
    

    运行结果为:Fruit@2a139a55
         Fruit [name=null]**

    4.3 Fruit类还继承了Object类的eqauls方法。尝试分析其功能?自己编写一个equals方法覆盖父类的相应方法,功能为当两个Fruit对象name相同时(忽略大小写),那么返回true。(使用代码证明你自己覆盖的eqauls方法是正确的)

    ①先new两个对象并赋值:

    public static void main(String[] args) {
        Fruit[] fruit = new Fruit[2];
        fruit[0] = new Fruit("orange");          //小写橘子
        fruit[1] = new Fruit("Orange");          //大写橘子
        System.out.println(fruit[0].equals(fruit[1]));
    }
    

    ②利用Elipse自动生成功能:

     class Fruit{
        private String name;
    
        public Fruit() {
        }
        public Fruit(String name) {
            this.name = name;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Fruit other = (Fruit) obj;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equalsIgnoreCase(other.name))    //这行改一下,因为题目要求忽略大小写
                return false;
            return true;
        }
    
    }
    

    4.4 在4.3的基础上使用ArrayList<Fruit> fruitList存储多个fruit,要求如果fruitList中已有的fruit就不再添加,没有的就添加进去。请编写相关测试代码。并分析ArrayList的contatins方法是如何实现其功能的?

    代码阅读:PersonTest.java(abstract、多态)

    5.1 画出类的继承关系

    5.2 读懂main函数,将自己推测的出代码运行结果与真正运行结果进行比较。尝试分析原因

    推测:根据年龄升序排序这些员工的信息并打印;
    for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++)
    if (peoples[j].getAge() > peoples[j + 1].getAge()) {
    Person temp = peoples[j];
    peoples[j] = peoples[j + 1];
    peoples[j + 1] = temp;
    }
    }
    该代码将各个person的age进行比较,将age大的person与age小的person进行交换往数组后推,即冒泡排序。`

    5.3 子类中里面使用了super构造函数,作用是什么?如果将子类中的super构造函数去掉,行不行?

    子类中里面使用了super构造函数的作用是:调用父类的构造函数。
    不能将子类中的super构造函数去掉,原因:创建子类时父类构造函数无论如何都会被调用,如果子类构造函数没有显式地调用父类的构造函数,则自动调用父类默认无参构造函数,如果父类无相应无参构造函数,则会出错。拿这个程序来说,恰好其属于父类无相应无参构造函数(都需要参数),所以会编译错误。`

    5.4 PersonTest.java中的代码哪里体现了多态?你觉得多态有什么好处?多态和继承有什么关系吗?

    体现多态的地方:
    for (Person person : peoples) {
    System.out.println(person);
    }//父类类型变量引用所有子类对象,这行代码根据不同的子类实现相应的toString方法。 多态的好处("一个接口,多种实现"):(1)减少相似的代码,节省空间,提高效率。(2)有利于增添新类或修改子类。(3)提高了代码的扩展性。 多态与继承的关系:多态与继承中的方法重写密切相关,在方法中接收父类类型作为参数,在方法实现中调用父类类型的各种方法。当把子类作为参数传递给这个方法时,JVM会根据实际创建的对象类型,调用子类中相应的方法。

    3. 码云代码提交记录

    在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

    4. PTA实验

    题目集:jmu-Java-03-面向对象1-基础-封装继承 中的
    函数(4-1, 4-2, 4-3,4-4较难选做)
    编程(5-4, 5-5, 5-6)

    总结:这周时间没有安排好,pta实验还没来的及做,计划下周补上!

  • 相关阅读:
    Sprinig.net 双向绑定 Bidirectional data binding and data model management 和 UpdatePanel
    Memcached是什么
    Spring.net 网络示例 codeproject
    jquery.modalbox.show 插件
    UVA 639 Don't Get Rooked
    UVA 539 The Settlers of Catan
    UVA 301 Transportation
    UVA 331 Mapping the Swaps
    UVA 216 Getting in Line
    UVA 10344 23 out of 5
  • 原文地址:https://www.cnblogs.com/fenm/p/6576058.html
Copyright © 2011-2022 走看看