有时候总是卡在一些类型的初始值上,今天闲下来就来自己给自己记录一下。
String a;
如果直接打印会提示未初始化。并且未初始化的a不能比较。
这时,我们定义个person类
person{
String name;
private Integer age;
private int aa;
.......
}
我们来看看age会怎么样。
结果还是不能够打印,但是却可以用于比较
person p1= new person(); if("".equals(p1.getName())){ System.out.println("OK 空字符串"); }else if(p1.getName()==null){ System.out.println("OK null"); }
结果:OK null
2、int
int a;
System.out.println(a);
这里报错,不能够使用未实例化的。同时说明不能够用这个数运算。
同样放在类里面的 int aa
person p1 = new person();
System.out.println(p1.getAa());
这时候的 aa 打印出来是0。而且这个值还可以运算。
(同时也说明了一点,包装类默认值)
3、 Integer
p1.getAge打印出来是null.
4、说完上面的,来看一下我遇到的一些小实例。
String a1="a"; String a2="a"; String a3=new String("a"); if(a1==a3){ System.out.println("Y"); }else{ System.out.println("N"); } int a = 1; Integer b = new Integer(1); Integer c = new Integer(1); if(b.equals(c) ){ System.out.println("是"); }else{ System.out.println("否"); }
大家先看一下上面的a、b、c两两比较,结果是会输出是,还是否。
我先来告诉大家答案吧,a、b、c两两比较都是“是”
为什么?我来大致的解释一下。这里int 为基本数据类型,他们有一个特点,就是存在栈中的数据可以共享。int a = 1;已经在堆中开辟了一块空间,之后integer在去实例化的时候不会重新去new 一个,因为他是包装类。如果还是不明白,自己运行一下,然后在上网查一下java基本数据类型在内存中的知识。
看完上面数字的,我们在来比较一下a1、a2、a3
a1和a2,结果Y。 a1和a3,结果N
这里我也来解释一下吧,在java的内存中还有一个字符串池,利用String a1 = "a";实例化的a字符串会放到字符串池中,并在堆中开辟一个空间存放“a”。
当String a2="a";时发现已经有a1="a";了所以直接让a2指向a即可。
但是String a3=new String("a");并不能和Integer一样,它是一个类,要去堆中重新开辟一块空间。