1.标识符的命名规则
标识符只能由数字、字母(a-z、A-Z)、下划线(_)和$组成,并且第一 个字符不能为数字。(通常在项目开发过程中采用驼峰命名规则,因此注意不能出现包含下划线的变量)
2.基本数据类型字节数
占1个字节:byte,boolean
占2个字节:char,short
占4个字节:int,float
占8个字节:long,double
他们对应的封装类型是:Integer ,Double ,Long ,Float,Short,Byte,Character,Boolean。
3.不可变类
不可变类:当创建了一个类的实例后,就不允许修改它的值了。特别注意: String 和包装类(Integer,Float…)都是不可变类。String 采用了享元设计模 式(flyweight)。
扩展问题 1:new String(“abc”);创建了几个对象?
1 个或者 2 个对象。如果常量池中原来有”abc”,那么只创建一个对象;如 果常量池中原来没有字符串”abc”,那么就会创建 2 个对象。
扩展问题 2:String s = “abc”; String ss = “ab” + “c”; System.out.println(s == ss); 输出为:true
扩展问题 3: String s = “abc”; char[] ch={‘a’,‘b’,‘c’}; System.out.println(s.equals(ch)); 输出为:false
解析:S 和 ch 分别为字符串类型和数组类型,所以输出为 false。
4.构造函数的特点
1.构造函数必须和类名一样(但和类名一样的不一定是构造方法,普通方 法也可以和类名同名),并且不能有返回值,返回值也不能为 void。
2.构造函数总是伴随着 new 操作一起调用,并且不能由程序的编写者调用, 只能由系统调用。
3.构造函数不能被继承。
4.子类可以通过 super()来显示调用父类的构造函数。
5.基本类型、包装类
初始值的不同:当基本数据类型变量和包装类的对象作为类的实例变量时,默认初始值是不同的。包装类的对象默认初始值是null,基本数据类型变量的默认初始值根据变量类型不同而不同,如Int的默认初始值是0。
所占空间不同 :null 不是一个合法的 object 实例,所以并没有为其分配内存。
缓存策略不同:Integer在类加载时就将-128 到 127 的Integer对象创建了,并保存在cache数组中(Integer cache[]),一旦程序调用Integer.valueOf( i ) 方法,如果 i 的值是在-128 到 127 之间就直接在 cache 缓存数组中去取Integer 对象,不在的话,就创建新的包装类对象.
Short(-128 — 127缓存)
Long(-128 — 127缓存)
Float(没有缓存)
Doulbe(没有缓存)
装箱是将一个原始数据类型赋值给相应封装类的变量,而拆箱则是将一个 封装类的变量赋值给相应原始数据类型的变量。 //装箱。装箱就是 jdk 自己帮你完成了调用Integer.valueOf(100)。
Integer integer1 = 3;
Integer integer2 = 3;
System.out.println(integer1 == integer2);//True 缓存中
Integer a3 = new Integer(3);
Integer a4 = new Integer(3);
System.out.println(a3 == a4);// false
Integer integer3 = 300;
Integer integer4 = 300;
System.out.println(integer3 == integer4);//false 重新创建新的包装类对象
Integer i = new Integer(128);
int i2 = 128;
System.out.println(i==i2);//当 Integer 和 int 类型数值进行比较的时候, Integer 会自动拆箱 为 int 再比较,所以为 true
6.对象作为参数传递
Java中的参数传递一直是按值传递
public static void changeStringBuffer(StringBuffer ss1, StringBuffer ss2)
{
ss1.append(" world");
ss2 = ss1;
}
public static void main(String[] args) {
Integer a = 1;//包装类是不可变类 Integer b = a; b++;
System.out.println(a);
StringBuffer s1 = new StringBuffer("Hello");
StringBuffer s2 = new StringBuffer("Hello");
changeStringBuffer(s1, s2);
System.out.println(s1);
System.out.println(s2);
}
输出结果:
1 Hello world
2 Hello
解析:s1,ss1一直指向同一个对象空间,该对象空间值从"hello" == > “hello world”
s2,ss2 起始时指向同一个对象空间"hello",在changeStringBuffer()方法中ss2所指的对象空间发生改变,此时对象空间值为"hello world"。