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

《Java技术》第三次作业--面向对象——继承、抽象类、接口的更多相关文章

  1. 面向对象 继承 抽象类 接口 static 权限修饰符

    Day01 面向对象 继承 抽象类 接口 static 1.匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量. 2.类的继承是指在一个现有类的基础上去构建一个新的类,构建出 ...

  2. 《Java技术》第二次作业--面向对象基础

    (一)学习总结 1.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么? public class Test { public static void main(String a ...

  3. Java第三次作业——面向对象基础(封装)

    Java第三次作业--面向对象基础(封装) (一)学习总结 1.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明. 封装性 封装性是面向对象的方法所应遵循的一个重要原则,它有两个含义: ...

  4. 2017-2018-1 JAVA实验站 第三周作业

    2017-2018-1 JAVA实验站 第三周作业 团队展示 队名 JAVA实验站 拟作的团队项目描述 (2048)增加其他模式,使得2048更加丰富多彩 团队的首次合照 团队的特色描述 团队内部很团 ...

  5. Java初学者最近三次作业的心得体会

    作为一个初学者,简单的谈一下自己的作业心得体会.如果你是完全没有接触过Java的学习,本篇博文可能会有些收获,如果你已经学习Java有一段时间了,那么可以放弃这篇文章了,因为这篇文章讲解的是基本的东西 ...

  6. Java第三次作业--面向对象基础(封装)

    Deadline: 2017-4-6 23:00 一.学习要点 认真看书并查阅相关资料,掌握以下内容: 掌握简单类的设计 掌握利用对象引用建立类与类之间的联系 掌握this关键字 掌握static关键 ...

  7. 2017-2018-1 Java演绎法 第三周 作业

    团队任务:团队展示与选题 团队展示 队员学号及姓名 学号 姓名 主要负责工作 20162315 马军 日常统计,项目部分代码 20162316 刘诚昊 项目部分代码,代码质量测试 20162317 袁 ...

  8. 《java技术》第二次作业

    (一)学习总结 1.什么是构造方法?什么是构造方法的重载? 1)没有返回值,名字与类名相同,当新对象被创建的时候,构造函数会被调用,要想构造函数,必须声明对象并对其初始化.每一个类都有构造函数,如果没 ...

  9. 《Java技术》 第二次作业

    java第二次作业 (一)学习总结 1.学习使用Eclipse关联jdk源代码,查看String类的equals()方法,截图,并学习其实现方法.举例说明equals方法和==的区别. 在Eclips ...

随机推荐

  1. csrf学习笔记

    CSRF全称Cross Site Request Forgery,即跨站点请求伪造.我们知道,攻击时常常伴随着各种各样的请求,而攻击的发生也是由各种请求造成的. CSRF攻击能够达到的目的是使受害者发 ...

  2. Python之旅.第三章.函数4.01/4.02

    一.三元表达式 #普通的判断大小函数def max2(x,y): if x > y: return x else: return yres=max2(10,11)print(res)x=12y= ...

  3. WPF自学入门(十一)WPF MVVM模式Command命令

    在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式.正如上一篇文章中在开始说的,MVVM的目的是为了最大限度地降低了 ...

  4. Python内置函数(35)——next

    英文文档: next(iterator[, default]) Retrieve the next item from the iterator by calling its __next__() m ...

  5. greenplum集群某台机器磁盘占用100%处理方式

    一.问题描述 使用gpfdist往集群中导入大量数据, 一段时间后连接退出,集群无法连接 二.问题定位 使用如下命令查看: gpstate -s mdw-:gpadmin-[INFO]:- Segme ...

  6. Python之面向对象三

    面向对象的三大特性: 多态 多态指的是一类事物有多种形态.Python3天生支持多态. 动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCM ...

  7. R数据分析 第一篇:温习概率论

    概率论是人们在长期实践中发现的理论,是客观存在的.自然界和社会上发生的现象是多种多样的,有一类现象,在一定条件下必然发生,称作确定性现象,而概率论研究的现象是不确定性现象,嗯嗯,醒醒,概率论研究的对象 ...

  8. ORACLE数据库之PL/SQL触发器、rownum、动态SQL、数据库之视图与索引

    WHEN子句说明触发约束条件.Condition为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL函数.WHEN子句指定的触发约束条件只能用在BEFORE和AFTER行 ...

  9. Vue 项目代理设置的优化

    Vue 项目代理设置的优化 Vue 类的项目开发中项目结构基本都是类似于 Vue-cli 生成的方式, 这种方式开发中,最常用到的模式是开启代理进行 mock 调试或远程调试, 也就是使用了 Vue- ...

  10. BZOJ 4551[Tjoi2016&Heoi2016]树(树链剖分+二分)

    Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记 ...