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

1. 本周学习总结

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

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

- 了解了多态就是以单一的接口操作多种类型的对象,但是对多态和继承的关系还是有点混乱。
- 学会了如何去设计一个类,尽量用private修饰属性,public修饰方法。
- 强制转换只能在继承层次内进行类型转换,而且将父类强制转换成子类之前,应该用instanceof进行检查。

2. 书面作业

1.注释的应用

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

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

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

答:由于某种需要,我必须去学数据库,于是在天猫上搜索关于数据库的书,找到了一本《深入浅出MySQL 数据库开发 优化与管理维护》,点击该商品进入后宝贝详情界面后,仔细看了一遍,再看了一下书的价格决定购买,就登录了自己的天猫账户,然后点击加入购物车。再想了想没什么要买的了,于是进入购物车结算,在结算页面中,核对了总计金额之后,点击了付款,完成了此次购物。

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

3.ManagerTest.zip代码分析

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

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

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 Manager(String n, double s, int year, int month, int day)
   {
      super(n, s, year, month, day);
      bonus = 0;
   }

答:上面这段代码体现了使用继承实现代码复用,子类Manager继承了父类Employee,用到了public Employee(String n, double s, int year, int month, int day)方法,并且用了name、salary、hireday属性。

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

答:Employee类是父类,所以它的getSalary方法在被使用时要表示为super.getSalary(),以此来区别子类Manager中的getSalary方法。

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

答:调用的是Employee类的getSalary方法。

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

答:最大好处就是能够减少我们代码数量,避免我们重复地敲相同的代码,可以很大提高我们敲代码的效率;而且,代码复用能使代码简洁明了,如果代码需要修改的时候就比较方便。而如果把父类构造函数中的相关代码复制粘贴到Manager的构造函数中,虽然看起来直观,但是要修改的时候就需要寻找相同地方不断修改,比较麻烦。

4.Object类

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

代码为:

运行结果是:

 调用了Object的toString()方法,该方法的代码是来自系统默认的java.lang包中。实现了将对象表现输出的功能。

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

答:父类中的toString方法的代码还在,如果同时想要复用其父类的toString方法,可以用super来调用,也可以在创建对象的时候就定义为父类的,就可以调用父类的toString方法了。

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

答:equals 方法是String类从它的超类Object中继承的,被用来检测两个对象的内容是否相等。

代码如下:

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

代码为

public static void main(String[] args) {
        ArrayList<Fruit> list=new ArrayList<Fruit>();
        Scanner scan=new Scanner(System.in);        
        while(scan.hasNext()){
            String s=scan.nextLine();
            if(s.equals("end"))
                break;
            Fruit f=new Fruit(s);
            if(!list.contains(f)){
                list.add(f);
            }
        }
        System.out.println(list.toString());
        scan.close();
}

运行结果是:

apple
apple
banana
end
[Fruit [name=apple], Fruit [name=banana]

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

5.1 画出类的继承关系

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

答:真正运行结果

分析:
Student、Employee、Manager和Programmer这四个类,都会先输出自己特有的成员变量,然后调用父类的同名方法。又Manager和Programmer这两个类继承了Employee类,所以会出现如上图情况。

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

答:作用是调用父类的构造函数;不能去掉,如果去掉子类中的super构造函数,编译就会出错,因为没有super,编译器会默认调用父类Employee的无参构造函数,而父类Employee并没有这个无参构造,所以会出错。

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

参考文件:PersonTest.java

答:体现多态的代码为:
for (Person person : peoples) {
            System.out.println(person);
        }
多态最大好处是对已存在代码具有可替换性,在抽象类中只需要定义一个方法,在具体的类中就可以用相同的方法名去做具体的实现,能提高很大效率。多态是使用单一接口操作多种类型的对象。多态与继承、方法重写密切相关,继承服务于多态,多态也不能单独使用,即多态与继承相互作用。

3. 码云代码提交记录

4. PTA实验实验总结

(1)定义抽象类的时候,包含抽象方法的类必须声明为抽象类,但抽象类可以不包含任何抽象方法,只需要使用abstract关键字修饰就行。
(2)继承父类,在子类中使用父类的属性和方法,用extends,后接父类,在子类中,若子类要使用与父类同名却不同效果的方法时,可以自己编写方法。
(3)通过super来调用父类方法可以在子类中少写一些相同属性和方法,不过要注意super调用的格式。

posted on 2017-03-18 18:32  是噜噜啊  阅读(287)  评论(0编辑  收藏  举报

导航