java第四次作业

(一)学习总结

1.学习使用思维导图对Java面向对象编程的知识点(封装、继承和多态)进行总结。

2.阅读下面程序,分析是否能编译通过?如果不能,说明原因。应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来?
不能通过编译。
原因:父类构造函数在子类构造函数中被调用必须是第一句。
修改:将super("Hello.Grandparent.");置于构造方法的第一句。
运行结果:

GrandParent Created.String:Hello.Grandparent.
Parent Created
Child Created

在继承操作中,对于子类对象的实例化也是有要求的,子类对象在实例化之前必须首先调用父类中的构造方法之后再调用子类自己的构造方法。java子类继承父类为单继承,即一个子类只能有一个父类,就像现实生活中先有父亲才能有孩子,父类中的构造方法就像父亲的基因,先有父亲的基因然后才能传递给孩子,所以子类构造方法调用之前必须先调用父类的构造方法,顺序不能颠倒。
3 . 阅读下面程序,分析程序中存在哪些错误,说明原因,应如何改正?正确程序的运行结果是什么?
错误:animal为Animal类的对象,Animal类中无sleep方法。 animal.sleep();出错。 Dog dog = animal;对象向下转型应明确指出要转型的子类类型。 dog = (Dog)animal2;向下转型前必须产生向上转型。
改正:

class Animal{
  void shout(){
      System.out.println("动物叫!");
  }
}
class Dog extends Animal{
      public void shout(){  
          System.out.println("汪汪......!");  
     }
      public void sleep() {
       System.out.println("狗狗睡觉......");
      } 
}
public class Test{
    public static void main(String args[]) {
        Animal animal = new Dog(); 
        animal.shout();
        ((Dog) animal).sleep();
        Dog dog = (Dog) animal;
        dog.sleep(); 
        Animal animal2 = new Dog();
        dog = (Dog)animal2;
        dog.shout();
    }
}

运行结果:

汪汪......!
狗狗睡觉......
狗狗睡觉......
汪汪......!

4.运行下列程序
问题:java所有类都有一个公共的父类Object,toString方法是Object中的常用方法,子类中不覆写toStrong方法时,调用toString程序会随机给出地址信息,所有输出结果是Person@166afb3Person@166afb3
修改:

class Person { 
   private String name ; 
   private int age ; 
   public Person(String name,int age){ 
         this.name = name ; 
         this.age = age ; 
   } 
   public String toString(){
	   return "name:"+this.name+"	"+"age:"+this.age ;
   }
}
public class Test{  
      public static void main(String args[]){ 
             Person per = new Person("张三",20) ; 
             System.out.println(per);
             System.out.println(per.toString()) ; 
  } 
}

(2)运行结果:

name:张三	age:20
name:张三	age:20

说明:程序中覆写了toString方法,输出对象信息时调用的是子类中覆写的toString方法
5.其他总结内容
.继承:子类无条件继承父类的无参构造方法 子类可通过super关键字调用父类的构造方法
.抽象类:抽象类必须有子类,不能使用final关键字声明,可以有构造方法
.final关键字:final关键字不能有子类 final声明的方法不能被子类继承 使用final声明的方法不能被子类覆写,使用final声明的变量即为常量,需为其指定内容,static final联合声明的为全局常量
.接口:接口的使用也要通过子类实现,一个子类可以实现多个接口,一个接口不能继承抽象类,一个抽象类可以实现多个接口,接口可以通过extends继承多个接口
.多态:对象的向上转型:转型之后,操作的为父类对象,则无法找到子类中定义的新方法 对象的向下转型:如果想要产生一个对象向下转型则必须产生向上转型关系,表示子类与父类关系的建立
.instanceof关键字:判断一个对象到底是哪个类的实例。

(二)实验总结

1.定义员工类,具有姓名、年龄、性别属性,并具有构造方法和显示数据方法。定义管理层类,继承员工类,有自己的属性职务和年薪。定义职员类,继承员工类,并有自己的属性所属部门和月薪。定义一个测试类,进行测试。画出类图。
程序设计思路:定义一个父类员工类,定义管理层类和职员类为员工类的子类,子类继承父类的非私有属性。在测试类中初始化员工信息,显示员工信息。
类图:

2.按照下面要求完成类的设计
(1)设计一个平面图形抽象类(提供求该类对象周长和面积的方法)和一个立体图形抽象类(提供求该类对象表面积和体积的方法)
(2)设计球类、圆柱类,圆锥类、矩形类、三角形类、圆类,分别继承平面图形抽象类和立体图形抽象类。
(3)建立测试类,进行测试。画出类图。
程序设计思路:设计两个抽象类,矩形类、三角形类、圆类继承平面抽象类,球类、圆柱类,圆锥类继承立体抽象类实现抽象方法,在测试类中用户输入要计算的图形或几何体,调用方法完成。
类图:


3.. 参考类图,重构下面的实例,分析和理解多态的含义和用途
(1)某动物园有一饲养员小李,每天需要给他所负责饲养的一只狮子、五只猴子和十只鸽子喂食。 请用一个程序来模拟他喂食的过程。
分析这种编程方式有什么不合理的地方。
程序设计思路:设置Lion,Peigon,Monkey三个类,设置Feeder类在类中实现喂养方法,在测试类中分别实例化对象。
(2)第一次重构,引入继承,利用抽象类和对象多态重构程序,Animal类采用抽象类, 合并Feeder类中的方法
分析程序是否还可以进一步优化
程序设计思路:设置Animal抽象类,lion,peigon,monkey继承animal,实现抽象方法,feeder类中接收animal对象,判断对应对象输出相应语句
(3)第二次重构,修改feedAnimals方法,让它接收一个Animal数组
通过本题的重构,说一下多态有什么好处。在第二次重构之后,是否就能应对各种场景了呢?你认为还应该做哪些优化?
程序设计思路:feeder中feedanimal方法接收数组,对象多态判断具体对象实例。

(三)代码托管

原文地址:https://www.cnblogs.com/namtaehyun/p/6713608.html