赋值为0或null,和不赋值的区别

Posted macht

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了赋值为0或null,和不赋值的区别相关的知识,希望对你有一定的参考价值。

赋值为0或null,和不赋值的区别

第一部分

如果在方法中声明变量,声明时不赋值和给个null是不一样的,赋值null也相当于完成了初始化赋值,这个时候可以通过编译也可以可以调用对象方法,但必然会报空指针异常。但Java中成员变量不需要赋予初始值,但一般会有一个默认初值,基本类型如int初值为0,除基本类型变量外,其他对象的初始值都是null.
总之,一个局部对象使用之前肯定要先赋值,但不管你在什么时候赋值。
所以,无论是成员变量还是局部变量,声明的时候不赋值只声明是可以的。

1. 像这种String str = xxx;
不管xxx是null还是其他字符串,str这个东西都是在栈里有块空间,=null的时候,里面栈存的是null,非null的时候栈存的是实际字符串的地址(堆中或者常量池中)。
2. 而String str;
这种情况,jvm同样也为其分配了一块空间,但是不知道值是多少,java语法要求引用之前必须初始化,所以你直接这么写,str根本不能引用。

第二部分

  1. 编译的时候会不同,未赋值,直接调用编译时会报错(未初始化的错误)。
  2. 不赋值就不会分配空间,赋值null会分配0大小的初始空间
  3. 局部变量要赋初始值,成员变量不需要赋初始值有默认值;还有int a=null;这句是错的,应该是Integer a=null;。
  4. 如果在类中声明变量可以不赋值,他会在对象实例化的时候由构造函数赋值。一个类一定会有至少一个构造,有构造创建时一定会调用(不调用无法创建对象),所以至少也会调用午餐构造,赋以默认最小值0或null。
  5. 如果在方法中声明变量,必须赋初始值。

    第三部分

    一个对象只声明不赋值,则只会在内存的栈区创建引用,堆中并无此引用的指向。
    而null对象在堆中会被java的垃圾回收机制回收。
    java中对象引用放在栈中,对象的实例放于堆中,如果为null,说明只在栈中。
首先要明白,java里对象传递的时候,传递的都是引用(也就是对象的地址),这比传递整个对象高效的多。而基础类型,int,double等传递的才是值。 比如,(new ArrayList<String>).add(new String("hello")),jvm只是把new String("hello")的地址存入到了列表list里面。String str = new String("Test"),是开辟内存放入了对象,并把它的引用赋给str。 同理,BookInfo bookinfo=null与BookInfo bookinfo=new BookInfo():前者,是声明了一个对象(的引用),jvm并没有开辟内存放入一个对象;而后者,在声明了一个对象的引用后,又把新开辟的没有存储任何有效值的对象的地址赋给了他。

成员变量要是对象类型

因为对象类型可以为null;而null和0的意义又不一样,所以null对查询没有影响。

静态变量是在什么时候赋值的

在类被加载到jvm的时候被创建,类是什么时候被加载到jvm?是在.java---.class---.jar---一次性全加载入jvm的。这时候创建静态成员,普通成员实例化的时候才创建。

以上是关于赋值为0或null,和不赋值的区别的主要内容,如果未能解决你的问题,请参考以下文章

JS中undefined和null的区别?什么时候应该赋值null?

issetemptyis_null的区别

null和undefined的区别

java中,只声明一个对象不赋值,与声明一个对象并赋为 null 的区别

int c=8;和int? c=8;有啥区别,作用是?

js中undefined和null的区别