欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

变量初始化

程序员文章站 2024-02-01 13:27:40
...

变量未初始化这个问题,相信是几乎所有编程者都遇到过的一个编译期异常

int a;        System.out.println(a);
Integer b ;             System.out.println(b);

 对于这两句不知道大家有什么看法

我遇到过一个面试官,记得当时是去面试java讲师,他问我基本数据类型和包装数据类型的区别

我回答了一大堆,最后说基本上数据类型整数型默认值是0,布尔型默认值是false,字符型默认值是\u0000,浮点型默认0.0,引用数据类型默认值是null

他当时就问我,以你的意思是我定义一个int变量,不给他复制,使用System.out.println打印是0?

我肯定回答是,然后他告诉我说不是,说唯有定义成数组才有默认值,其他时候是没有的,不信你回去试,根本打不出来

我当时就惊了,我编程这么久,难道一直理解都是错误的?

public class A {
	static int a ;
	public static void main(String[] args) {
		System.out.println(a);
	}
}

 回家我就写了这么一段代码,发现没问题啊,还以此试了基础数据类型都没问题,我当时就觉得他挺逗的

后来我问了我一个朋友这个问题,他说应该会报错吧,变量未初始化

然后我就知道了

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

 那个面试官肯定是这么理解的,把变量放在了方法里面

如果把变量放到类里面,那我肯定对的,但是如果放到方法里面呢?到底谁对?谁错?

其实我觉得我还对的,因为从机器的角度出发,不管初始化没有初始化,把结果输出了就行了

上一章说过,基础数据类型来自c语言的函数库,在里面本身就给赋值了,这里我们暂时不解释,因为这里超出了java的范围,我们看看引用数据类型

假如我定义String类型呢?答案还是一样的

我们来看看java源码

 

/**
     * Prints a string.  If the argument is <code>null</code> then the string
     * <code>"null"</code> is printed.  Otherwise, the string's characters are
     * converted into bytes according to the platform's default character
     * encoding, and these bytes are written in exactly the manner of the
     * <code>{@link #write(int)}</code> method.
     *
     * @param      s   The <code>String</code> to be printed
     */
    public void print(String s) {
        if (s == null) {
            s = "null";
        }
        write(s);
    }

  从上面我们可以看出,不管我们传递什么值都是能打印出东西的,那么为什么会有变量未初始化呢

 

在编程之中,空引用会引发空指针异常,

因为从java的角度来说,任何变量未定义值都是null(基础类型不属于java角度,只是引用),会引发空指针异常,只是像print这种判空的方法比较特殊而已,空的话代表你不引用,直接传个null就是,何必整个变量,因此才会有变量未初始化这么一个编译期的异常,导致了有的人认为基础数据类型不初始化无值的情况

相关标签: java