《Java技术》第四次作业
(一)学习总结
1.学习使用思维导图对Java面向对象编程的知识点(封装、继承和多态)进行总结。(后面有文件夹的是含有备注的,里面写了具体的知识内容)

2.阅读下面程序,分析是否能编译通过?如果不能,说明原因。应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来?
不可以通过编译,因为super语句在构造函数调用必须是构造函数中的第一个语句。
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.原因一:父类Animal中没有sleep()方法
原因二:dog要强制转换为animal(对于向下转型,需要强制转型,即必须明确指明要转型的子类类型:dog = (Dog)animal2;)
原因三: Animal animal2 = new Animal();错了,错误原因: Animal cannot be cast to Dog 应该改为 Animal animal2 = new Dog(),下面用的还是子类dog,所以应对父类说明子类是谁
运行结果:
汪汪......!
狗狗睡觉......
狗狗睡觉......
汪汪......!
修改后程序:
class Animal{
void shout(){
System.out.println("动物叫!");
}
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(); //还可以用此方法进行转换Animal animal2 = new Animal(); animal2 = dog;
dog = (Dog)animal2;
dog.shout();
}
}
幻灯片中:
A a;
a = new B();
或者
A a;
B b = new B();
a = b;
4.(1) 程序的运行结果如下,说明什么问题?
Person@166afb3
Person@166afb3
输出的是地址,因为没有Person类中并没有test中的toString输出方法,调用的构造方法也并没有输出的功能。对象输出时一定会调用Object类中的toString方法打印内容
(2)那么,程序的运行结果到底是什么呢?利用eclipse打开println(per)方法的源码,查看该方法中又调用了哪些方法,能否解释本例的运行结果?
选择println(per),点击ctrl,就可以查看源码
打开源码:
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
X为空返回空,不为空返回toString
(3)在Person中加入toString,覆写了Object类中的toString方法
运行结果:
姓名:张三,年龄:20
姓名:张三,年龄:20
5.其他总结
(一).学习了用XMind去做笔记。在文件内只需要建立一个框架图,框架图中有每个知识点的链接,每个知识点后可右击添加备注,将具体内容写入或注意事项写入。
(二).学会了查找源码,将要查找的源码选出右击ctrl就可查到。
(三)因为自己将远程仓库的文件直接删除,然后默默的将自己本地文件也删除,然后我就发现文件推送不上去了。
经过查资料问老师问同学,总结出下列几种弥补方法:
(1).先用git log查看你的推送记录
(2).再用老师给的git文档中的撤销语句git reset --hard 9316bda(取哈希字串的前7位即可,如9316bda)
(3).撤销完后,重新建文件夹再进行推送,如果只能提交推送不了,先执行git pull命令
(4).pull完后 git pull origin master --allow-unrelated-histories 这个执行完后,在执行git push -u origin master,然后去码云看看是否成功,可能会有延迟,多试几次
(5).提醒广大同学,千万不要手动删除仓库文件。(做错事不可怕,大不了从头再来,多点耐心没准就成了。)
(四)三角形面积,可以利用三个边求。
public double S(){
C=(a+b+d)/2.0;
S=Math.sqrt(C*(C-a)*(C-b)*(C-d));
return S;
}
(五)利用Format可以限制几位小数
import java.text.DecimalFormat;
DecimalFormat df = new decimalFormat.("#.00"); //限制小数只有两位
(二)实验总结
1.定义员工类,具有姓名、年龄、性别属性,并具有构造方法和显示数据方法。定义管理层类,继承员工类,有自己的属性职务和年薪。定义职员类,继承员工类,并有自己的属性所属部门和月薪。定义一个测试类,进行测试。画出类图 - 程序设计思路:先写出父类Employee,和两个子类Dept、Office的属性、方法,再做好继承关系。最后在test中测试。
-
实验问题分析:
问题1:定义了父类的数组,无法传送子类去,
原因: 父类属性在子类中用super调用了构造方法。
解决方案:所以只用建立子类的数组,把属性输入并输出。new Office("齐末",24,"女","员工","49万")
姓名性别年龄都是在父类中的属性,可以在子类的对象数组中直接把属性写上。
类图:
![]()
2.按照下面要求完成类的设计
(1)设计一个平面图形抽象类(提供求该类对象周长和面积的方法)和一个立体图形抽象类(提供求该类对象表面积和体积的方法)
(2)设计球类、圆柱类,圆锥类、矩形类、三角形类、圆类,分别继承平面图形抽象类和立体图形抽象类。
(3)建立测试类,进行测试。画出类图。
- 实验问题分析:
问题1: 在我修改程序之前,我写了六个求面积周长(同理我体积表面积也写了六个)的方法,其中子类中会报错,让添加未实现的方法。(后经改进,父类中只有两个方法,在不同的子类中,覆写方法不同,就可以求不同的面积周长)
原因:在父类中声明的声明的抽象类方法,在子类中用不到的也要声明出来。
解决方案:
例如在Rectangle子类中,需要说明round、triangle两个子类的周长和面积的方法。
类图:


3 .某动物园有一饲养员小李,每天需要给他所负责饲养的一只狮子、五只猴子和十只鸽子喂食。 请用一个程序来模拟他喂食的过程。
问题1:无法将定义的数组传到feederAnimal方法里面
原因:不需要将方法中的数组用animal再定义对象进行输出,直接用方法定义的对象数组ans输出,在test中已经建立了三个子类相应的数组,将子类的对象直接带入feedAnimal方法即可。
解决方案:
public void feedAnimal(Animal ans[]){
for(int i=0;i<ans.length;i++){
ans[i].eat();
}
}
(三)[代码托管] https://git.oschina.net/hebau_cs15/cs01wmx.git
- 码云commit历史截图
![]()
(四)学习进度条
| 代码行数(新增/累积) | 学习时间(新增/累积) | 本周学习内容 | |
|---|---|---|---|
| 目标 | 5000行 | 300小时 | |
| 第2-4周 | 400/400 | 40/40 | 课上讲的String类用法,温习了很多遍,写程序的时候也查了不少资料,对各种类型做了总结。 |
| 第5周 | 450/850 | 45/45 | 复习了上课讲的知识,并且在完成学习总结的时候查阅了很多资料去了解单列设计模式 等知识点,还将ppt上的程序打了一遍。 |
| 第6周 | 300/1250 | 35/35 | 从课外书上更深的了解了抽象类,同学介绍的网站上面了解了类图的画法。 |


浙公网安备 33010602011771号