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调用构造函数时必须是构造函数中的第一个语句。
修改后程序:
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
子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。父类不知道子类有什么变量,子类也得不到初始化的父类变量。
不能在调用父类的构造方法之前,运行子类的构造方法。
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();
}
}
错误:
1.父类中没有sleep,需要在父类Animal中声明在sleep方法实现覆写。覆写:即当父类与子类当中存在相同的方法名,程序会优先调用子类里的方法。
2.下转型,通过Dog dog =(Dog)animal将父类转为子类,可以调用父类的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)方法的源码,查看该方法中又调用了哪些方法,能否解释本例的运行结果?
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
(3)在Person类中增加如下方法
public String toString(){
return "姓名:" + this.name + ",年龄:" + this.age ;
}
重新运行程序,程序的执行结果是什么?说明什么问题?
可参考教材P229
姓名:张三,年龄:20
姓名:张三,年龄:20
说明子类Person重复了Object类中toString()方法
4.汽车租赁公司,出租汽车种类有客车、货车和皮卡三种,每辆汽车除了具有编号、名称、租金三个基本属性之外,客车有载客量,货车有载货量,皮卡则同时具有载客量和载货量。用面向对象编程思想分析上述问题,将其表示成合适的类、抽象类或接口,说明设计思路。现在要创建一个可租车列表,应当如何创建?
(1)定义一个种类接口,包括三个属性:编号、名称、租金。
(2)定义一个接口:包括一个属性:载客量。
(3)定义一个接口:包括一个属性:载货量。
(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();
}
}
不能编译通过。
接口中方法,默认是public abstract 所以在子类实现抽象方法时,应该用public修饰,Dog类的eat方法应该在前面加*问权限public
改正后运行结果:
I'm breathing
I'm eating
6.其他需要总结的内容。
(二)实验总结
本次实验包括实验四和实验五两次的内容:
对完成实验内容过程中遇到的问题、解决方案以及程序的设计思路和思考等进行归纳总结。
实验四第一题:
程序设计思路:(1)定义一个Bank类,包括无参有参构造方法,deposit withdrawal welcomeNext方法。
(2)定义一个Trade类,用循环选择需要操作的选项,分别调用Bank类的各个方法。
实验四第二题:
程序设计思路:(1)定义一个yuangong类(父类),包括属性,无参有参构造方法,set get方法,toString方法。
(2)定义一个zhiyuan类(子类),包括属性,无参有参构造方法,set get方法,toString方法。
(3)定义一个guanli类(子类),包括属性,无参有参构造方法,set get方法,toString方法。
(4)定义一个Test类,定义一个对象数组,分别赋值,打印。
实验四第三题:
程序设计思路:(1)定义一个平面图形抽象类和一个立体图形抽象类。
(2)定义球类、圆柱类,圆锥类、矩形类、三角形类、圆类,分别继承平面图形抽象类和立体图形抽象类。
(3)定义一个Test类,包括两个判断计算正确的方法,用switch case随机产生一个数,确定需要计算的图形。
实验四第四题:
程序设计思路:(1)定义一个抽象类Animal,包括eat方法。
(2)定义Monkey Lion Pigeon类分别继承Animal抽象类,并重写eat方法。
(3)定义一个Feeder类,重构修改feedAnimals方法,使其接收一个Animal数组。
实验五第二题:
程序设计思路:(1)定义一个Animal接口,2个抽象方法cry()和getAnimaName()。
(2)定义一个Simulator类,有一个playSound(Animal animal)方法,参数animal可以调用实现Animal接口类重写的cry()方法播放具体动物的声音、调用重写的getAnimalName()方法显示动物种类的名称。
(3)实现Animal接口的Dog类和Cat类。
(4)测试类:main方法中包含如下代码:
Simulator simulator = new Simulator();
simulator.playSound(new Dog());
simulator.playSound(new Cat());
实验五第三题:
程序设计思路:(1)定义一个抽象类Transportation,包括属性,无参构造和含三个参数的构造方法,get和set方法,抽象方法transport()。
(2)定义一个JDTransportation类继承Transportation类,继承父类构造方法,实现transport()方法,输出一个运输信息。
(3)定义一个接口GPS,接口中有方法showCoordinate()。
(4)定义一个类Phone实现GPS接口。
(5)定义一个SendTask类,包括私有属性,无参和含参构造方法,get和set方法,sendBefore()方法,send(Transportation t,GPS tool)方法,该方法中调用transport方法输出运输信息,调用showCoordinate()方法输出货物位置坐标,sendAfter( Transportation t )方法输出货物运输完成后的信息。
(6)定义一个Test类,创建一个快递任务类对象,一个交通工具类对象,一个GPS工具对象。
(三)代码托管(务必链接到你的项目)
https://gitee.com/hebau_java_cs16/Java_CS01ZhangNing