标签:第三部分 多少 默认值 完成 字符串 字符 机制 创建 区别
如果在方法中声明变量,声明时不赋值和给个null是不一样的,赋值null也相当于完成了初始化赋值,这个时候可以通过编译也可以可以调用对象方法,但必然会报空指针异常。但Java中成员变量不需要赋予初始值,但一般会有一个默认初值,基本类型如int初值为0,除基本类型变量外,其他对象的初始值都是null.
总之,一个局部对象使用之前肯定要先赋值,但不管你在什么时候赋值。
所以,无论是成员变量还是局部变量,声明的时候不赋值只声明是可以的。
1. 像这种String str = xxx;
不管xxx是null还是其他字符串,str这个东西都是在栈里有块空间,=null的时候,里面栈存的是null,非null的时候栈存的是实际字符串的地址(堆中或者常量池中)。
2. 而String str;
这种情况,jvm同样也为其分配了一块空间,但是不知道值是多少,java语法要求引用之前必须初始化,所以你直接这么写,str根本不能引用。
如果在方法中声明变量,必须赋初始值。
首先要明白,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