Java 你能有一个不同种类的对象数组吗?
我知道您只能拥有特定类型的数组(例如字符串、int、Student等)。我想知道在继承的情况下这是否成立,也就是说,扩展车辆的自行车对象是否可以与其他对象(如总线对象)一起放置在车辆数组中 这是我的密码: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
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);
}
}