一、自动装箱演示,及享元模式学习
自动装箱是1.5新特性,比如Integer iObj=3; 将3自动装箱为一个Integer对象赋给iObj,在1.5版本以前必须用new生成新的对象 即
Integer iObj=new Integer(3)
在-128-127之间的数装成对象后,把同样的数值设置成为一个对象共同访问,也是享元模式flyweight,都用这一个对象。当有新的Interget对象时,先判断他的值是否已存在存在则不再创建新的对象。
package itcast.cn; public class AutoBox { /** * 自动装箱演示,及享元模式学习 */ public static void main(String[] args) { // TODO Auto-generated method stub Integer iObj = 3;//装箱:自动把一个基本数据类型转成了一个Integer类型并赋给了一个引用变量 System.out.println(iObj); System.out.println(iObj+12);//拆箱:引用类型转成了基本数据类型并进行了计算 String s1 = new String("abc"); String s2 = new String("abc"); System.out.println(s1==s2);//false Integer i1 = 13; Integer i2 = 13; System.out.println(i1==i2);//true /* 指向了同一Integer对象,因为byte的取值范围是-128到+127 当他发现这两个值没有超出byte范围内, 如果该数值已经存在的时候不会另外新开辟空间 享元模式:flyweigmt 当这个对象很小,然而要整出好多个对象。这样很浪费。 例子: 字母: 我们打英文字母,我们只用封装26个对象对应26个字母。 图标: 我们文件夹里很多相同的图标。 当有很多很小的对象的,他们有很多属性相同。那么我们可以把它编成一个对象; 而有些不同的属性弄成方法的参数。称之为外部的状态; */ Integer i3 = 131; Integer i4 = 131; System.out.println(i3==i4);//false /* 指向了同一Integer对象,因为byte的取值范围是-128到+127 当他发现这两个值超出了byte范围,会另外新开辟空间 */ /* 小测试,不用自动装箱我用Integer的静态方法ValueOF手动把 一个基本数据类型转换成一个,Interger对象 */ Integer i5 = Integer.valueOf(3); Integer i6 = Integer.valueOf(3); System.out.println(i5==i6); //true Integer i55 = Integer.valueOf(333); Integer i66 = Integer.valueOf(333); System.out.println(i55==i66);//false //原因同上 } }
二、枚举
1、为什么要有枚举,枚举是什么,有何好处?(jdk1.5新特性)
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标
比如:
我定义了一个新的类型叫weekday,然后你定义这个类型的值的时候必须得是我提前规定好的值,否则编译器报错。
备注:枚举也是 jdk里1.5新特性
好处,编译源程序的时候发现你的值不合法
2、枚举的基本演示
1
选中标记处,点击creatclass(产生一个类)
2
接着私有化构造函数不让别人创建对象(该类有个nextDay()函数)
package itcast.cn; public class WeekDay { private WeekDay(){} }
3
匿名内部子类实现父类方法
public final static WeekDay SUN = new WeekDay(){ @Override public WeekDay nextDay() { // TODO Auto-generated method stub return MON; } };
4
注意这个类里面的toStrng的写法:若本类调用者是SUN, public String toString(){ return this==SUN?"SUN":"MON"; }
需要注意的是:这个toString方法是随着调用者的不同打印的结果不同。也可以理解为输出本类信息。
5
package itcast.cn.dai1; public abstract class WeekDay { private WeekDay(){}//1 //自定义静态常量获取对象 public final static WeekDay SUN = new WeekDay(){ @Override public WeekDay nextDay() { // TODO Auto-generated method stub return MON; } }; public final static WeekDay MON = new WeekDay(){ @Override public WeekDay nextDay() { // TODO Auto-generated method stub return SUN; } }; public abstract WeekDay nextDay();//将nextDay方法抽象化 /* public WeekDay nextDay(){ if(this == SUN){ return MON; }else{ return SUN; } } 另一种写法,利用抽象类来做*/ public String toString(){ return this==SUN?"SUN":"MON"; } }