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

比如:

public MainGame   mMainGame ; 与 public MainGame   mMainGame = null;这两句的区别?

编译的时候会不同,未赋值,直接使用编译时会报错。

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

局部变量要赋初始值,全局变量不需要赋初始值;还有int a=null;这句,应该是Integer a=null;
  • 如果在类中声明变量可以不赋值,构造对象时会获得默认值
  • 如果在方法中声明变量,必须赋初始值
作为成员变量来说 int a;默认值为0 ,然而 int a=null;在java这是不正确的;int 为基本类型;只有 封装类型 Integer 的默认值 为null 所以 你可以写成int a ;(0) Integer a;(null)
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并没有开辟内存放入一个对象;而后者,在声明了一个对象的引用后,又把新开辟的没有存储任何有效值的对象的地址赋给了他。

时间: 2024-10-05 04:35:34

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

java中String new和直接赋值的区别

    Java中String new和直接赋值的区别     对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中.对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份. 例如: String str1="ABC": 和String str2 = new String("ABC"); String str1="ABC" 可能创建

Java中String的两种赋值方式的区别

本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过"字面量"赋值,如:String str="hello",第二种是通过new关键字创建新对象,如:String str=new String("hello").那么这两种赋值的方式到底有什么区别呢,下面给出具体分析. 1.首先回顾Java虚拟机的结构图. 在上面的

JAVA中分为基本数据类型及引用数据类型(问题:堆和栈的区别,系统根据什么区分堆栈内存)

一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0 int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0 long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数

js 对象操作 对象原型操作 把一个对象A赋值给另一个对象B 并且对象B 修改 不会影响 A对象

我最近在做一个vue + element-UI + vue-resource + vuex项目的时候,遇到了一个对象的问题. 当我们在项目需要 复制一个对象到另一个对象并且  被复制的对象不能受复制后的对象的影响. 我先总结下 我们哪些方法可以复制对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 // 直接赋值 var obj1 = { a: 1 }; var obj2 = obj1; console.log(obj2)

Java中的克隆close()和赋值引用的区别

学生类Student: package 克隆clone; /*要克隆必须实现这个借口:Cloneable,以标记这个对象可以克隆 Cloneable:此类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制. 这个接口是标记接口,告诉我们实现该接口的类就可以实现对象的复制了. */ public class Student implements Cloneable { private String name; private int ag

为什么java中只允许继承一个类?

一个类只能继承一个其他的类 在Java语言中禁止多重继承:一个类可以具有多个直接父类.多重继承不合法的原因是容易引发意义不明确.例如,有一个类C,如果允许它同时继承A类与B类(class C extends A,B{}),假如A.B两个类都有同一种方法fun(),如果定义: C c = new C(); 那么c.fun()应该调用哪一个父类的fun()方法?无法给出答案,因此Java语言禁止多重继承. 但C++却是可以的,所以C++比起java在语法上却难了些. 这一特性和上一特性结合使用,可以

java中强引用、软引用、弱引用、幻象引用有什么区别?分别使用在什么场景?

不同的引用类型,主要体现在对象的不同可达性(reachable)状态和对垃圾收集的影响. 1.强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就表明对象还"活着",垃圾收集器不会碰这个对象.对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显示的将其强引用赋值为null,就是可以被垃圾收集的,其具体回收的时机还要看垃圾收集策略. 2.软引用是一种相对强引用弱化一些的引用,可以让对象豁免一些垃圾收集,只有当jvm认为内存不足时,才会去试图回收软引用指向的

java中String.valueOf(obj)、(String)obj与obj.toString()有什么区别

方法1:采用 Object.toString()方法 在这种使用方法中,因为java.lang.Object类里已有public方法.toString(),所以对任何严格意义上的java对象都可以调用此方法.但在使用时要注意,必须保证object不是null值,否则将抛出NullPointerException异常.采用这种方法时,通常派生类会覆盖Object里的toString()方法. 方法2:采用类型转换(String)object方法这是标准的类型转换,将object转成String类型

java中?和A、B、T、E、K、V的区别

使用泛型 List<T> list = new ArrayList<T>(); T t = list.get(0); 不使用泛型 List list = new ArrayList(); T t = (T)list.get(0); List同List<?>是一样的 参考文档:http://825635381.iteye.com/blog/2017650 Object...中...的含义 public Long remove(Object... values) { ret