我知道这是一个非常沉闷的问题(所以新手),但我被困住了。如何从另一个对象访问一个对象的字段? 问题=>如何避免两次创建Test02对象? (第一次=>来自main()循环,第二次=>来自Test01的构造函数)?
class Main
{
public static void main(String[] args)
{
Test02 test02 = new Test02();
Test01 test01 = new Test01(); //NullPointerException => can't access test02.x from test01
System.out.println(test01.x);
}
}
class Test01
{
int x;
Test02 test02; //can't access this, why? I creat test02 object in main() loop before test01
public Test01()
{
x = test02.x;
}
}
class Test02
{
int x = 10;
}
答案 0 :(得分:2)
您必须在Test01中实例化test02(例如在构造函数中)或将main中的实例化对象传递给Test01
所以:
public Test01()
{
x = new Test02();
//...
}
或
class Test01
{
int x;
Test02 test02; //the default value for objects is null you have to instantiate with new operator or pass it as a reference variable
public Test01(Test02 test02)
{
this.test02 = test02; // this case test02 shadows the field variable test02 that is why 'this' is used
x = test02.x;
}
}
答案 1 :(得分:1)
您没有创建Test02
的实例,因此每当您尝试从NullPointerException
的构造函数访问test02
时,您都会获得Test01
。
要解决此问题,请重新定义Test01
类的构造函数,如下所示 -
class Test01
{
int x;
Test02 test02; // need to assign an instance to this reference.
public Test01()
{
test02 = new Test02(); // create instance.
x = test02.x;
}
}
或者,您可以从Test02
-
Main
的实例
class Main
{
public static void main(String[] args)
{
Test02 test02 = new Test02();
Test01 test01 = new Test01(test02); //NullPointerException => can't access test02.x from test01
System.out.println(test01.x);
}
}
class Test01
{
int x;
Test02 test02; //can't access this, why? I creat test02 object in main() loop before test01
public Test01(Test02 test02)
{
this.test02 = test02;
x = test02.x;
}
}
class Test02
{
int x = 10;
}
原因是无论何时尝试创建Test01
的实例,它都会尝试在其构造函数中访问test02
变量。但是test02
变量此时并未指向任何有效对象。这就是为什么你会得到NullPointerException
。
答案 2 :(得分:1)
Test02 test02 = new Test02();
创建的test02对象仅具有main方法的范围。
x = test02.x;
它会给出空指针,因为没有创建对象!