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

时间:2023-03-09 05:41:36
201521123112《Java程序设计》第4周学习总结

1. 本周学习总结

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

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

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

  • 关于多态,多态性就是相同的形态,不同的定义。在简单点说的话就是不同类的对象对同一个消息作出的相应,举个栗子来说,比如说在操作电脑的时候,在PPT下按F1就是帮助与问答,在Eclipse下就会弹出控制台的帮助文档,同一个事件发生在不同的对象上面会产生不同的结果。多态的实现是仰仗于动态绑定,通过判断对象的实际类型,调用相应的方法。
  • 关于instanceof运算符,可以判断父类所引用的对象的实际类型,如果xxx instanceof xxxx 则会返回true,这个在后面进行强制转换时是很有用的。
  • 类型的转换不可以随意进行,是不安全的,只能在继承层次内进行类型转换,安全的强制转换类型方法是通过instanceof 进行转换。

2. 书面作业

1.注释的应用

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

首先是类的注释:

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

然后是方法的注释:

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

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

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

答:首先,要装成想要买书的样子,所以我上了亚马逊,输入了亚马逊的域名:

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

之后就要输入你的亚马逊账号和密码了(之前已经登录过了就不在退出和登陆了我怕忘记密码hhh)

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

然后这边当然是要假装一下要买java的书了!在搜索栏中输入java,在搜索栏中会跳出许多java类的指导书供选择

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

然后选择一本正在满减的书 java编程思想第四版! 在上面会贴有作者、价格等等本书的消息,下面还有选项可以加入购物车或者加入心愿单

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

这时候,我假装很喜欢这本书就把它加入了购物车,并且选择了货到付款

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

然后我十分肯定及确定想要这本书了,就要结账的时候,发现没钱,就把该书从购物车删除了,剧情结束

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

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

答:201521123112《Java程序设计》第4周学习总结

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

答:进入Amazon网站之后,在网页中有可以查看商品、查看购物车、查看心愿单等方法类:

public class Amazon{
    public void UserLogin(User);        //登录用户类
    public void ShowShoppingCart(Cart);        //购物车类
    public void ShowWishes(Wishes);        //心愿单类
}

登录类中:

public class UserLogin(){
private Sring UserName;        //用户名
private String PassWord;        //密码
}

购物车中:

public class ShowShoppingCart(){

public void add(){
/*
 *实现购买商品的增加
*/
}

public void delete(){
/*
 *实现购买商品的删除
*/
}

 public void purchase(){
/*
 *实现购买商品的购买
*/
}

(心愿单类与购物车类类似    不完善的不完善的... ... )

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

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

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

在Manager类中,getSalary()前面使用了super,直接复用了父类的代码,构造函数Manager与Employee共同具有的属性是name,salary,hireday。

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

  • 在部分的同名方法中,可以通过区分参数列表的方式来区分两个方法
  • 一般区分父类和子类的两个方法,主要是通过判断方法前面是否有super来判断,父类的关键字是super。

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

文件中第26行前后代码为:

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

通过代码中可以看出staff被创建为Employee类,所以26行的e.getSalary()是调用Employee类的方法。

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

答:我认为使用super调用父类函数可以用简单的一行继承相同的函数,可以大大减少代码的数量,提供写代码时候的效率。如果直接将父类构造函数中的相关代码复制粘贴到Manager中,看起来是比较直观,但是重复读取一串代码降低了代码的可读性,会使代码变得冗长,显得很low。

4.Object类

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

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

运行结果为:Homework.Fruit@139a55

由于该类没有继承任何父类,所以系统自动默认继承Object类。当直接输出某个对象的时候,会调用toString()的方法。

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

public class HTL {
    public static void main(String[] args) {
        System.out.println(new Fruit());
    }
}
class Fruit{
    private String  name;
    public String toString(){
    return "hhhhhh";
    //return super.toString();    如果复用父类的话则加super
}

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

public class HTL {
    public static void main(String[] args) {
        System.out.println(new Fruit());
    }
}
class Fruit{
    private String  name;
    public boolean equals(Object obj) {
    return (this == obj);
}
    }

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

5.1画出类的继承关系

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

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

代码运行结果:

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

因为Student、Employee、Manager和Programmer这四个类会使用toString()的方法输出成员变量,而Person类是一个抽象类,无法实例化对象,猜测与运行结果一致。

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

作用:调用父类的构造器

不可以将子类中的super构造函数去掉,去掉后编译器会调用父类无参构造器,然而在代码中父类没有无参构造器,所以会出现编译的错误。

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

体现多态的代码:

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

多态的好处:

1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态                                                    性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要
参考链接:https://zhidao.baidu.com/question/522525718170303205.html

关系:

继承:子类继承父类中所以的属性和方法,但是对于private的属相和方法,由于这个是父类的隐私,所以子类虽然是继承了,但是没有可以访问这些属性和方法的引用,所以相当于没有继承到。
多态:就是父类引用可以持有子类对象。这时候只能调用父类中的方法,而子类中特有方法是无法访问的,因为这个时候(编译时)你把他看作父类对象的原因,但是到了运行的时候,编译器就会发现这个父类引用中原来是一个子类的对像,所以如果父类和子类中    有相同的方法时,调用的会是子类中的方法,而不是父类的。
在Java中也可以这么说:编译时看父类,运行时看子类。
参考链接https://zhidao.baidu.com/question/338728339.html?fr=iks&word=java%D6%D0%B6%E0%CC%AC%BA%CD%BC%CC%B3%D0%B5%C4%B9%D8%CF%B5&ie=gbk

本题后两个问来自于网络上面的答案,自己确实想不到网上那么完善,所以就复制上答案,谅解谅解......

3. 码云代码提交记录

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

4. PTA实验

  • 4-1 使用super调用父类方法即可
  • 4-2 根据题目的要求,依次创建Computer、Double、Integer、String类,然后倒序输出
  • 5-4 通过定义一个父类Shape,让子类Rectangle与Circle分别继承父类