Java第四次作业
(一)学习总结
1.学习使用思维导图对Java面向对象编程的知识点(封装、继承和多态)进行总结。
2.阅读下面程序,分析是否能编译通过?如果不能,说明原因。应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来?
编译不能通过
构造函数调用必须是构造函数中的第一个语句
修改方法为:
将super("Hello.Grandparent."); 放到构造函数的第一句。
修改程序如下:
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() {
super("Hello.Grandparent.");
System.out.println("Parent Created");
}
}
class Child extends Parent {
public Child() {
System.out.println("Child Created");
}
}
public class Test{
public static void main(String args[]) {
Child c = new Child();
}
}
运行结果为:
GrandParent
Created.String:Hello.Grandparent.
Parent Created
Child Created
不能,父类用其本身类实例化自己的对象,但并不值道谁是自己的子类肯定会在转化时出现错误。
3 . 阅读下面程序,分析程序中存在哪些错误,说明原因,应如何改正?正确程序的运行结果是什么?
1、没有声明sleep()方法
2、将animal强制转换为(Dog)类型
修改程序如下:
class Animal{
public void shout(){
System.out.println("动物叫!");
}
public void sleep() {
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 = (Dog) animal;
dog.sleep();
Animal animal2 = new Dog();
dog = (Dog)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@1b48197
Person@1b48197
加不加toString()运行结果相同,输出时一定会调用Object类中的toString()方法打印内容。
(2)在Person类中增加如下方法
public String toString(){
return "姓名:" + this.name + ",年龄:" + this.age ;
}
重新运行程序,程序的执行结果是什么?说明什么问题?
运行结果:
姓名:张三,年龄:20
姓名:张三,年龄:20
说明问题:
person中的toString()覆盖了子类中的方法。
可参考教材P229
5.其他需要总结的内容。
本星期主要学习了继承和多态,加上原来的封装性是Java中的三大支柱,对于我们以后的学习起着重要的作用。大体的东西在实验中有些已经练习到了,但重写和重载的区别不是很清晰,所以自己着重总结了一下。
重载:让类以统一的方式处理不同类型的数据,多个同名函数同时存在,但具有不同的类型。方法中可以同名但参数名、个数、类型须有不同,并在后面根据需要调用。
重写:在子类中对父类函数进行重新的定义,可以做一定的修改,也叫方法覆盖,要保证子类的参数名、参数类型、返回值与父类相同并且访问权限不能小于父类
(二)实验总结
实验内容:
1.定义员工类,具有姓名、年龄、性别属性,并具有构造方法和显示数据方法。定义管理层类,继承员工类,有自己的属性职务和年薪。定义职员类,继承员工类,并有自己的属性所属部门和月薪。定义一个测试类,进行测试。画出类图。
UML 类图
程序设计思路
定义员工类为父类,管理层类和职员类为子类继承员工类,在子类的构造方法中调用父类的构造方法,进行测试并按要求输出。
2.按照下面要求完成类的设计
(1)设计一个平面图形抽象类(提供求该类对象周长和面积的方法)和一个立体图形抽象类(提供求该类对象表面积和体积的方法)
(2)设计球类、圆柱类,圆锥类、矩形类、三角形类、圆类,分别继承平面图形抽象类和立体图形抽象类。
(3)建立测试类,进行测试。画出类图。
定义两个抽象类Plane和Solid,在继承抽象类时覆写抽象方法计算球类、圆柱类,圆锥类、矩形类、三角形类、圆类,并定义一个测试类进行测试。
3.. 参考类图,重构下面的实例,分析和理解多态的含义和用途
(1)某动物园有一饲养员小李,每天需要给他所负责饲养的一只狮子、五只猴子和十只鸽子喂食。 请用一个程序来模拟他喂食的过程分析这种编程方式有什么不合理的地方。
Lion,Monkey和Pigeon类中都只有一个eat()方法,程序显得比较繁琐
(2)第一次重构,引入继承,利用抽象类和对象多态重构程序,Animal类采用抽象类, 合并Feeder类中的方法
分析程序是否还可以进一步优化 可以优化 通过数组提前设定动物的种类数组调用时更简便
(3)第二次重构,修改feedAnimals方法,让它接收一个Animal数组
通过本题的重构,说一下多态有什么好处。在第二次重构之后,是否就能应对各种场景了呢?你认为还应该做哪些优化?
参数不同但可以反复调用方法,使程序更加的简便,效率更高。
创建饲养员类,动物类为父类,猴子,狮子,鸽子为子类,并写出测试类进行测试。
问题:循环完狮子之后,程序异常终止。
解决方案:
public static void feedAnimals(Animal []ans){
for(int i=0;i<ans.length;i++){
ans[i].eat();
}
}
(三)代码托管(务必链接到你的项目)https://git.oschina.net/hebau_cs15/FMM.git
码云commit历史截图
上传实验项目代码到码云,在码云项目中选择“统计-commits”,设置搜索时间段,搜索本周提交历史,并截图。