java赋值为0_赋值为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根本不能引用。

第二部分

编译的时候会不同,未赋值,直接调用编译时会报错(未初始化的错误)。

不赋值就不会分配空间,赋值null会分配0大小的初始空间

局部变量要赋初始值,成员变量不需要赋初始值有默认值;还有int a=null;这句是错的,应该是Integer a=null;。

如果在类中声明变量可以不赋值,他会在对象实例化的时候由构造函数赋值。一个类一定会有至少一个构造,有构造创建时一定会调用(不调用无法创建对象),所以至少也会调用午餐构造,赋以默认最小值0或null。

如果在方法中声明变量,必须赋初始值。

第三部分

一个对象只声明不赋值,则只会在内存的栈区创建引用,堆中并无此引用的指向。

而null对象在堆中会被java的垃圾回收机制回收。

java中对象引用放在栈中,对象的实例放于堆中,如果为null,说明只在栈中。

首先要明白,java里对象传递的时候,传递的都是引用(也就是对象的地址),这比传递整个对象高效的多。而基础类型,int,double等传递的才是值。 比如,(new ArrayList).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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值