Java子类继承父类的一个小坑

        我遇到的这个小坑就是,在调用构造方法的时候,子类(派生类)重写了父类构造方法中的方法,会出现没有初始化值得问题。可能我描述的不是很清楚,直接上代码看得清晰一些。

        父类

package cn.ALeeCJ.learningproject.JavaLearning;

import android.util.Log;

public abstract class ParentClass {

    public ParentClass(){
        Log.i("ALeeObj", "父类构造方法开始");
        init();
        Log.i("ALeeObj", "父类构造方法结束");
    }

    protected abstract void init();

    public abstract void print();
}

        子类

package cn.ALeeCJ.learningproject.JavaLearning;

import android.util.Log;

public class SonClass extends ParentClass {

    private String sonStr1 = "sonStr1";
    private String sonStr2 = "sonStr2";

    public SonClass(){
        Log.i("ALeeObj", "子类构造方法开始");
        Log.i("ALeeObj", "son sonStr1: " + sonStr1);
        Log.i("ALeeObj", "son sonStr2: " + sonStr2);
        Log.i("ALeeObj", "子构造方法结束");
    }


    @Override
    protected void init(){
        Log.i("ALeeObj", "init sonStr1: " + sonStr1);
        Log.i("ALeeObj", "init sonStr2: " + sonStr2);
    }


    public void print(){
        Log.i("ALeeObj", "sonStr1: " + sonStr1);
        Log.i("ALeeObj", "sonStr2: " + sonStr2);
    }
}

        测试类

package cn.ALeeCJ.learningproject.JavaLearning;

import cn.ALeeCJ.learningproject.BaseActivity;
import cn.ALeeCJ.learningproject.R;

public class JavaLearningView extends BaseActivity {

    @Override
    protected void setContentView(){
        setContentView(R.layout.empty_layout);
    }

    @Override
    protected void init(){
        SonClass test = new SonClass();
        test.print();
    }

    @Override
    protected void addListener(){

    }
}

        测试结果

说明:

子类继承父类,如果重写了父类构造方法中包含的方法(如此次测试的init()方法),一定要注意,在子类中声明的变量(如此次测试的sonStr1和sonStr2),即使初始化了,仍会是默认值(此次为String类型,所以为null),如果子类声明的变量是和父类同名的变量,会以父类的为准。子类继承父类,只有重写方法有效,重写属性无效。在子类声明的变量,无论是否初始化了,在父类的构造方法阶段,都不能拿到子类声明的变量属性,只有执行到子类的构造方法,才能得到。因此一定要注意是不是做好空处理,不然就是崩溃问题。

发布了24 篇原创文章 · 获赞 2 · 访问量 3668

猜你喜欢

转载自blog.csdn.net/ALee_130158/article/details/100013045
今日推荐