返回列表 回复 发帖

《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两个对象的信息呢?  

对于这个概念有点混乱啊,求指导,谢谢
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)方法被调用了


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


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


好的,谢谢斑竹
返回列表