搜尋

首頁  >  問答  >  主體

activity - Android中抽象方法赋值时出现null.

首先先声明两个类

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,请问是我哪里理解错误了.

阿神阿神2773 天前430

全部回覆(1)我來回復

  • 巴扎黑

    巴扎黑2017-04-17 17:51:13

    這是類別初始化時參數賦值順序的問題,
    在子類,也就是MainActivity初始化時,首先會初始化父類,也就是Main2Activity。這時候Main2Activity中定義的Student B就需要賦初值了,而初始值來自getStudent()這個方法,於是這個方法就被執行。可是在這個方法執行的過程中,使用的MainActivity中的Person person其實還沒賦初值,其實還是null,所以getStudent()中引用的person就是null,這也導致了後面呼叫getA()的時候傳回的是nullMainActivity初始化时,首先会初始化父类,也就是Main2Activity。这时候Main2Activity中定义的Student B就需要赋初值了,而初始值来自getStudent()这个方法,于是这个方法就被执行。可是在这个方法执行的过程中,使用的MainActivity中的Person person其实还没有赋初值,其仍然还是null,所以getStudent()中引用的person就是null,这也就导致了后面调用getA()的时候返回的是null
    MainActivity中的Person person的赋值,是在子类,也就是Main2Activity初始化操作完成之后的,这个时候Student B已经进行了赋值,所以这时候再对Person person进行赋值,其实不能改变Student B中引用的PersonMainActivity中的Person person的賦值,是在子類,也就是Main2Activity初始化操作完成之後的,這個時候Student B已經進行了賦值,所以這時候再對Person person進行賦值,其實不能改變Student B中引用的Person

    回覆
    0
  • 取消回覆