Java 你能有一个不同种类的对象数组吗?

Java 你能有一个不同种类的对象数组吗?,java,arrays,abstract,Java,Arrays,Abstract,我知道您只能拥有特定类型的数组(例如字符串、int、Student等)。我想知道在继承的情况下这是否成立,也就是说,扩展车辆的自行车对象是否可以与其他对象(如总线对象)一起放置在车辆数组中 这是我的密码: public class Test{ public static void main(String[] args) { Bus bus1 = new Bus(); Bicycle bike1 = new Bicycle(); bike1

我知道您只能拥有特定类型的数组(例如字符串、int、Student等)。我想知道在继承的情况下这是否成立,也就是说,扩展车辆的自行车对象是否可以与其他对象(如总线对象)一起放置在车辆数组中

这是我的密码:

public class Test{
    public static void main(String[] args) {

        Bus bus1 = new Bus();
        Bicycle bike1 = new Bicycle();
        bike1.changeGear(true);
        Bus bus2 = new Bus();
        Vehicle[] myFleet = {bus1, bike1, bus2}; // Note that Vehicle is an abstract class
        for (Bus v: myFleet){ // Trying to access every bus in the Vehicle array. I already
            v.issueTicket(1.50); // tried to get the computer to treat myFleet as a Bus array - doesn't 
            System.out.println(v); // work, sadly.
        }
    }

}
请注意,这是您可以使用的Java语言

java.lang.Object[]myFleet

但这可能太笼统了

如果您的对象有一个公共接口(比如
Foo
),那么您可以使用

Foo[]myFleet


还可以查看一些Java容器,如
ArrayList

如果Class2扩展了ClassOne,并且您创建了一个ClassOne数组,那么您可以向数组中添加ClassOne的对象,但是,除非您强制转换,否则您只能访问ClassOne的成员。

您有一个超级类型的数组

for
迭代iterable对象(此处为数组)中的所有项

由于数组中可能存在
Bicycle
Bus
实例(甚至是当前未知的其他类型),因此不能将其视为
Bus
数组

您可能想要的是:

for (Vehicle v : myFleet) {
     if (v instanceof Bus) {
         Bus b = (Bus)v;
         b.doSomeSpecialThingsForABus();
     }

}

除了“可能”之外,没有别的好办法了。

是的……但是

,您可以拥有一系列车辆,如1号巴士、2号巴士和1号自行车

…但是这并不能阻止你的自行车成为自行车,或者把它变成公共汽车。数组是对象引用的列表,它不会获取对象的新副本并将其转换为数组类型:对象仍然是其原始类的实例

该数组可以容纳车辆,而不考虑其子类,它不会将其更改为公交车、自行车或车辆:类型保持不变

然而,你可以试着把自行车换成公共汽车:如果你承认你会失去任何非公共汽车属性。您还可以使用instanceof来确定车辆是公交车还是自行车,并在需要时进行转换


我花了一些时间才明白你的意思

如果你想这样做,你必须将
车辆
转换成
总线
。 但是,通常情况下,所有车辆都应该有一个通用的接口

由于
issuecticket()
不适用于自行车,您可能会考虑完全不使用相同的总线和自行车接口

另一个想法是为bicecles实现
issueTicket()
方法,只要调用它就发出错误信号:

Vehicle[] myFleet = {bus1, bike1, bus2}; // Note that Vehicle is an abstract class
for (Vehicle v: myFleet){
    v.issueTicket(1.50);
    System.out.println(v);
}
然而,在我看来,这仍然像一个设计,可以更好

为了让我提供更多的建议,最好能知道为什么这些物品应存放在同一容器内

希望有帮助

致以最良好的祝愿,
Joerg

假设bus和bicycle都扩展了相同的超类或实现了相同的接口,那么它们可以被放入接口或超类类型的数组中

要访问这些,您可以检查它们是否是任何子类的实例

for (Vehicle v: myFleet){
    if(v instanceof Bus){
        ((Bus) v).issueTicket(1.50); 
    }
}

但是,不建议使用instanceof,在大多数情况下,最好找到一个接口或超类来描述数组中所有对象所需的通用功能。

什么是
不起作用
的意思?这意味着抛出ClassCastException。说明:“成员”在这个上下文中是指方法、字段等。好的,如何进行强制转换?我似乎无法使用语法。不过你说的很有道理。很好的解释!谢谢,这很有道理!
for (Vehicle v: myFleet){
    if(v instanceof Bus){
        ((Bus) v).issueTicket(1.50); 
    }
}