二、作业要求
发布一篇随笔,主要包括以下几部分的内容:
(一)学习总结
1.阅读下面程序,分析是否能编译通过?如果不能,说明原因。应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来?
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();
}
}
不能编译通过
原因:对父类含参构造方法,子类在自己的构造方法中使用super关键字调用时,super调用语句必须是子类构造方法的第一个可执行语句
改正:把super("Hello.Grandparent.");放在System.out.println("Parent Created");之前
结果:
GrandParent Created.String:Hello.Grandparent.
Parent Created
Child Created
2.阅读下面程序,分析程序中存在哪些错误,说明原因,应如何改正?正确程序的运行结果是什么?
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();
}
}
错误:测试类里面的sleep有错误,还有初始化那里也有错误
原因:父类里面没有sleep的构造函数,而子类,测试类中调用了,在测试类里面动物和狗的初始化不正确
改正:在父类Animal中添加
void sleep(){
System.out.println("动物睡觉!");
}
测试类里面
public class Test{
public static void main(String args[]) {
Animal animal = new Animal();
animal.shout();
animal.sleep();
Dog dog = new Dog();
dog.shout();
dog.sleep();
Animal animal2 = new Animal();
dog = (Dog)animal2;
dog.shout();
}
}
结果:
动物叫!
动物睡觉
汪汪......!
狗狗睡觉......
3.运行下列程序
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
说明没有重写toString()方法
(2)那么,程序的运行结果到底是什么呢?利用eclipse打开println(per)方法的源码,查看该方法中又调用了哪些方法,能否解释本例的运行结果?
结果:
haitao6.Person@532760d8
haitao6.Person@532760d8
(3)在Person类中增加如下方法
public String toString(){
return "姓名:" + this.name + ",年龄:" + this.age ;
}
重新运行程序,程序的执行结果是什么?说明什么问题?
结果:
姓名:张三,年龄:20
姓名:张三,年龄:20
重写toString()方法,取得一些对象的信息,这样直接输出时调用的是直接被子类覆写的toString方法
可参考教材P229
4.汽车租赁公司,出租汽车种类有客车、货车和皮卡三种,每辆汽车除了具有编号、名称、租金三个基本属性之外,客车有载客量,货车有载货量,皮卡则同时具有载客量和载货量。用面向对象编程思想分析上述问题,将其表示成合适的类、抽象类或接口,说明设计思路。现在要创建一个可租车列表,应当如何创建?
5.阅读下面程序,分析代码是否能编译通过,如果不能,说明原因,并进行改正。如果能,列出运行结果
interface Animal{
void breathe();
void run;
void eat();
}
class Dog implements Animal{
public void breathe(){
System.out.println("I'm breathing");
}
void eat(){
System.out.println("I'm eating");
}
}
public class Test{
public static void main(String[] args){
Dog dog = new Dog();
dog.breathe();
dog.eat();
}
}
不能编译通过
原因:因为在接口中一共有三个方法,因为子类Dog是非抽象类,所以必须调用接口中的所以方法,而它只调用了两个,所以不能实现编译
改正:在子类Dog中加入
@Override
public void run() {
// TODO Auto-generated method stub
}
6.其他需要总结的内容。
(1)用super关键字调用函数时,要写在子类构造方法的第一句执行命令
(2)当子类为非抽象类时,必须调用接口中的所有方法,抽象类可以不用全部调用
(3)一个子类只能有一个父类,一个父类可以有多个子类,类继承具有传递性
(4)子类不能继承访问权限为private的成员变量和方法
(5)子类对象在实例化之前必须先调用父类的构造方法再调用子类的构造方法
(6)子类无条件继承父类的无参构造方法
(7)多态:同名不同方法再程序中共享
覆盖实现多态:(子类重写父类中的方法)
重载实现多态:(同一个类中的同名方法)
(8)对象转型:1:向上转型:父类名称 父类对象=子类实例
2:向下转型:子类名称 子类对象=(子类)父类实例
(9)抽象类的子类必须重写抽象类中的全部抽象方法,抽象方法必须存在于抽象类中
(二)实验总结
实验四
2:
程序设计思路:定义员工类,附上姓名,年龄,性别的属性,定义构造方法-》无参构造方法,get,set方法,toStrng()方法显示数据
定义管理层类,继承员工类,附上职务,年薪的属性,定义构造方法-》无参构造方法,get,set方法
定义职员类,继承员工类,附上所属部门,月薪的属性,定义构造方法-》无参构造方法,get,set方法
定义测试类,调用子类管理和职员的构造方法,给属性赋值,输出调用get方法
3:
程序设计思路:定义一个平面图形抽象类(包括求周长和面积的方法)
定义一个立体图形抽象类(包括求对象表面积和体积的方法)
设计球类,圆柱类,圆锥类,矩形类,三角形类,圆类,,分别继承平面图形抽象类和立体图形抽象类
设计测试类,随机产生上述图形的尺寸,要求用户回答它们的周长和面积或表面积和体积,并判断用户回答是否正确
4:
程序设计思路:定义一个动物抽象类,并定义一个吃的构造方法
定义一个狮子类继承动物类,调用动物类里面吃的那个构造方法
定义一个猴子类继承动物类,调用动物类里面吃的那个构造方法
定义一个鸽子类继承动物类,调用动物类里面吃的那个构造方法
定义一个饲养员类,附上姓名属性,含参构造方法name,分别定义喂狮子的方法,喂猴子的方法,喂鸽子的方法
定义一个测试类,初始化feeder,并给feeder赋值,调用feeder分别有狮子,猴子,鸽子,并给他们分配内存空间,循环输出猴子和鸽子的喂食
实验五
2:
程序设计思路:定义一个Animal接口,声明两个抽象方法
定义一个Simulator类,重写cry()和getAnimalName()方法显示动物种类
分别创建Dog和Cat类实现Animal接口,含参构造方法,get,set方法AninalName
测试类实例化Simulator,引用simlator,给dog和cat分配空间,赋值
3:
程序设计思路:定义抽象类交通运输类,附上属性,并定义无参和含参构造方法,还有一个抽象方法trsnsport()
定义专用运输类,继承交通工具类,继承父类的构造方法,并通过实现trsnsport()方法,输出运输信息
定义一个接口GPS,定义方法showCoordinate()跟踪定位货物信息
定义phone实现GPS接口
定义快递任务类,附上其属性,含参和无参构造,get,set方法,并通过三个函数展现快递运输过程
定义一个测试类,创建三个对象,通过调用快递任务类里面的三个运输函数输出快递信息
问题:在构造方法总是在是否存在返回值上出错
(三)代码托管(务必链接到你的项目)
https://gitee.com/hebau_java_cs16/Java_CS01YCG
码云提交历史截图
上传实验项目代码到码云,在码云项目中选择“统计-提交”,设置搜索时间段,搜索本周提交历史,并截图。