201521123010 《Java程序设计》第4周学习总结

  • 1.本周学习总结

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

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

这周上课主要学了继承,在打代码的时候对各个关键字(除了super关键字)的用法有一点混乱。对多态和继承的区别也有点混淆,努力百度中。有时候上课感觉听多了但一到打代码就啥都不会了,可能是因为没巩固好。
  • 2. 书面作业

① 注释的应用

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


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

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

A:

用户打开网页登录系统,浏览网页所列出的商品,经过挑选点击选择满意商品的数量与种类加入购物车。在购物车查看自己已选商品,确认数量与种类后点击结算,付账后系统将生成订单。
  • 2.2 通过这个故事我们能发现谁在用这个系统,系统中包含的类及其属性方法,类与类之间的关系。尝试找到这些类与属性,并使用思维导图描述类、属性、方法及类与类之间的关系。


③ ManagerTest.zip代码分析

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

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

A:

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;
   }

用到了getSalary方法,n、s、year、month、day这几个属性。
  • 3.2 Employee类及其子类Manager都有getSalary方法,那怎么区分这两个方法呢?

A:

   父类:
   public double getSalary()
   {
      return salary;
   }
   子类:
   public double getSalary()
   {
      double baseSalary = super.getSalary();
      return baseSalary + bonus;
   }

由程序可见,父类与子类方法不同的区别是子类会用super关键字来表示,故以此来区分父类与子类。
  • 3.3 文件第26行e.getSalary(),到底是调用Manager类的getSalary方法还是Employee类的getSalary方法。

A:

由以上截图可以看出,此行的e.getSalary()是调用Employee类的方法`。
  • 3.4 Manager类的构造函数使用super调用父类的构造函数实现了代码复用,你觉得这样的有什么好处?为什么不把父类构造函数中的相关代码复制粘贴到Manager的构造函数中,这样看起来不是更直观吗?

A:

自己觉得实现代码复用可以省点事,但查了一下百度,得知了:重新使用已有代码可以降低成本、增加代码的可靠性并提高它们的一致。既然如此,有了更高效的方法可以实现低成本,那如果再复制粘贴浪费空间,是没有必要的。

④ Object类

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

A:

package ex2;
class Fruit{         //定义类为Fruit
  private String name;  //定义这个类的私有属性name(名字)
}
public class test201{
  public static void main(String[] args){  //main函数,程序运行的入口。
  System.out.println(new Fruit());
  }
}
由于没有extends自任何类,故默认继承了Object为父类,并调用了Fruit的toString()方法。

显示如下:

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

A:

package ex2;
class Fruit{         //定义类为Fruit
  private String name;  //定义这个类的私有属性name(名字)

@Override
public String toString() {      //调用toString()方法
	return "I'M A Mango";
}
  
}
public class test201{
  public static void main(String[] args){  //main函数,程序运行的入口。
  System.out.println(new Fruit());
  }
}

调用了新增的toString方法后,其父类中的toString方法的代码不会没有。
若同时想用复用父类的方法,只要结合super关键字来复用即可。如return ""I'M A Mango" + super.toString();

显示结果如下:

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

A:

public boolean equals(Object obj) {
    return (this == obj);
}
功能如下:

package ex2;
class Fruit{         //定义类为Fruit
  private String name;  //定义这个类的私有属性name(名字)

  public Fruit(String name){
	  this.name =  name;
  }
  @Override
  public String toString() {
	return "I'M A Mango";
  }
  public boolean equals(Object obj) {
  if(this == obj)
    return true;
  if(obj == this)
    return false;
  
  return true;
  }
}

public class test201{
  public static void main(String[] args){  //main函数,程序运行的入口。
	  Fruit a = new Fruit("I'M A Mango");
	  Fruit b = new Fruit("I'M A mango");
	  
          System.out.println(a.equals(a));
          System.out.println(a.equals(b));
  }

}
运行结果如下:

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

A:

可以将其主函数改为如上图:


可以看一下ArrayList的contatins方法的源代码为:
public boolean contains(Object o) {
    return indexOf(o) >= 0;
    }
 public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
        if (elementData[i]==null)
            return i;
    } else {
        for (int i = 0; i < size; i++)
        if (o.equals(elementData[i]))
            return i;
    }
    return -1;
    }
 public boolean equals(Object obj) {
    return (this == obj);
    }

可以发现在contains方法会调用o.equals(elementData[i])方法来比较两个对象的引用是否相同。故功能是以此来实现的。



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

  • 5.1 画出类的继承关系

A:

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

A:

会显示为:
Manager [bonus=12000.3, toString()=Employee [salary=90000.1, toString()=Person [name=Clark, adress=GE, phonenumber=111, email=111@mail.com, age=10, gender=mail]]]
Student [status=1, toString()=Person [name=wang, adress=110, phonenumber=15959, email=15959@163.com, age=18, gender=male]]
Employee [salary=1000.0, toString()=Person [name=zhang, adress=136, phonenumber=1360, email=1360@mail.com, age=21, gender=female]]
Programmer [allowance=50000.0, toString()=Employee [salary=100000.0, toString()=Person [name=Gates, adress=usa, phonenumber=911, email=911@com, age=59, gender=male]]]

可以看出:继承了Person类的Student类和Employee类比继承了Employee类的Manager类和Programmer类少了一层嵌套。因为Employee类在被继承前也继承了Person类,故出现此结果。
  • 5.3 子类中里面使用了super构造函数,作用是什么?如果将子类中的super构造函数去掉,行不行?

A:

作用是引用当前对象的直接父类中的成员。不知道答案,故查询了一下之后总结出:其实可以不用显式的写出super,但前提是“超类中有多个构造方法,且有一个是显式写出的无参的构造方法”。但此代码中没有类符合条件,故不可以。
  • 5.4 PersonTest.java中的代码哪里体现了多态?你觉得多态有什么好处?多态和继承有什么关系吗?

A:

for (Person person : peoples) {
     System.out.println(person);
     }
在代码里这里体现了多态。

百度到了比较具体完整的答案:多态对已存在的代码具有可替换性、可扩充性、接口性、灵活性、简化性,可以增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。也在应用中体现了灵活多样的操作,提高了使用效率。并且简化了对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时可以看出其优点。
我认为,多态最大的好处对于现在我们来说应该是其灵活性比较强,并且比较简便,在编写多态方法时,所有重载的方法所执行的目的是相同的,但其参数也许不同。所以可以屏蔽不同子类对象之间的差异,写出通用的代码以适应需求的不断变化。  

  • 3. 码云代码提交记录

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


  • 4. PTA实验

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

5-4

发现对于子类的一些定义不是很清楚,一边搜索一边打代码,有时对于类与类的调用会由混淆。

5-5

这道会比5-4简单一些,按照题目要求写即可。

5-6

一看题目就比较复杂,还在写。。对ArrayList之类的实在不熟悉。

posted @ 2017-03-15 17:10  徐鹿林  阅读(286)  评论(10编辑  收藏  举报