初始化拿一个程序来说就是先加载基本的数据,拿变量来说就是给它一个初始值
分配内存,初始化实例变量的值,还有就是依次创建当前类所在继承链上的所有类的对象。如果有初始化块,会自动运行。
java中基本类型采用C与C++中相同的方法,不采用句柄的方式,基本类型的变量容纳了具体的值(固定长度),存在于堆栈中。
如果基本数据类型作为一个类的成员变量,即使不显示初始化(赋值),java中保证其获得一个默认初始值分别如下(C++没有这种功能):(这种赋默认值不适用与其作为局部变量的情况,不显示初始化会有编译期错误)
boolean false
char ‘\u0000′(null)
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d
java中除了八大基本类型一切都是对象,在声明变量时String s;只是获得了一个句柄,其并不指向一个对象,在使用时必然会出现运行期错误(空指针)。应该初始化String s = “abcd”;
这是字符串这种特殊类型的初始化方式,更通用的是用new关键字进行句柄与新对象的链接。
一、null指的是不确定的对象;
null用来判断引用类型是否分配了存储空间。
String s = null;已经分配了存储空间,只是不确定是什么类型,称为空对象。(其实就是不确定对象时初始化分配内存的一种状态,等待被真的指向一个某对象)。
Java中,变量的使用都遵循一个原则,先定义,并且初始化后,才可以使用。我们不能int a后,不给a指定值,就去打印a的值。这条对对于引用类型变量也是适用的。
null代表声明了一个空对象,对空对象做任何操作都不行,除了=和==(==比较的是引用类型存储的地址,基本类型的值。)。
“”是一个字符串了,只是这个字符串里面没有内容。
String s=null;只是定义了一个句柄,也就是说你有了这个引用,但是这个引用未指向任何内存空间。
String s=””;这个应用已经指向了一块是空字符串的内存空间,是一个实际的对象了,可以应用所有Sting类型的方法。
String s = “aaa”;与String s=new String(“aaa”);有本质的区别:
前者是在字符串池中写入一个字符串“aaa”,然后用s指向它,在栈上分配内存;
后者是在堆上创建一个内容为“aaa”的字符串对象。
String a=””;String b=””;
上面两者变量a、b指向同一内存地址。
String a=new String(“”);String b=new String(“”);
上面两者变量a、b指向不同内存地址。
字符串缓冲池
原因是String类维护着一个字符串池,对于前两者的赋值方法,String会在这个池中查找字符串是否已经在池中,如果在,就直接指向该地址,如果不在,则生成一个实例放入池中,再指向。之所以这样做,因为String是一个内容不可变的量,运用的是设计模式GOF.FlyWeight。
String s=null;String s=””;String s;三者的区别
第一个是创建一个空字符串对象;
第二个是创建一个字符串为空的字符串对象;
第三个是声明一个字符串对象,但并没有分配内存,而第一个第二个已经分配了内存。
对于第三种,不能使用if(s==null),或者int length = s.length();不能通过编译,报没有初始化。
第一和第三有时候是等同的,有时候是不同的。
java为了安全原因不允许一个悬挂引用,没有赋值的引用地址一律自动赋值为null,防止访问到任意内存。(但是此点只限于成员变量)
在局部变量中是不同的,String s不会分配内存,需要显示赋值。
总结:
java中成员变量编译器会自动赋值,局部变量都要显示赋初值。
注意静态资源的使用方法。
Map<String, Object> n = ll.hh();
Map hh(){
//1、return new HashMap<String, Object>();
2、return null;
}
1、返回的是HashMap对象,2返回的是null对象。instanceof前者为真,后者为假。
这里编程的时候要考虑到函数返回值为null的情况。
二、null本身不是对象,也不是Object的实例。
null本身虽然能代表一个不确定的对象,但就null本身来说,它不是对象,也不知道什么类型,也不是java.lang.Object的实例。
三、容器类型与null
List:允许重复元素,可以加入任意多个null。
Set:不允许重复元素,最大可以加入一个null。
Map:Map的key最多可以加入一个null,value字段没有限制。
数组:基本类型数组,定以后,如果不给定初始值,则java运行时会自动给定值。引用类型数组,不给定初始值,则所有的元素值为null。
四、null的其他作用
1、判断一个引用类型数据是否null。用==来判断。
2、释放内存,让一个非null的引用类型变量指向null。这样这个对象不再被任何句柄应用,会等待JVM垃圾回收机制去回收。
http://lavasoft.blog.51cto.com/62575/79243
http://www.360doc.com/content/12/1107/09/600840_246328536.shtml
引用类型当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
对于引用类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。
java中初始化是指分配内存
java中初始化顺序:
1,在new B一个实例时首先要进行类的装载。(类只有在使用New调用创建的时候才会被java类装载器装入)
2,在装载类时,先装载父类A,再装载子类B
3,装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化)
4,装载子类B后,完成静态动作
类装载完成,开始进行实例化
1,在实例化子类B时,先要实例化父类A
2,实例化父类A时,先成员实例化(非静态代码)
3,父类A的构造方法
4,子类B的成员实例化(非静态代码)
5,子类B的构造方法