面试题0003-试着输出未进行初始化的成员变量时,会有什么结果?

如果我们尝试输出未进行初始化的成员变量时,会有什么样的情景发生?

直接上代码:

package components.javaTest.day3_20200826;

/**
 * Question0003:
 * 试着输出未进行初始化的成员变量时,会有什么结果?
 */
public class VariableInitialization {

    public int a;

    public static void main(String[] args) {
        System.out.println("a:" + a);
    }

}

大家可以先想一下,会有什么样的结果,“便已报错”、“0”、“null”...?

有了答案之后,我们看比真实结果:

可以看到编译期间报错了,

起初,没有看提示,会不会是认为变量a没有初始化导致编译报错了?

其实不是的:

根据应为提示,可以得知是由于a并不是由static修饰的变量,无法被引用在环境当中。


既然是由于a是非静态变量的缘故不能放在main方法里面,我们将其用static关键字修饰,并且看看main方法的输出结果:

package components.javaTest.day3_20200826;

/**
 * Question0003:
 * 试着输出未进行初始化的成员变量时,会有什么结果?
 */
public class VariableInitialization {
    //public int a;
    public static int a;

    public static void main(String[] args) {
        System.out.println("a:" + a);
    }
}


可以看到编译通过,执行成功,并且打印结果是0,那么问题来了:

a为什么=0?,我们先记住下面这几句真理

1.无论创建多少个对象,静态数据都只占用一份存储区域

2.static关键字不能应用于局部变量,即它只能作用于域(field)【成员变量、方法、类】

3.如果一个域是静态的基本类型域,也没有对它进行初始化,那么它就会获得基本类型的标准初值;如果他是一个对象引用,那么它的初始化值就是null

这里涉及到1个知识点,需要进行一次总结,就等下次吧,那就是“java对象的标准初始默认值的相关知识点总结”。


如果是非static修饰,但是并不是成员变量,而是在main方法中呢?

package components.javaTest.day3_20200826;

/**
 * Question0003:
 * 试着输出未进行初始化的成员变量时,会有什么结果?
 */
public class VariableInitialization {
    //public int a;
    //public static int a;

    public static void main(String[] args) {
        int a;
        System.out.println("a:" + a);
    }
}


可以看到编译器是报错了,提示a变量未曾初始化。

也就是在java里面,一个对象如果没有初始化,是不能够被使用的,如果强行使用未被初始化的对象,编译时就会报错【在没有找到反例之前,暂时可以理解它也是一条真理】

每日1道面试题分析,就到这,我们明天见!


非  淡  泊  无  以  明  志
非 宁 静 无 以 致 远 !