返回列表 发帖

《java入门123》 接口的一个小问题

这是书中334面的一段程序

package com.javaeasy.logcar;

import com.javaeasy.car.Bus;
import com.javaeasy.car.CarBase;
import com.javaeasy.car.SportsCar;

public class LogCarOnAStreet {
        public static void main(String[] args) {
                CarBase car = null; // 创建一个CarBase类的引用
                car = new CarBase("红色", "天津大发", 0); // 让car指向一个CarBase类的对象
                car.speedUp(50); // 提速50
                TransportRecoder.recordTransport(car); // 记录CarBase类对象的状态
                car = new Bus("黄色", "大桥六线", 0, 0, 0); // car指向一个Bus类的对象
                car.speedUp(60); // 提速60
                TransportRecoder.recordTransport(car); // 记录Bus类对象的状态
                car = new SportsCar("黄色", "Eclipse", 0, 0); // 让car指向一个SportsCar类的对象
                car.speedUp(70); // 提速70
                TransportRecoder.recordTransport(car); // 记录SportsCar类对象的状态
        }
}

输出是:
一下是经过的第1辆车的信息:
车为:天津大发,车速为:50
一下是经过的第2辆车的信息:
车为:大桥六线,车速为:60
一下是经过的第3辆车的信息:
车为:大桥六线,车速为:70


这里没弄错的话,应该是用的是多态的方法吧。多态那节讲的是 决定函数重载的哪个方法被调用的是实参,也就是引用的类型,而不是引用指向的对象类型。

这里的引用全部都是car ,按照我的理解是只输出“车为:天津大发,车速为:50” 这个内容的  为什么还会显示出bus , sportcar两个对象的信息呢?  

对于这个概念有点混乱啊,求指导,谢谢
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

1# qianhang1990


这个你正好记反了。不是按照引用的类型,而是按照引用指向的对象的类型。

说的形象一点,一个方法调用就是让一个人去做一件事情,比如说,出去跑两圈,这件事情。具体做事情的对象,也就是人,会有自己不同的方式,这个是跟“具体做事情的人”有关的。人有个出去跑两圈的方法,运动员可能大步快跑围着小区跑两圈,普通人可能围着楼跑两圈了事,马拉松er可能先打开地图,找到一条最喜欢的路线跑一趟。

TOP

1# qianhang1990


这个你正好记反了。不是按照引用的类型,而是按照引用指向的对象的类型。

说的形象一点,一个方法调用就是让一个人去做一件事情,比如说,出去跑两圈,这件事情。具体做事情的对象,也就是人,会有自己不同的方式,这个是跟“具体做事情的人”有关的。人有个出去跑两圈的方法,运动员可能大步快跑围着小区跑两圈,普通人可能围着楼跑两圈了事,马拉松er可能先打开地图,找到一条最喜欢的路线跑一趟。

TOP

3# deepnighttwo


先祝贺一下版主,新年快乐,工作顺利~~~~元旦休假还帮我等新手小白解答疑问,辛苦版主了

然后对于版主的回答还是有一点疑惑。主要还是因为书上多态的那段内容。

书上P281、282 有2段代码。  代码如下:

package com.javaeasy.overload;

import com.javaeasy.override.CarBase;
import com.javaeasy.override.ElectronicBus;

public class UseCar {
        public CarBase car;

        public void setCar(CarBase car) {
                System.out.println("setCar(CarBase)方法被调用了");
                this.car = car;
        }

        public void setCar(ElectronicBus bus) {
                System.out.println("setCar(ElectronicBus)方法被调用了");
                this.car = bus;
        }

}



package com.javaeasy.overload;

import com.javaeasy.override.Bus;
import com.javaeasy.override.CarBase;
import com.javaeasy.override.ElectronicBus;
import com.javaeasy.override.SportsCar;

public class UseOverLoadII {
        public static void main(String[] args) {
                                UseCar useCar = new UseCar();
                        CarBase base = new CarBase();
                        System.out.println("使用CarBase类的对象做参数调用UseCar类的setCar方法:");
                useCar.setCar(base);
                System.out.println("使用SportsCar类的对象做参数调用UseCar类的setCar方法:");
                base = new SportsCar();
                useCar.setCar(base);
                System.out.println("使用Bus类的对象做参数调用UseCar类的setCar方法:");
                base = new Bus();
                useCar.setCar(base);
                System.out.println("使用ElectronicBus类的对象做参数调用UseCar类的setCar方法:");
                base = new ElectronicBus();
                useCar.setCar(base);
        }
}

然后输出如下:
Carbase类的构造方法被调用了!
使用CarBase类的对象做参数调用UseCar类的setCar方法:
setCar(CarBase)方法被调用了
使用SportsCar类的对象做参数调用UseCar类的setCar方法:
Carbase类的构造方法被调用了!
SportsCar类的构造方法被调用了!
setCar(CarBase)方法被调用了
使用Bus类的对象做参数调用UseCar类的setCar方法:
Carbase类的构造方法被调用了!
Bus类的构造方法被调用了!
使用ElectronicBus类的对象做参数调用UseCar类的setCar方法:
Carbase类的构造方法被调用了!
Bus类的构造方法被调用了!
ElectronicBus类的构造方法被调用了!
setCar(CarBase)方法被调用了


然后书上用这两段代码说明了,影响哪个方法被调用的是引用的类型,而不是引用指向的类型。。。。但是版主说刚好要反过来一下。。。。让我纠结了。。。。。


另外,假如说按照版主的说法的话,那“多态”是不是和书中 对象的“变脸”一样的?

TOP

4# qianhang1990


这段代码讲的是重载(overload),不是覆盖(override)。不过貌似输出有点问题,不知道是你抄错了,还是我当时就复制控制台输出错了还是程序哪个地方写的不对。

UseCar 类中,重载(overload)了setCar方法,当传递的参数是ElectronicBus时,应该输出“setCar(ElectronicBus)方法被调用了”,而你给出的输出还是“setCar(CarBase)方法被调用了”。
玩Java,就要脱了Java的衣服然后使劲儿折腾       

TOP

5# deepnighttwo


好的,谢谢斑竹

TOP

返回列表