java类中声明的立即赋值的成员变量,真的立即赋值了吗?

来源:互联网 发布:性价比高的红酒 知乎 编辑:程序博客网 时间:2024/06/04 18:42

 java类中声明的立即赋值的成员变量,真的立即赋值了吗?

  我告诉你答案。并没有!

  下面我们来执行一个例子,验证一下?

  首先定义一个抽象的父类,父类的构造函数中调用子类实现的方法。

  public abstract  class Parent {public Parent(){System.out.println("在父类的构造函数中调动子类的实例化了initVariables方法,输出的值是");initVariables();}protected abstract void initVariables();}

再定义一个子类。

public class Son extends Parent{private int number=6;public Son(){super();System.out.println("在子类的构造函数中,在super下面执行initVariables方法,输出的值是");initVariables();}@Overrideprotected void initVariables() {System.out.println("number is "+number);}}

好,下面就来实例化一个子类对象看看输出吧!

public class Main {public static void main(String[] args) {Son son = new Son();}}


输出的内容是:

在父类的构造函数中调动子类的实例化了initVariables方法,输出的值是number is 0在子类的构造函数中,在super下面执行initVariables方法,输出的值是number is 6

   为什么在父类构造函数中调用子类的initVariables方法输出number的值是0呢?我明明在声明number的时候就是赋值为6了的啊(privateintnumber=6;)。但是在子类的构造函数中调用initVariables方法确实输出正常呢?实在是百思不得其解。

  没有其他办法了?看来只能调试,一步一步看程序是怎么进行的。

  1.定义Son对象,首先进入Son构造函数

   2.调用了super,所以进入父类构造函数

   3.父类调用了子类的initVariables方法,此时number为0

  4.父类构造函数执行完了,按理说应该是回到子类执行super下面的initVariables方法的啊,但是程序是执行声明和赋值的成员变量的那里privateintnumber=6;当执行完成员变量赋值后才回到super后面的initVariables方法。这时候输出就是number=6了。

   看到这里大家应该懂了。对于类中的成员变量,一般的数据类型,声明成员变量之后就有一个默认值,比如privateintnumber;其实这个number就是等于0了的。java虚拟机会默认给他一个值,对于其他的对象就是默认值为null.

  为什么要说这个问题呢?因为之前我在做一些程序的时候,就是在父类构造函数中调用子类实现的抽象方法,而在这个方法中又使用到了子类的成员变量(这些变量是在声明的时候就赋值了的),然后执行程序,发现怎么都不是我想要的东西。原来是这些变量其实在父类构造函数中调用的方法时还没有真正的赋值。

  希望对大家有帮助!

    
1 0
原创粉丝点击