我的问题对我来说很奇怪,并且与java语言有关。我创建了接口和2个类。在界面中我创建了2个对象:public static final MyInterface obA和obB。在每个类中,我创建了存储这些对象的数组。如果我想显示第一类数组,我看不到任何对象。在第二课中,我只看到了第一个对象。我的代码:
public class ROpole implements IDevices {
private static IDevices rOpole = IDevices.rOpole;
private static IDevices rGdańsk = IDevices.rGdańsk;
private IDevices [] connectedWith = {rGdańsk, null};
...
}
public class RGdańsk implements IDevices {
private static IDevices rOpole = IDevices.rOpole;
private static IDevices rGdańsk = IDevices.rGdańsk;
private IDevices [] connectedWith = {rOpole, null, null};
...
}
public interface IDevices {
public static final IDevices rOpole = new ROpole();
public static final IDevices rGdańsk = new RGdańsk();
...
}
我想要显示对象的结果:
rOpole:连接:null,null。
rGdańsk:连接:Model.ROpole@74a14482,null,null。
我不知道为什么对象在这些数组中是不可见的。
我显示对象的方法:
public String getInfoAboutDevice() {
String informationsAboutDevice = "";
informationsAboutDevice += "Connected with: ";
for(int count = 0; count < connectedWith.length; count++) {
if(count == interfaces.length - 1) informationsAboutDevice += connectedWith[count] + ".";
else informationsAboutDevice += connectedWith[count] + ", ";
}
informationsAboutDevice += "\n";
return informationsAboutDevice;
}
答案 0 :(得分:1)
为什么在接口中使用静态字段的继承? 宣布为final的那些在实例化后不会改变。
因此,为了实例化ROpole
或RGdańsk
,JVM需要解析IDevices
。
IDevices
必须初始化最终字段IDevices.rOpole
;目前,最终字段IDevices.rGdańsk
为null
。
创建了ROpole
类型的对象,其connectedWith
数组填充了对null
IDevices.rGdańsk
引用
然后IDevices
必须初始化最终字段IDevices.rGdańsk
;目前IDevices.rOpole
引用刚创建的ROpole
对象,因此IDevices.rGdańsk
字段connectedWith
包含:Model.ROpole@74a14482
您需要检查您的设计:Java Interfaces旨在定义类型和(在Java 8中)行为。您不应该使用它们来继承状态,除非它是静态状态,因此严格地与类型相关并在该类型的所有实例之间共享。
答案 1 :(得分:0)
这是静态初始化顺序的问题。加载IDevices
后,首先会实例化其rOpole
静态字段,然后rGdańsk
。但是,这意味着ROpole
构造函数将在IDevices.rGdańsk
被分配之前运行,因此无法获取正确的引用。