问题背景:想了解Java类非静态成员变量以及静态成员变量的初始化过程。在代码块中使用System.out.println输出语句,输出成员变量的值,但是出现非法引用的提示。具体代码如下。具体代码:classA{publicA(){System.out.println("父类A的构造方法");System.out.println("静态成员变量="+staticStr+",非静态成员变量="+str);}{//System.out.println(str);//错误:非法前向引用str="123";System.out.println("父类A的构造代码块0");}static{staticStr="1234";//System.out.println(staticStr);System.out.println("父类A的静态代码块0");}privatestaticStringstaticStr=iniStaticStr();static{System.out.println(staticStr);System.out.println("父类A的静态代码块");}privateStringstr=iniStr();{System.out.println(str);System.out.println("父类A的构造代码块");}privatestaticStringiniStaticStr(){System.out.println("staticStr="+staticStr);System.out.println("静态成员变量显示初始化");return"iniStaticStr";}privateStringiniStr(){System.out.println("str="+str);System.out.println("非静态成员变量显示初始化");return"iniStr";}{//System.out.println(str);//错误:非法前向引用System.out.println("父类A的构造代码块1");}static{System.out.println("父类A的静态代码块1");}}classBextendsA{static{System.out.println("子类B的静态代码块");}publicB(){System.out.println("子类B的构造方法");}{System.out.println("子类B的构造代码块");}}publicclassJavaTest1{publicstaticvoidmain(String[]args){newB();}}输出结果:父类A的静态代码块0staticStr=1234静态成员变量显示初始化iniStaticStr父类A的静态代码块父类A的静态代码块1子类B的静态代码块父类A的构造代码块0str=123非静态成员变量显示初始化iniStr父类A的构造代码块父类A的构造代码块1父类A的构造方法静态成员变量=iniStaticStr,非静态成员变量=iniStr子类B的构造代码块子类B的构造方法具体问题描述:1、代码块与成员变量的执行顺序是怎样的?如果代码块先于成员变量执行,那此时的成员变量并没用被声明,那为什么能对成员变量进行赋值?2、假如是成员变量先于代码块执行,为什么代码块中使用System语句输出操作会提示非法向前引用?3、成员变量的初始化过程是否是一下过程?1)默认初始化2)显示初始化(包括代码块中的显示初始化)3)构造初始化
墨色风雨
繁星coding
相关分类