java 向前引用_Java编译时提示非法向前引用

问题背景:

想了解Java类非静态成员变量以及静态成员变量的初始化过程。在代码块中使用System.out.println输出语句,输出成员变量的值,但是出现非法引用的提示。具体代码如下。

具体代码:

class A {

public A() {

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");

}

private static String staticStr = iniStaticStr();

static {

System.out.println(staticStr);

System.out.println("父类A的静态代码块");

}

private String str = iniStr();

{

System.out.println(str);

System.out.println("父类A的构造代码块");

}

private static String iniStaticStr() {

System.out.println("staticStr = " + staticStr);

System.out.println("静态成员变量显示初始化");

return "iniStaticStr";

}

private String iniStr() {

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");

}

}

class B extends A {

static {

System.out.println("子类B的静态代码块");

}

public B() {

System.out.println("子类B的构造方法");

}

{

System.out.println("子类B的构造代码块");

}

}

public class JavaTest1 {

public  static void main(String[] args) {

new B();

}

}

输出结果:

父类A的静态代码块0

staticStr = 1234

静态成员变量显示初始化

iniStaticStr

父类A的静态代码块

父类A的静态代码块1

子类B的静态代码块

父类A的构造代码块0

str = 123

非静态成员变量显示初始化

iniStr

父类A的构造代码块

父类A的构造代码块1

父类A的构造方法

静态成员变量 = iniStaticStr, 非静态成员变量 = iniStr

子类B的构造代码块

子类B的构造方法

具体问题描述:

1、代码块与成员变量的执行顺序是怎样的?如果代码块先于成员变量执行,那此时的成员变量并没用被声明,那为什么能对成员变量进行赋值?

2、假如是成员变量先于代码块执行,为什么代码块中使用System语句输出操作会提示非法向前引用?

3、成员变量的初始化过程是否是一下过程?

1)默认初始化

2)显示初始化(包括代码块中的显示初始化)

3)构造初始化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值