今天遇到个新问题,关于super引用的基类变量的初始化问题。public class father1 {
  public Log logger = null;
//  public static Log logger = null;
  .......}public class father2 extends father1{
  
  public void execute(){
    logger.debug("execute start");
  }
}public class son extends father2 {
  public static void main(){
  
  Log logger = Log.getlogger("abc");
  
  son s1 = new  son();
//  super.logger = logger;
  s1.logger = logger;
  s1.execute();
  }
}1.当father1中的logger不是static变量的时候,在son类的main方法中,我用生成的实例s1对logger变量初始化后,调用execute()没有发生错误。
  但是如果我用super.logger对logger初始化,在调用execute()方法时就会有错误发生(java.lang.NullPointerException)。2.如果我把father1中的logger改变为静态变量的时候,用如上两种方法调用都不会发生错误。因为对super关键词不了解,还有就是对基类,子类方法之间的关系不很明白所以搞不懂,希望大家帮忙解答下。

解决方案 »

  1.   

    super就是继承上一级很简单的关键字没什么好说的
    但是如果你用super.logger的时候
    就是说你只是调用father2中的logger的这个属性
    而father2中恰好没有这个属性
    所以用super的时候空指针异常当你用注释掉的时候
    java默认是先从最顶层开始初始化数据
    也就是说从object再father再father2再son
    而当初始father的时候
    是有logger的这个参数的
    所以没有出现空指针异常
      

  2.   

    我的理解:
    1,因为son函数继承f2之后隐藏有变量logger,但是你在son中重新定义logger后,就覆盖了super(父类f1,f2)中的logger(你能在一个类中定义两个类型相同,名字相同的变量吗?这是不可能的。),当然就不然用了,此时son中的logger的引用覆盖了super中的logger引用。
    2,如果是静态变量,就是说supper.logger是不会被覆盖的(引用不会被覆盖),此时f1,son(f2中没有logger,企图在此处使用logger--不是supper.logger,是不行的,前一种情况中就可以用)中有两个不同的logger的引用,所以就能正常使用supper.logger(指f1中的loggger)了。