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

目录

  • 赋值为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的。这时候创建静态成员,普通成员实例化的时候才创建。

原文地址:https://www.cnblogs.com/macht/p/11622630.html

时间: 2024-10-05 06:00:05

赋值为0或null,和不赋值的区别的相关文章

为变量或字符串对象赋空值null、长度为0的字符串、不赋值 占不占内存

代码: public class TestNullAndNothing { int a;//自动赋值为0:如果是对象,自动赋值为null public static void main(String[] args) { String s=""; System.out.println("长度为0的字符串:"+RamUsageEstimator.sizeOf(s));//打印所占内存大小 String ss=null; System.out.println("

java-int类型:int默认为0导致更新操作未赋值的情况下将值更新为0

日常开发中,做更新操作的时候的处理方法为:当这个字段有值则更新,没有值就不更新,在mybatis的xml中表现为: <!-- 修改记录,只修改只不为空的字段 --> <update id="updateBySelective" parameterType="Object" > update tb_mj_user set <trim suffixOverrides="," > <if test="

c语言:对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。

对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出. 解:程序: #include<stdio.h> int main() { int i, a[10]; for (i = 0; i <= 9; i++) { a[i] = i; } for (i = 9; i >= 0; i--) { printf("%3d", a[i]); } printf("\n"); return 0; } 结果: 9  8  7  6 

JS中undefined、null以及NaN之间的区别,以及对象属性赋值的面试题

(1)以下三种情况typeof 返回类型为undefined --当变量未初始化时 --变量未定义时 --函数无明确返回值时(函数没有返回值时返回的都是undefined) (2)Null 类型 undefined 是由null派生处理的,因此undefined == null undefined 是声明了但是没有初始化的该变量, null表示尚未存在的对象 . (3)NaN 值 是一个特殊值,表示非数(Not a Number),类型转换失败就会返回NaN --NaN 不等于自己,即 NaN

js 中 0 和 null 、&quot;&quot; 的逻辑关系

在做字符串非空判断时,无意发现一个问题,记录下以便以后回顾. 问题描述:非空判断,只是校验传值的内容是否为"".null .undefined.当变量 赋值的字符串内容为 0,此时做非空校验竟然返回true,说当前变量值为空. 代码如下: 1 //模拟赋值 0 2 var str = "0"; 3 4 /** 5 * 判断字符是否为空的方法 6 * 为空 返回 true 7 * 不为空返回 false 8 * @param {Object} obj 9 */ 10

PHP中空字符串介绍0、null、empty和false之间的关系

0是数字,是empty,是false,不是null,值相当于空字符串,但类型不是字符串,去空格或强制转换为字符串型时不等于空字符串 ""的值相当于0,是empty,是空字符串,是false,不是null,不是数字字符串 null的值相当于空字符串,值相当于0,是empty,是false,不是字符串,不是数字0 "=="只要值相等就满足条件: "==="需要两个变量的值和类型都相等: strval();将变量转换为字符串类型: intval();将

优先选择nullptr而不是0和NULL

我们知道:0是一个int,而不是一个指针.如果C++在一个只有指针才能够使用的上下文中发现它只有一个0,那么它会勉强将0解释成空指针,但那时一种倒退行为.C++的主要方针是0就是一个int,而不是指针. 实际上来说,对于NULL也是一样.关于NULL还有一些不确定因素,因为其实现允许给NULL一个整型而不必是int(比如说long).这并不常见,但是也无关紧要,因为这里的问题并不是NULL的确切类型是什么,而是0和NULL都不是指针类型. 在C++98中,主要的启示就是对指针和整型分别进行重载可

php中0,空,null和false之间区别

$a = 0; $b="0"; $c= ''; $d= null; $e = false; echo "5个变量-原始测试类型"; var_dump($a);//int 0 var_dump($b);//string '0' var_dump($c);//string '' var_dump($d);//null var_dump($e);//boolean false echo "<h4>empty测试</h4>"; v

mybatis sql语句中 like in() 长度为0或null的情况

mybatis sql语句中 like in() 长度为0或null的情况 比如: select * from A where colName LIKE IN <foreach collection="moCodeList" item="item" index="index" open="(" close=")" separator=","> #{item} </for