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

1. 本周学习总结

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

1.2 使用常规方法总结其余上课内容。编程

多态性的应用:数组

instanceof运算符: 经过 instanceof判断父类引用所引用的对象实例的实际类型;将父类强制转换成子类以前,应使用instanceof进行检查或说判断。app

动态绑定:运行时可以自动地选择调用哪一个方法。ide

2. 书面做业

  • Q1.注释的应用函数

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

    类注释方法:测试

    /**网站

    .......注释的内容ui

    /


方法注释:

  • Q2.面向对象设计(大做业1,很是重要)

    2.1 将在网上商城购物或者在班级博客进行学习这一过程,描述成一个故事。

    在京东购买耳机。打开京东购物网站,在搜索栏中输入关键字“耳机”。进一步进行精确筛选例如品牌、佩戴方式、功能用途等。肯定搜索范围以后可选择按照综合、销量、评论、新品和价格这几种方式排序查看商品。找到满意的商品,点击查看详细信息,想要购买就点击“加入购物车”,最后在个人购物车中进行商品结算。

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

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

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

  • Q3.ManagerTest.zip代码分析

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

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

    public Employee(String n, double s, int year, int month, int day)//父类Employee的函数
         {
        name = n;
        salary = s;
        GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
        hireDay = calendar.getTime();
         }
    
    
       public double getSalary()//父类Employee的函数
         {
            return salary;
         }
    
    
       public Manager(String n, double s, int year, int month, int day)//子类Manager中的函数
         {
            super(n, s, year, month, day);
            bonus = 0;
         }
      
    
         public double getSalary()//子类Manager中的函数
         {
            double baseSalary = super.getSalary();
            return baseSalary + bonus;
         }

    可见Manager类中,super(n, s, year, month, day)是利用关键字super来调用父类的构造函数对自身进行初始化,复用了name、salary、year、month、day这五个属性;double baseSalary = super.getSalary()也是调用父类方法。

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

    答:若是有重写父类的方法,调用方法是子类的,若是调用父类的须要使用关键字super.方法。

    3.3 文件第26行e.getSalary(),究竟是调用Manager类的getSalary方法仍是Employee类的getSalary方法。

    答:Employee类的方法

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

    答:子类调用父类的构造方法,可减小代码量,也更简洁。

    Q4.Object类

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

    import java.util.*;
      class  Fruit{
      	private String name;
      }
      public class Main {
          public static void main(String[] args) {
              System.out.println(new Fruit());
          }
      }

    结果:Fruit@15db9742。

    java中,每一个类都是Object的子类,而Object有个toString方法。
    在你的代码中,你直接打印了一个类,他会调用这个类的toString方法,若是你不覆盖这个方法,它就调用Object的toString方法,结果默认是这个类的类型加上内存的地址。

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

    父类toString方法仍然存在,若是想要复用其父类的toString方法,用super.调用方法便可。代码以下:

    import java.util.*;
      class  Fruit{
      	private String name;
      	public String toString() {
              return "name "+super.toString();
          }
      }
      public class Main {
          public static void main(String[] args) {
              System.out.println(new Fruit());
               }
      }

    输出结果为:name Fruit@15db9742

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

    Object的equal类比较两个变量在内存中的指针指向是否相同,即比较二者是否为“同一个”。

    class  Fruit{
      	private String name;
      	Fruit(String name){
      		this.name=name;
      	}
      
      	@Override
      	public String toString() {
      		return "name "+super.toString();
      	}
      
      	@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 Main {
          public static void main(String[] args) {
          	
          	 Fruit fruit1=new Fruit("apple");
               Fruit fruit2=new Fruit("apple");
               Fruit fruit3=new Fruit("watermelon");
               System.out.println(fruit1.equals(fruit2));
               System.out.println(fruit1.equals(fruit3));
               }
      }

    运行结果为:

    true

    false

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

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

    参考文件:PersonTest.java

    5.1 画出类的继承关系

    5.2 读懂main函数,将本身推测的出代码运行结果与真正运行结果进行比较。尝试分析缘由

    运行结果如图:

    Person类被abstract修饰,是一个抽象类,抽象类不能被直接实例化,只能做为其它类的父类。剩下的四个类中,Employee和Student类继承Person类的输出格式是输出本身特有的属性,而后调用父类的toString()方法;Manager和Programmer继承Employee类,因此它们的输出格式有两次嵌套

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

    (1)子类中里面使用了super构造函数,做用是调用父类的构造方法.

    (2)若是将子类中的super构造函数去掉,则编译时会调用父类无参构函数。编译出错。

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

    (1)首先每一个类中都用了toString()方法,但输出结果都不相同;其次子类类型的引用变量便可以引用本类对象,也可引用父类对象。
    
    (2)
      把不一样的子类对象都看成父类来看,能够屏蔽不一样子类对象之间的差别,写出通用的代码,作出通用的编程,以适应需求的不断变化。 赋值以后,父对象就能够根据当前赋值给它的子对象的特性以不一样的方式运做。

    (3)多态与继承、重载并非孤立的,他们之间存在着紧密的联系,多态是创建继承、重载这二者的基础之上。多态应用的三个条件:继承、子类对象指向父类引用、重写。

3. 码云代码提交记录

4. PTA实验

题目集:jmu-Java-03-面向对象1-基础-封装继承 中的

函数(4-1, 4-2, 4-3,4-4较难选作)

编程(5-4, 5-5, 5-6)

必定要有实验总结

本次的收获:

4-1:用super关键字调用父类方法。

4-3:运用DecimalFormat方法保留小数、重写equal方法。

5-4:用abstract修饰类,经过继承的关系来实现代码的复用。

5-5:重写equals判断对象是否在数组中存在。

相关文章
相关标签/搜索