第4周作业-面向对象设计与继承

1. 本周学习总结

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

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

2. 书面作业

1注释的应用

使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看。(截图)
 ![](http://images2015.cnblogs.com/blog/1109836/201703/1109836-20170318142637135-557666807.png)
 ![](http://images2015.cnblogs.com/blog/1109836/201703/1109836-20170318142644838-182773030.png)

2面向对象设计(大作业1,非常重要)

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

最近手特别痒,想上天猫去买一件牛仔裤,我点进了360浏览器,进入了天猫商城,在搜索商品处搜索:“男青年潮流牛仔裤春夏”,然后我看中了一条裤子,进入商品详情,加入购物车。进入购物车界面选择数量1件,选择31码,点击结算,选择购买运费险,确认付款。

 ![](http://images2015.cnblogs.com/blog/1109836/201703/1109836-20170318145500588-1105462701.png)
 ![](http://images2015.cnblogs.com/blog/1109836/201703/1109836-20170318145520510-522136325.png)
 ![](http://images2015.cnblogs.com/blog/1109836/201703/1109836-20170318145532166-1998100958.png)

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

3 尝试使用Java代码实现故事中描述的这一过程(不必很完善),将来要在这个基础上逐渐完善、扩展成一个完整的面向对象的系统。(可选:加分)

3ManagerTest.zip代码分析

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

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

{
   /**
    * @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;
   }

Manager继承了Employee的函数构造方法,以及后面的getSalary(),继承了name,salary,hileday属性。

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

    在子类中访问父类getSalary()方法时,可以用super的方法
   {
      double baseSalary = super.getSalary();
      return baseSalary + bonus;
   }

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

{
   public static void main(String[] args)
   {
      // construct a Manager object
      Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
      boss.setBonus(5000);

      Employee[] staff = new Employee[3];
 for (Employee e : staff)
         System.out.println("name=" + e.getName() + ",salary=" + e.getSalary());
   }

staff是Employee类型,所以你的e.getSalary是调用的Employee中的getSalary方法。

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

使用了代码复用可以简化代码,提高代码的运行效率,使用super直接调用可以避免冗长的代码。

4Object类

 ###1 编写一个Fruit类及属性String name,如没有extends自任何类。使用System.out.println(new Fruit());是调用Fruit的什么方法呢?该方法的代码是从哪来的?尝试分析这些代码实现了什么功能?
public class Grade {
       public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(new Fruit());
    }
}
class Fruit{
    private String  name;
}

运行时会显示:
它调用的是object的toString函数。

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

父类中的toString并没有消失,只是其子类中的toString变化了而已。如若要复用弗雷德toString方法,需要加上super。

public class Grade {
       public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(new Fruit());
    }
}
class Fruit{
    private String  name;
    public String toString() {
      return super.toString();
  }
}

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

	if(this==object)
		return true;
	if(object==null)
		return false;
    if(name==null){
    	return false;
    }
    else if(!name.equalsIgnoreCase(this.name))
    	return false;
    return true;
}
}

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

{
    public static void main(String[] args) 
    {
        ArrayList<Fruit> fruitList=new ArrayList<Fruit>();
        fruitList.add(new Fruit());
        Fruit a=new Fruit();
        if(!fruitList.contains(a)) fruitList.add(a);
    }
}

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

1 画出类的继承关系

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

建立了一个抽象类person,用来被调用,然后Student、Employee、Manager和Programmer这四个类,都会先输出自己特有的成员变量:status、salary、bonus、allowance,然后调用继承父类的同名方法。又Manager和Programmer这两个类来继承了Employee类。

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

    子类里使用super构造函数,可以直接调用父类中的函数和属性以及方法,如果去掉了super构造函数,则无法调用父类的构造函数。

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

每个子类的toString方法体现了继承的多态性。

		for (Person person : peoples) {
			System.out.println(person);
		}

$多态的好处:
- 可替换性。多态对已存在的代码具有可替换性。
- 可扩充性。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际 上新加子类更容易获得多态功能。  
- 接口性。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。  
- 灵活性。它在应用中体现了灵活多样的操作,提高了使用效率。  
- 简化性。多态简化了对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。值得注意的是,多态并不能够解决提高执行速度的问题,因为它基于动态装载和地址引用,或称动态绑定。

$多态和继承的关系:
继承即子类继承父类中所以的属性,方法和否早函数,实现代码的复用,多态是子类继承父类时拥有同一个方法名。
如果父类和子类中有相同的方法时,调用的会是子类中的方法,而不是父类的。
参考文件:PersonTest.java

3. 码云代码提交记录

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

4. PTA实验

题目集:jmu-Java-03-面向对象1-基础-封装继承 中的
函数(4-1, 4-2, 4-3,4-4较难选做)
编程(5-4, 5-5, 5-6)
一定要有实验总结
1.用了super方法来调用父类,可以减少代码的编写,简化程序。
2.在子类中调用父类的函数时要加super,这也可以区分开父类和子类中相同的函数。
3.在eclipse中有很多IDE工具,可以使编写代码时可以简单很多。
4.父类中的private变量和函数,在子类中时无法继承过来的。
5.虽然java的知识已经都弄懂了,但是要使用这些知识来编写函数还是要熟能生巧。

posted @ 2017-03-18 16:26  毛卓  阅读(343)  评论(1编辑  收藏  举报