首页 > 初始化代码块中的变量,为什么可以不需要声明数据类型?

初始化代码块中的变量,为什么可以不需要声明数据类型?

public class InstanceInitTest{
{
    a = 6;
}
int a = 9;
public static void main(String[] args)
{
    System.out.println(new InstanceInitTest().a);
}}

初始化代码块中的变量,为什么可以不需要声明数据类型?如上, a=6; 并没有声明类型。


我说一下,如有错误,清指出。
1. 题主说的为什么{}中的a可以不声明类型呢,因为后面的int a = 9已经声明了。
2. 题主应该查一下以下的区别(代码块/静态块):

{
    a = 6;
}
int a = 9;

static{
    a = 6;
}
static int a = 9;

3. 顺便查一下:
普通代码块构造代码块静态代码块同步代码块
当然啦,题主的是构造代码块,它的执行是先于new操作的构造方法的。
静态块优先于主方法的执行,静态块优先于构造方法的执行,而且只执行一次

先说这么些了,虽然没有直接解决题主的问题,但是给个思路也行吧,后面就是自己google了。


做了一下测试,Test.java代码如下:

package com.practice.capter11;

public class Test {
    {
        a = 6;
    }
    int a = 9;
    public static void main(String[] args) {
        System.out.println(new Test().a);
    }
}

下面是编译之后的Test.class文件:

package com.practice.capter11;

import java.io.PrintStream;

public class Test
{
  int a = 6;

  public static void main(String[] args)
  {
    System.out.println(new Test().a);
  }
}

可以看出,java文件的初始化顺序是先执行

int a = 9;

然后执行代码快中的代码

{
    a = 6;
}

所以这个时候,a 的类型已经定义了,即使int类型。

但是这里我也有一个疑问,执行代码,输出的结果是9.很不理解。希望有人可以解惑一下啦。


对象实例化过程中,先声明所有的属性,给属性分配空间,然后是赋值。声明是优先于赋值的。
你所看到的是你自己逻辑顺序,而不是程序执行逻辑顺序,这点弄明白就没问题了


当一个类从被JVM装载开始,各种代码的执行顺序大致如下:
被JVM装载->执行父类的相关代码->如果有静态初始化,先执行静态初始化,且只执行一次,以后即使有该类实例化,也不会再执行->如果有静态代码块,以与静态初始化一样的方式执行->如果有new语句带来的实例化,先为成员变量分配空间,并绑定参数列表,隐式或显式执行super(),即父类的构造方法,->执行非静态代码块-〉执行本类的构造函数-〉执行其他代码

【热门文章】
【热门文章】