如何从类中的方法访问对象?

时间:2017-05-04 19:36:46

标签: java

我有两个类,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);
        };
}

2 个答案:

答案 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)不能从另一个类起作用,因此 使用帮助器方法来获取实例。