Java第三次作业
(一)学习总结
1.阅读下面程序,分析是否能编译通过?如果不能,说明原因。应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来?

不能通过编译,程序中Parent类继承了Grandparent类,父类有无参构造方法,可以通过用super关键字来调用,但这个调用语句必须是子类构造方法的第一个可执行语句,应该先构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。

运行结果:

构造方法的继承原则:
子类无条件地继承父类的不含参数的构造方法。若子类没有定义自己的构造方法,它将继承父类无参数的构造方法作为自己的构造方法。若子类定义了自己的构造方法,它先执行继承自父类的无参数构造方法,再执行自己的构造方法。
对父类含参数的构造方法,子类可以通过在定义自己的构造方法中使用super关键字来调用它,但这个调用语句必须是子类构造方法的第一个可执行语句。
子类构造方法没有显式调用父类构造方法,而父类又没有无参构造方法时,则编译出错。
不能在调用父类的构造方法之前,运行子类的构造方法。
构造方法(constructor)是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。构造函数的功能主要用于在类的对象创建时定义初始化的状态。
构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。
子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。
因为父类不知道子类有什么变量,子类也得不到初始化的父类变量,导致程序运行出错!
2.2.阅读下面程序,分析程序中存在哪些错误,说明原因,应如何改正?正确程序的运行结果是什么?

1.编译出错:animal.sleep();
Dog dog = animal;
上转型对象不能操作子类新增加的成员变量,而animal是子类Dog的上转型对象,对于向下转型,需要强制转型,要指出类型,它可以使用instanceof来避免出错此类错误。
//animal.sleep();
Dog dog = (Dog) animal;

运行结果:

3.运行下列程序

(1)程序的运行结果如下,说明什么问题?

输出方法会默认调用父类Object 的toString方法。
(2)那么,程序的运行结果到底是什么呢?利用eclipse打开println(per)方法的源码,查看该方法中又调用了哪些方法,能否解释本例的运行结果?

用了write方法.
(3)在Person类中增加如下方法

重新运行程序,程序的执行结果是什么?说明什么问题?
结果

4.汽车租赁公司,出租汽车种类有客车、货车和皮卡三种,每辆汽车除了具有编号、名称、租金三个基本属性之外,客车有载客量,货车有载货量,皮卡则同时具有载客量和载货量。用面向对象编程思想分析上述问题,将其表示成合适的类、抽象类或接口,说明设计思路。现在要创建一个可租车列表,应当如何创建?
1.定义一个车辆 接口包含三个属性:编号、名称、租金。对每个属性分别定义get,set方法。
2.分别定义一个载客量和载货量接口,分别具有载客量和载货量属性并且定义get,set方法。
3.客车类、货车类、皮卡类同时继承车辆接口,客车类继承载客量接口,货车类继承载货量接口,皮卡类再同是继承载客量和载货量接口。
4.测试类创建个列表,用户可进行选择,包括属性以及剩余车辆,没租走一辆,减少一辆,没还一辆,增加一辆。
5.阅读下面程序,分析代码是否能编译通过,如果不能,说明原因,并进行改正。如果能,列出运行结果

不能,子类要实现父类接口中定义的所有方法,在子类实现抽象方法时,默认是public abstract,所以应该是使用public修饰符。
修改后:


6.其他需要总结的内容。
1.super键字和final关键字
在子类重写父类方法后,要访问父类被重写的方法,需要用super关键字来引用当前类的父类。super的用法有两种情况:
(1) 访问的父类中的成员变量和成员方法
super.变量名
super.方法名([参数表])
(2)调用父类的构造方法
super([参数表])
在Java中可以使用final关键字定义类、方法、属性:
使用final关键字定义的类不能有子类
使用final声明的方法不能被子类所覆盖
使用final声明的变量即成为常量,常量必须在声明时给出具体的内容。
在声明一个常量的时候所有单词的字母都必须大写,如果要想声明一个全局常量的话:
public static final声明。
public static final String INFO = "hello" ;
2.多态
多态性是指同名的不同方法在程序中共享,即为同一个方法定义几个版本,运行时根据不同情况执行不同的版本。
一个名字,多个方法
多态性的实现:
覆盖实现多态:(子类重写父类中的方法)
重载实现多态(同一个类中的同名方法)
相同的一条语句在不同的运行环境中可以产生不同的运行结果。
覆盖实现多态:
子类方法的返回类型、参数、方法名称要和父类的返回类型、参数、方法名称完全一样,否则编译出错。
被覆盖的方法不能为private
子类方法不能缩小父类方法的访问权限。
覆盖后的方法不能比被覆盖的方法产生更多的例外,即抛出更多的异常。
根据调用对象区分调用的方法
重载实现多态:
方法名相同
方法的参数类型,个数,顺序至少有一项不同
根据形参来决定调用的是哪个方法
3.对象转型:
上转型对象
向上转型:子类对象 父类对象
对于向上转型,程序会自动完成:
格式:父类名称 父类对象 = 子类实例;
上转型对象具有如下特点:
上转型对象不能操作子类新增加的成员变量,不能使用子类新增的方法。
上转型对象可以操作子类继承或隐藏的成员变量,也可以使用子类继承的或重写的方法。
上转型对象调用方法时,就是调用子类继承和重写过的方法。而不会是新增的方法,也不是父类原有的方法。
下转型对象
向下转型:父类对象 子类对象
对于向下转型,需要强制转型,即必须明确指明要转型的子类类型:
格式:子类名称 子类对象 =(子类)父类实例;
在向下转型过程中,分为两种情况:
如果父类引用的对象是指向的子类对象,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。
如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。
instanceof关键字
通过instanceof关键字可以判断某一个对象是否是某一个类的实例。
格式:对象 instanceof 类返回boolean类型
4.接口
接口与类的不同在于:
(1) 没有变量的声明,但可以定义常量。
(2) 只有方法的声明,没有方法的实现。
接口的定义:
public指明任意类均可使用这个接口,缺省时,表明只有与接口定义在同一个包中的类才可访问此
extends是关键字,父接口列表表示一个接口可以有多个父接口,用逗号分开,而类只能有一个父类。子接口继承父接口中所有的常量和方法。
接口中没有自身的构造方法。
在接口中定义的常量必须是pubilc static final,这是系统默认的规定,所以常量也可以没有任何修饰符。
接口中只有方法声明,而无方法实现,接口中声明的方法必须是public abstract,也是系统默认的规定。
接口定义的完整格式:
5.接口和抽象类的区别:
语法层面上的区别
1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
设计层面上的区别
1)抽象类是对一种事物的抽象,即对类抽象,包括属性、行为,而接口是对行为的抽象。抽象类和它的子类之间应该是一般和特殊的关系,继承是一个 “是不是(ISA)”的关系,而接口仅仅是它的子类应该实现的一组规则,接口实现则是 “能(CAN-DO)"的关系。
2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规 范,它是一种辐射式设计。
(二)实验总结
本次实验包括实验四和实验五两次的内容:
对完成实验内容过程中遇到的问题、解决方案以及程序的设计思路和思考等进行归纳总结。
格式如下:
程序设计思路:XXXXXXX
问题1:XXXXXXX
原因:XXXXXXX
解决方案:XXXXXXX
问题2:XXXXXXX
原因:XXXXXXX
解决方案:XXXXXXX
1:银行




运行:


问题一:用的数组。
问题二:余额刚开始没有定义。
2.员工:



运行结果:

问题一:
3.图形:





运行:

问题一:所有的对象全部在父类,调用的时候...



但是这样倒是可以,不知为什么?.?
4.声音



实验五:
1.宠物:







运行:


问题一:没有考虑数量不足的情况
修改后:

2.快递


还没写完!
3.
4.
浙公网安备 33010602011771号