• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
齐畅
博客园    首页    新随笔    联系   管理    订阅  订阅
201521123073《Java程序设计》第4周学习总结

一. 本周学习总结

二. 书面作业

1.注释的应用


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

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

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

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

参考资料:
UML类图
面向对象案例-借款者姓名地址.zip


(2.1)
答:在淘宝网上购买衣服。打开淘宝,可以看到购物车、商品分类、搜索栏。在搜索栏上选择服装类,并输入"白衬衫",点击搜索。出现了关键字有关衬衫的全部商品,并按综合排序展现在眼前,除了综合排序还有销量、好评、价格,可供选择排序,可按相应要求进行筛选。可查看衣服的详细信息,将其入到购物车,可以看到总价,进行结算。


(2.2)


3.ManagerTest.zip代码分析

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

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

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

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

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


(3.1)代码如下:

  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();

   }
2.
 public Manager(String n, double s, int year, int month, int day)

   {
      super(n, s, year, month, day);//步骤1
      
      bonus = 0;
      
   }

答:方法2中的Manager类继承了方法①中的Employee类,步骤1用super语句调用了父类的方法①。在Manager类中并没有定义name,salary,hireday变量,是因为Manager是Employee的子类,已经复用了和这些变量相关的代码,不需要重新定义。


(3.2)答:主要区别是有无bonus,有bonus则是Manager类中的方法getSalary(),无则是Employee类的方法getSalary().如果想在子类中调用父类的方法,可以使用super.getSalary()来实现。


(3.3)答:调用Employee类的getSalary方法,定义boss时,boss.setBonus(5000)已经将bonus带入getSalary()中计算,再将boss赋给staff[0],得到的奖金已是用Manager类的getSalary方法计算过的,调用时的是Employee类的getSalary方法


(3.4)答:使用super调用父类的构造函数可以事代码简洁化,可以方便看清子类从父类继承的属性和子类特有的属性。如果把父类构造函数中的相关代码复制粘贴到Manager的构造函数中,首先碍于美观,其次占用了多余的空间,而且没有意义。


4.Object类

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

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

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

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


(4.1)答:运行结果:shapes.Fruit@15db9742

代码如下:
class Fruit{
    private String name;
}

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

(4.2)答:运行结果:
Fruit[name=null]
shapes.Fruit@15db9742

代码如下:
class Fruit{
        private String name;
        @Override
        public String toString() {
            return "Fruit [name=" + name + "]\n" + super.toString();
        }
        
}
    public class Main{
        public static void main(String[] args){
            System.out.println(new Fruit());
        }
    }

(4.3)答:运行结果:true

代码如下:
daimclass Fruit{
        private String name;
        public void setName(String name) {
            this.name = name;
        }
   ```python
   @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            return result;
        }
        @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.equals(other.name))
                return false;
            return true;
        }
}
    public class C{
        public static void main(String[] args){
            Fruit fruit1 = new Fruit();
            fruit1.setName("orange");
            Fruit fruit2 = new Fruit();
            fruit2.setName("orange");           
            System.out.println(fruit1.equals(fruit2));
        }
    }

(4.4)答:运行结果:
contain
[apple,pear,orange]

代码如下:
import java.util.*;
public class ArrayListfruit {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        String fruit[] ={"apple","pear","apple","orange"} ;     
        for (int i = 0;i<4;i++) {
            String o = fruit[i];
            if (list.contains(o)) {
                System.out.println("contain");
            } else {
                list.add(o);
            }           
        }       
        System.out.println(list);
    }
}

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

5.1 画出类的继承关系

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

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

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

(5.1)


(5.2)

答:Person类是一个抽象类,是一个不存在实例化的对象。Employee、Student、Manager和Programmer这四个类会输出自己特有的成员变量,然后再调用父类的同名方法,对于Manager和Programmer这两个类,因为他们的父类Employee类也是继承Person类,所以他们会有两层嵌套。


(5.3)
答:1.调用父类的函数方法;
2.会出现错误
因为隐式的超级构造函数person()是未定义的。必须显式调用另一构造函数。


(5.4)

答:
(1)体现多态:主函数中,子类引用赋给父类类型对象。
将不同子类的对象归为一类,进行统一操作。
(2)多态的好处:
1. 可替换性
2. 可扩充性。
3. 接口性
4. 灵活性
5. 简化性
(3)多态与继承的关系:
1. 继承:子类继承父类中所以的属性和方法,但是对于private的属相和方法,由于这个是父类的隐私,所以子类虽然是继承了,但是没有可以访问这些属性和方法的引用,所以相当于没有继承到。很多时候,可以理解为,没有继承。
2. 多态:就是父类引用可以持有子类对象。这时候只能调用父类中的方法,而子类中特有方法是无法访问的,因为这个时候(编译时)你把他看作父类对象的原因,但是到了运行的时候,编译器就会发现这个父类引用中原来是一个子类的对像,所以如果父类和子类中有相同的方法时,调用的会是子类中的方法,而不是父类的。
参考文件:PersonTest.java
参考文件:PersonTest.java
**


三. 码云代码提交记录

四. PTA实验

1.当有涉及到动态数组的时候要记得用ArrayList
2.子类是不能继承父类中private修饰的方法或变量的。
3.要用到super()去调用父类中构造的函数,不然子类是无法去继承父类中构造的函数的。
4.DecimalFormat 是 NumberFormat的一个具体子类,用于格式化十进制数字。bf.format()返回的是字符串,要使用equal进行比较

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

posted on 2017-03-18 11:29  齐畅  阅读(177)  评论(2)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3