首先先声明两个类
public class Person {
.....
}
public class Student {
public Person A;
public Student(Person a) {
A = a;
}
.....
}
MainActivity
在实现抽象activity
时出现空的返回值
public abstract class Main2Activity extends AppCompatActivity{
Student B = getStudent();
oncreate(...){
......
getStudent().getA();
//A不为null
B.getA();
//A为null
}
public abstract Student getStudent();
}
MainActivity
public class MainActivity extends Main2Activity{
Person person = new Person(10);
@Override
public Student getStudent() {
Student student = new Student(person);
return student;
}
}
为什么会出现成员变量A为null
的情况,但是在声明周期中赋值时并不会出现这个问题.两种情况下成员变量B
都不会是null
,请问是我哪里理解错误了.
巴扎黑2017-04-17 17:51:13
これは、クラスの初期化時のパラメータの割り当ての順序に問題があります。
サブクラス、つまり MainActivity
が初期化されると、親クラス、つまり Main2Activity
が最初に初期化されます。このとき、Main2Activity
で定義された Student B
には初期値を割り当てる必要があり、初期値は getStudent()
メソッドから取得されるため、このメソッドが実行されます。ただし、このメソッドの実行中、使用される MainActivity
内の Person person
には実際には初期値が割り当てられておらず、まだ null
であるため、getStudent()
で参照される person
は null
になります。これにより、後で getA()
が呼び出されたときに null
が返されます。 MainActivity
の Person person
の代入はサブクラス内で、つまり Main2Activity
の初期化操作が完了した後に行われます。この時点では、Student B
はすでに代入されているため、この時点では Person person
は再度割り当てられますが、実際には、Student B
で参照される Person
は変更できません。