目录
- 赋值为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<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的。这时候创建静态成员,普通成员实例化的时候才创建。
原文地址:https://www.cnblogs.com/macht/p/11622630.html
时间: 2024-10-05 06:00:05