您的位置:首页 > 编程语言 > Java开发

Java基础知识_自动装箱/享元/枚举

2013-07-14 15:46 197 查看



一、自动装箱演示,及享元模式学习


自动装箱是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;
}
};

注意这个类里面的toStrng的写法:若本类调用者是SUN,
public String toString(){
return this==SUN?"SUN":"MON";
}需要注意的是:这个toString方法是随着调用者的不同打印的结果不同。也可以理解为输出本类信息。5package 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";
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: