下面这个程序是模拟对Integer的一个包装。
public class IntWrapper
{
private int value;
public IntWrapper(int value)
{
this.value = value;
}
// 包含int类型相关的算法
把十进制转换成2进制,8进制和16进制
}
...main...
{
IntWarapper wrapper = null;
wrapper = new intwrapper(17);
}
学了一段时间的Java,现在忽然有些困惑。
第一次 IntWarapper wrapper = null;
第二次 wrapper = new intwrapper(17);
问题一: 第二次是将第一次的值给覆盖了吗。
问题二: 在我们编写java程序的时候,哪些值是需要初始化或者说程序强制初始化,哪些值是不需要初始化的。
问题一:不是将第一次的值给覆盖了,IntWarapper wrapper = null;null在底层也是一种指针,这个你先不用管,就把它当成,给wrapper初始化为空,不指向任何对象,wrapper = new intwrapper这一句,jvm在运行的时候发现new关键字,在堆中开辟内存空间,并调用构造方法进行初始化,返回这个对象的引用,并赋值给wrapper变量,引用类似C语言的指针但稍有区别,刚开始学习可以把它当成指针
问题二:java中成员变量如果你不对它进行初始化,jvm也会把它赋值为0或者null或者false,类型不同,就不同,局部变量,需要自己初始化,另外,其实一般情况下都是构造器中进行初始化的,因为你要使用它,肯定要给它赋值,如果不初始化的话,基本类型可能只会造成逻辑错误,引用类型会直接崩溃并抛出控指针异常
另外如果需要使用包装类,可以使用java自带的包装类库
一般的基本数据类型不需要指定初始值,虚拟机会自己指定,而变量需要初始值 例如i
基本数据类型必须是类属性不用初始化
第一个问题是这样的 java对于引用数据类型(包装类) 和基本数据类型 这种类型 是两种不同的储存空间
基本数据类型存放在栈中 引用数据类型存放在堆中
第一次 IntWarapper wrapper = null; 这时在栈中开辟一块新的内存空间 用来放wrapper wrapper的类型是IntWarapper 而堆不做动作 你也可以理解
为 他只是一个中间过渡的东西 就是一个变量
第二次 wrapper = new intwrapper(17); 这时候在堆中开辟一块新的内存空间 用来放new的 IntWarapper 类型的对象 而用栈中的warapper来指向(也可以叫作为)
这个新new 的对象
具体的你可以百度一下java的栈和堆的内存
第二个问题
从代码角度出发 你也可以这么理解
当一个实体类只有有参构造 没有无参构造的时候 name如果你要创建一个该实体类的对象 name你就必须先初始化值
因为有的程序在设计的时候 你创建一个类的对象 肯定要用他来干什么事 为了防止你使用中发生有的属性没有值得情况 可以这么做