我有两个类,A和B. A包含我想在B中使用的属性。
我想在每次初始化新对象时将我在B中初始化的所有对象放入一个数组中。使用此代码,第一个对象应该转到数组位置1,第二个对象应该转到数组位置2,依此类推。变量n基本上决定了对象应该去哪个位置。
我知道“这个”。我可以从这个对象访问各个变量(正如你可以看到x和y),但我不知道如何作为一个整体访问该对象。你看我在我的代码中有一条评论,它显示了我尝试做的事情。它不起作用,因为它不是正确的语法。
我必须放在那里它才能起作用?
class A{
private int x, y;
private static int n;
A(int x, int y){
this.x = x;
this.y = y;
n++;
//B.object[n] = this.object;
//I tried this but it doesn't work
};
}
class B{
public static A[] object = new A[10];
public static void main(){
A object1 = new A(1,2);
A object2 = new A(3,4);
A object3 = new A(5,6);
};
}
答案 0 :(得分:1)
B
类中的 A
引用包含B.object[n] = this;
种类型,因此您只需设置this
,如下所示(在这里,A
本身代表当前的this.object
对象,因此无需说class A{
private int x, y;
private static int n;
A(int x, int y){
this.x = x;
this.y = y;
n++;
B.object[n] = this;
};
}
class B{
public static A[] object = new A[10];
public static void main(String[] args){
A object1 = new A(1,2);
A object2 = new A(3,4);
A object3 = new A(5,6);
};
}
):
main
此外,在Java中,String[]
方法将main()
作为输入参数(如上所示),这将是JVM在开始时执行的方法(尽管使用Flowable<SuccessfulObject> stream = Flowable.fromArray(
new SuccessfulObject(true, 0),
new SuccessfulObject(false, 1),
new SuccessfulObject(true, 2));
stream = stream.doOnEach(System.out::println);
Flowable<SuccessfulObject> successful = stream.filter(SuccessfulObject::isSuccess);
Flowable<SuccessfulObject> failed = stream.filter(SuccessfulObject::isFail);
successful.doOnEach(successfulObject -> {/*handle success*/}).subscribe();
failed.doOnEach(successfulObject -> {/*handle fail*/}).subscribe();
,代码编译,但JVM在开始时不会调用它。
但是作为旁注,记住你正在尝试做的是创建循环依赖(A类依赖于B类,然后B类依赖于A类),所以避免这样做。
答案 1 :(得分:0)
虽然javaguy的解决方案可以解决您的问题,但它可能会导致编译器在构造函数中发出“泄漏此信息”的警告。
这在多线程环境中可能存在潜在危险,因为它允许您在A
完全运行其构造函数之前获取对B.object
的引用(通过A
)。 / p>
在这种情况下,更好的模式可能是在A
中使用静态辅助方法为您构造这些对象,将它们添加到列表中,然后返回对它们的引用。
class A{
private static int n;
private int x, y;
public static A createA(int x, int y){
A result = new A(x, y);
n++;
B.object[n] = result;
return result;
}
private A(int x, int y){
this.x = x;
this.y = y;
}
}
class B{
public static A[] object = new A[10];
public static void main(String[] args){
A object1 = createA(1,2);
A object2 = createA(3,4);
A object3 = createA(5,6);
}
}
通过使A的构造函数成为私有,您可以确保new A(1,2)
不能从另一个类起作用,因此 使用帮助器方法来获取实例。