java作业5

Java第四次作业——面向对象高级特性(继承和多态)

(一)学习总结

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

2.阅读下面程序,分析是否能编译通过?如果不能,说明原因。应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来?

class Grandparent {
    public Grandparent() {
        System.out.println("GrandParent Created.");
    }
    public Grandparent(String string) {
        System.out.println("GrandParent Created.String:" + string);
    }
}
class Parent extends Grandparent {
    public Parent() {        
        System.out.println("Parent Created");
        super("Hello.Grandparent.");
    }
}
class Child extends Parent {
    public Child() {
        System.out.println("Child Created");
    }
}
public class Test{
    public static void main(String args[]) {
        Child c = new Child();
    }
}

编译不能通过,在子类中一定要先调用父类的构造方法,然后在调用子类的构造方法。
修改之后运行结果为

不能反过来。构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。不能反过来调用也是这个原因,因为父类根本不知道子类有神魔变量而且这样一来子类也得不到初始化的父类变量,导致程序运行出错!

3 . 阅读下面程序,分析程序中存在哪些错误,说明原因,应如何改正?正确程序的运行结果是什么?

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();
        animal.sleep();
        Dog dog = animal;
        dog.sleep(); 
        Animal animal2 = new Animal();
        dog = (Dog)animal2;
        dog.shout();
    }
}

错误1:在进行向下转型的时候,没有进行强制转化。
Dog dog = animal 应该改为 Dog dog =(Dog)animal
错误2:父类不能调用子类未覆写的方法。
错误3:在实例化animal2时,必须先进行向上转型,然后才能调用dog中的shout()方法。
运行结果:

4.运行下列程序

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

 
}

(1)程序的运行结果如下,说明什么问题?

Person@166afb3
Person@166afb3

说明 System.out.println(per); p无论有没有调用toString()方法,都输出了类名和地址信息,都会调用object中toString()方法
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。

(2)那么,程序的运行结果到底是什么呢?利用eclipse打开println(per)方法的源码,查看该方法中又调用了哪些方法,能否解释本例的运行结果?

println(per)的源代码。

public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }
    
valueOf(x):
如果参数为空字符串,则返回值为空;否则,返回tostring()的返回值。 

(3)在Person类中增加如下方法

public String toString(){ 
        return "姓名:" + this.name + ",年龄:" + this.age ; 
 } 
 重新运行程序,程序的执行结果是什么?说明什么问题?
运行结果:

姓名:张三,年龄:20
姓名:张三,年龄:20

说明子类person类覆写了object中的string方法。

(二)实验总结

1.员工类

(1)类图
https://www.processon.com/diagraming/58f2d373e4b0f563a7c68a85
(2)程序设计思路:运用java的继承性,管理人员和一般的职工有许多相同的属性,所以可以弄一个父类,然后让两个子类去继承。在测试类中对各个类分别进行实例化,然后输出。
(3)问题:对super关键字的使用不当。
解决方案:super关键字是调用父类,所以在使用super关键字的时候,应该在代码段的第一行使用。下面附上截图。

2.计算工具类

(1)类图
[https://www.processon.com/diagraming/58f071fae4b0cb4162ab26d0][2]
(2)程序设计思路:首先创建两个抽象类,一个是平面抽象类,一个是立体抽象类,在抽象类中只需要声明这个方法,在子类中去覆写,并给出相应的算法,并在测试类中去实例化,检验计算的是否正确。
(3)问题:如何对小数进行处理?
解决方案:先导入类

import java.text.DecimalFormat;
-------------------------------

然后再调用DecimalFormat方法

DecimalFormat df= new DecimalFormat("0.0");

3.模拟喂养过程

(1)程序设计思路:
设计一个动物类,设计狮子、猴子、鸽子类,继承动物类,分别包含eat方法,如果方法被执行,输出信息;
设计一个饲养员类,包含喂食方法(feedLion、feedMonkey、feedPigeon),输出喂食情况。
(2)在第一次重构中我们运用对象的多态性,在饲养员类中将喂食方法进行合并

public void feedlion(animal1 a){
a.eat();
}
public void feedmonkey(animal1 a){
a.eat();
}
public void feedpigeon(animal1 a){
a.eat();
}
这样做简化了代码。
(3)第二次重构我们让饲养员类中的喂食方法接受了一个数组。

public void feedAnimal(animal4 animal[]){
		for(int i=0;i<animal.length;i++){
		animal[i].eat();
		System.out.println("   "+(i+1)+"号");
		}
	}

在测试类中直接是实例化数组即可。

animal4[] lion={new Lion2()};
		animal4[] monkey={new Monkey2(),new Monkey2(),new Monkey2(),new Monkey2(),new Monkey2()};
		animal4[] pigeon={new Pigeon2(),new Pigeon2(),new Pigeon2(),new Pigeon2(),new Pigeon2(),new Pigeon2(),new Pigeon2(),new Pigeon2(),new Pigeon2(),new Pigeon2(),new Pigeon2(),new Pigeon2(),new Pigeon2(),new Pigeon2(),new Pigeon2()};

这样做可是代码进一步得到简化。

(三)代码托管


链接:此处输入链接的描述

posted on 2017-04-16 10:55  子腾  阅读(675)  评论(0)    收藏  举报

导航