(一)学习总结
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();
}
}
不能通过编译会提示错误:构造函数调用必须是构造函数中的第一个语句
将
class Parent extends Grandparent {
public Parent() {
super("Hello.Grandparent.");
System.out.println("Parent Created");
}
}
改后运行结果为
GrandParent Created.String:Hello.Grandparent.
Parent Created
Child Created
子类对象在实例化前必须调用父类中的方法再调用子类自己的造方法,调用父类中的构造方法,就是用父类的构造方法为父类中的属性初始化,意思就是先有类实例,才能产生子类实例,不能调过来,应因为子类对象的实例化过程与生活很类似,孩子不可能凭空“蹦”出来,肯定是先有父母再有孩子,所以不能调过来。
3 . 阅读下面程序,分析程序中存在哪些错误,说明原因,应如何改正?正确程序的运行结果是什么?
改后的程序为:
class Animal{
void shout(){
System.out.println("动物叫!");
}
public void sleep() { // TODO 自动生成的方法存根
}
}
class Dog extends Animal{
public void shout(){
System.out.println("汪汪......!");
}
public void sleep() {
System.out.println("狗狗睡觉......");
}
}
public class Test2 {
public static void main(String args[]) {
Animal animal = new Dog();
animal.shout();
animal.sleep();
Dog dog = (Dog) animal;
dog.sleep();
Animal animal2 = new Animal();
dog = (Dog)animal2;
dog.shout();
}
}
程序中的问题及原因:
没有为类型 Animal 定义方法 sleep()
类型不匹配:不能从 Animal 转换为 Dog
正确程序运行的结果为:
汪汪......!
狗狗睡觉......
狗狗睡觉......
4.运行下列程序
(1)程序的运行结果如下,说明什么问题?
作业练习.Person@4b61fc
作业练习.Person@4b61fc
说明调用出错,程序只是随机输出了一些地址信息,对象输出时一定会调用Object类中的toString方法打印内容,凭此特性可以通过toString()取得一些对象信息。
(2)那么,程序的运行结果到底是什么呢?利用eclipse打开println(per)方法的源码,查看该方法中又调用了哪些方法,能否解释本例的运行结果?
程序运行结果只是随机输出了一些地址信息,该方法中调用了toString()方法;
(3)在Person类中增加如下方法
public String toString(){
return "姓名:" + this.name + ",年龄:" + this.age ;
}
重新运行程序,程序的执行结果是什么?说明什么问题?
可参考教材P229
姓名:张三,年龄:20
说明程序的Person类中赋写了Object类中的toString方法,这样直接输出对象时调用的是被子类赋写过的toString方法。
5.其他需要总结的内容。
我把一些我认为重要的零散的知识点总结了一下
Integer在Java中属于包装类,对于Integer可以使用MAX_VALUE取得其最大值,也可以通过MIN_VALUE取得其最小值,Intager的最大作用在于字符串与整型的转换上,还具有自动拆箱和装箱的功能;
布尔类型 boolean flag=ture;声明布尔变量flag,并赋值为true;
通过三目运算符求最大值:max=x>y?x:y;
用while和do...while循环操作时不一定明确知道循环次数;若明确知道循环次数可以用for循环;
递归调用时必须有一个明确的结束条件,然后不断改变传入的数据,才可以实现递归调用;
使用Java提供的排序操作:java.util.Arrays.sort(数组名);
对象使用前必须实例化;
只要被封装的属性,必须通过setter和getter方法设置和取得;
每个构造方法的参数类型或参数个数不同构造方法可实现重载;
判断两个字符串相等的方法:利用String类中的equals();
字符串的内容不可以改变;
使用String的replaceAll方法可以将字符串的指定内容进行替换;
无参构造方法中最好不要调用其它构造方法;
(二)实验总结
1.1.定义员工类,具有姓名、年龄、性别属性,并具有构造方法和显示数据方法。定义管理层类,继承员工类,有自己的属性职务和年薪。定义职员类,继承员工类,并有自己的属性所属部门和月薪。定义一个测试类,进行测试。画出类图。
工具:ProcessOn
参考资料:UML 类图
- 程序设计思路:定义不同的类,在类里封装各自的属性。
我是参照老师讲义和书上的例题写的程序,没有遇见问题。只是测试类中实例化时的格式写错了,一定多注意格式。
类图为:
2.按照下面要求完成类的设计
(1)设计一个平面图形抽象类(提供求该类对象周长和面积的方法)和一个立体图形抽象类(提供求该类对象表面积和体积的方法)
(2)设计球类、圆柱类,圆锥类、矩形类、三角形类、圆类,分别继承平面图形抽象类和立体图形抽象类。
(3)建立测试类,进行测试。画出类图。
- 程序设计思路:对类里的属性封装,在getter方法里设置求体积面积的算法,测试类中我只写了对球体积的测试。
-遇到的问题:在属性中我将体积面积都定义为double型
public double getBallv(){
ballv=1.33*PI*r*r*r;
return ballv;
}
输出结果有多位小数
球的体积为112.75740000000002球的表面积为:113.039
解决方法:用Java中的String.format(%.2f)保留两位小数。```
类图为:
![](http://images2015.cnblogs.com/blog/1081681/201704/1081681-20170414213725580-851331505.png)
3.. 参考类图,重构下面的实例,分析和理解多态的含义和用途
(1)某动物园有一饲养员小李,每天需要给他所负责饲养的一只狮子、五只猴子和十只鸽子喂食。 请用一个程序来模拟他喂食的过程。分析这种编程方式有什么不合理的地方。
程序中重复的代码很多,可以优化程序.创建动物类,
(2)第一次重构,引入继承,利用抽象类和对象多态重构程序,Animal类采用抽象类, 合并Feeder类中的方法分析程序是否还可以进一步优化
程序可以优化在抽象类中我定义了动物的属性和方法,子类中覆写了抽象类中的方法.在测试类中实例化子类的对象.
(3)第二次重构,修改feedAnimals方法,让它接收一个Animal数组通过本题的重构,说一下多态有什么好处。在第二次重构之后,是否就能应对各种场景了呢?你认为还应该做哪些优化?
数组是我的弱处,在数组的定义处就遇到了问题,传参时数组传递出错,因此第三个程序没有改完.
多态的好处:提高了代码的扩展性;
提高了代码的维护性;
优化:如果喂养了多只某种动物每次不仅要创建对象还得写多个调用方法,而调用方法仅仅是对象名不一样;
##(三)[代码托管](https://git.oschina.net/hebau_cs15/hebau-cs01LJ1.git)
- 码云commit历史截图
![](http://images2015.cnblogs.com/blog/1081681/201704/1081681-20170418112609743-1793153671.jpg)