Java第三次作业
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("Hello.Grandparent.");
更改:应该把上句话放到类的第一句。
结果:

构造函数(constructor)是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。构造函数的功能主要用于在类的对象创建时定义初始化的状态。
构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。
子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。
不能反过来调用也是这个原因,因为父类根本不知道子类有神魔变量而且这样一来子类也得不到初始化的父类变量,导致程序运行出错!
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();
}
}
错误有两个:
一,
animal.sleep();
原因:没有为类型 Animal 定义方法 sleep()
二,
Dog dog = animal;
原因:类型不匹配:不能从 Animal 转换为 Dog
更改:
package 随意;
class Animal{
void shout(){
System.out.println("动物叫!");
}
}
class Dog extends Animal{
public Dog(){
}
public void shout(){
System.out.println("汪汪......!");
}
public void sleep() {
System.out.println("狗狗睡觉......");
}
}
public class sy{
public static void main(String args[]) {
Dog animal = new Dog();
animal.shout();
animal.sleep();
Dog dog = animal;
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
Person类里没有写toString方法,而测试类中却调用了,如想要解决,在Person类中写一个toString方法即可。
(2)那么,程序的运行结果到底是什么呢?利用eclipse打开println(per)方法的源码,查看该方法中又调用了哪些方法,能否解释本例的运行结果?
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
valueOf(x) //if the argument is null, then a string equal to "null";
otherwise, the value of obj.toString() is returned.
如果参数为空字符串,则返回空,否则,返回toString()的返回值。
toString()返回一个字符串用于描述当前对象,返回的具体内容:类名@对象的hash码十六进制表示。
(3)在Person类中增加如下方法
public String toString(){
return "姓名:" + this.name + ",年龄:" + this.age ;
}
重新运行程序,程序的执行结果是什么?说明什么问题?
可参考教材P229
结果:

说明直接输出对象时调用的是被子类复写过的toString方法。
4.汽车租赁公司,出租汽车种类有客车、货车和皮卡三种,每辆汽车除了具有编号、名称、租金三个基本属性之外,客车有载客量,货车有载货量,皮卡则同时具有载客量和载货量。用面向对象编程思想分析上述问题,将其表示成合适的类、抽象类或接口,说明设计思路。现在要创建一个可租车列表,应当如何创建?
定义抽象类具有抽象方法getNumber,getname,getMoney方法
定义接口a具有输出载货量的抽象方法,定义接口b具有输出载客量的方法
定义三个子类客车,三个属性,set,get,toString方法,货车,皮卡继承抽象类,客车实现接口b,货车实现接口a,皮卡实现接口a,b
在测试类中实例化客车类,货车类,皮卡类,调用子类中的重写的toString方法输出相关信息
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();
}
}
不能,有两个错误:
一,
class Dog implements Animal{
类型 Dog 必须实现继承的抽象方法 Animal.run()
二,
void eat(){
不能降低自 Animal 继承的方法的可视性
改正:
interface Animal{
void breathe();
void run();
void eat();
}
class Dog implements Animal{
public void breathe(){
System.out.println("I'm breathing");
}
public void eat(){
System.out.println("I'm eating");
}
public void run() {
}
}
public class sy{
public static void main(String[] args){
Dog dog = new Dog();
dog.breathe();
dog.eat();
}
}
把未实现抽象类中的方法,实现即可,即便run方法中什么也不写,另外在eat方法前加public。
结果:

6.其他需要总结的内容。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
1.银行新用户现金业务办理
一共有两个类:
1)银行类
银行名称bankName(静态变量)、用户名name、密码password、账号余额balance、交易额turnover。
构造方法用来开户。只能开一个户。其中输入用户名,密码,余额(要扣除10元)。
静态方法welcome():打印欢迎语
构造方法:实现新用户的开户。包括用户名,密码,交易额。开户时扣除10元开卡费。
存款方法deposit():根据存款额修改账户余额。输出相关信息。
取款方法withdrawal():对用户密码进行验证,密码错误或取款额大于余额,不能办理业务,并提示用户。否则,修改用户余额。
静态方法welcomeNext():输出欢迎下次光临。
2)测试类
定义用户交易类Trade,模拟新用户到某个银行办理业务的场景。
创建银行类,调用银行类的方法。
2.定义员工类,具有姓名、年龄、性别属性,并具有构造方法和显示数据方法。
定义管理层类,继承员工类,有自己的属性职务和年薪。
定义职员类,继承员工类,并有自己的属性所属部门和月薪。定义一个测试类,进行测试。
3.测试
(1)设计一个平面图形抽象类(提供求该类对象周长和面积的方法)和一个立体图形抽象类(提供求该类对象表面积和体积的方法)
(2)设计球类、圆柱类,圆锥类、矩形类、三角形类、圆类,分别继承平面图形抽象类和立体图形抽象类。
(3)设计一个测试类,随机产生球,圆柱、圆锥体、矩形、三角形、圆的尺寸,模拟考试,要求用户回答它们的体积和表面积(或者周长和面积),并判断用户的回答是否正确。
4.饲养员小李
设计思路:
动物类:两个抽象方法,name,eat
狮子类:构造方法为空,name类输入名字,eat类随机数%3,有三种情况,1、心情不好,一点也不吃2,肚子疼,只能吃下一些3,心情好,全吃了
鸽子,猴子类类似
测试:要注意取过名字后,不应再取名字
5.宠物商店
宠物种类有猫、狗,宠物信息包括:编号、种类、品种、单价、数量。
要求实现以下功能:
1)展示所有宠物
2)购买宠物
3)展示购买清单:显示购买的宠物品种,数量,价格合计及购买宠物的总价钱
6.设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声。
设计思路:
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());
7.模拟物流快递系统
设计思路:
1)定义一个抽象类交通工具类Transportation,属性:编号,型号,运输负责人。方法:无参构造和含三个参数的构造方法,get和set方法,抽象方法transport()
2)定义一个专用运输车类JDTransportation继承交通工具类,继承父类构造方法,实现transport()方法,输出一个运输信息。
3)定义一个接口GPS实现对货物的定位。接口中有方法showCoordinate()跟踪货物的位置信息。
4)定义一个类Phone实现GPS接口
5)定义一个快递任务类SendTask,具有私有属性:快递单号、货物重量。方法:无参和含参构造方法,get和set方法,
sendBefore()方法输出运输前的检查信息和快递单号。
send(Transportation t,GPS tool)方法输出运货人、车辆编号、型号信息,该方法中调用transport方法输出运输信息,调用showCoordinate()方法输出货物位置坐标。
sendAfter( Transportation t )方法输出货物运输完成后的信息。
•(6)定义一个测试类,创建一个快递任务类对象,一个交通工具类对象,一个GPS工具对象。模拟物流快递过程。输出运输前、运输中和运输后的信息。
程序运行效果参考如下。
订单开始处理,仓库开始验货...
货物重量:13.2kg
订单已发货
快递单号:hx201835 //运输前信息
运货人小张正在驾驶编号为zh1002的长城发送货物!
京东快递运输中......
货物当前坐标:193,485 //运输中信息
货物运输已完成
运货人小张所驾驶编号为zh1002的长城已归还! //运输后信息
8.修改实验三的第四题,使用java.util.Date类表示职工的生日和参加工作时间,并将职工信息按照生日大小排序后输出。(分别用comparable和comparator实现)
设计思路:
将实验三的第四题中的时间类删除,原本的时间类数据生日、工作时间用Date类替换,用comparable和comparator接口Arrays类的sort方法排序后输出。
(三)代码托管(务必链接到你的项目)

浙公网安备 33010602011771号