枚举
为什么要有枚举,例如 要定义星期几变量,该怎么定义呢,假设用1-7分别代表星期一到星期日,但有人可能会用0代表星期日
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一个目标的
定义一个WeekDay的类来模拟枚举功能
1) 私有的构造方法
2) 每个元素分别用一个公有的静态成员变量表示
3) 可以有若干公有方法或抽象方法,要提供给nextDay方法必须是抽象的
public abstract class Weekday {
private Weekday(){}
public final static Weekday SUM=new Weekday(){
public Weekday nextDay() {
return MON;
}
};
public final static Weekday MON=new Weekday(){
public Weekday nextDay() {
return SUM;
}
};
public abstract Weekday nextDay();
public String toString()
{
return this==SUM?"SUM=====":"MOU+++";
}
}
--------------------------------------------------------------------
枚举的静态方法
WeekDay.valueOf("SUN").toString(); // valueOf("s");将字符串s变成(WeekDay中)SUN对象
WeekDay.values().length; //vlaues //将WeekDay中所有的对象封装成一个数组,进行遍历
方法
Weekday1.name(); 返回该对象的名字
Weekday1.ordinal(); 返回该对象在该类中的排行第几
compareTo hashCode equals toString 直接调用,
-------------------------------------------------------------------------
构造参数的枚举 : MOU 构造方法是bbbbbbb, SUM 和TOW构造方法是aaaaaa
public enum Enum_2 {
MOU(2),SUM(),TOW;
private Enum_2()
{
System.out.println("aaaaaaaaa");
}
private Enum_2(int day)
{
System.out.println("bbbbbbbbbbbbbbbbbb");
}
}
------------------------------------------------------------
交通灯的枚举类
public enum TrafficLamp {
HONG(30){
public TrafficLamp nextLamp()
{
return LV;
}
},
LV(35){
public TrafficLamp nextLamp()
{
return HUANG;
}
},
HUANG(5){
public TrafficLamp nextLamp()
{
return HONG;
}
};
private TrafficLamp(int time)
{
this.time=time;
}
public abstract TrafficLamp nextLamp();
private int time;
}
如果枚举只有一个对象: 那么就可以作为一种单利的实现方式
===================================================================================================================================
自动拆装箱
自动装箱 Integer sum= 2;
自动拆箱 System.out.println(sum+12);
Integer i1=12; Integer i1=12; i1==i2 ture
Integer i3=new Integer(14); Integer i4=new Integer(14); i3==i4 ture
当Integer取值在一个字节之间时(-128到127),将这些数据比较常用,在内存中只有一份(共享),不用每一个对象new出一个,节省大量的内存空间,这种模式被称为 享元模式
1 静态导入
import语句可以导入一个类或某个包中的所有类
import static语句导入一个类中的某个静态方法或所有静态方法
以Math类为例:
import static java.lang.Math.max; //导入lang包中的Math类的max方法
max(3,5); //就可以直接写方法名,不用类名也能调用
Math.abs(6,3); //平常调用的方式
import static java.lang.Math.*; //导入lang包中的Math类中的所有方法
那么就是在本类页面中写Math的静态方法,都可以直接写方法名(没有类名也可以调用)
---------------------------------------------------------------------------------------
2 可变参数
可变参数的特点
(1) 只能出现在参数列表的最后
(2) ...位于变量类型和变量名之间,前后有无空格都是可以的
(3) 调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法中以数组的形式访问可可变参数
public static void main(String[] args)
{
System.out.println(add(3,4));
System.out.println(add(2,4,5,66));
System.out.println(addd(3,4));
System.out.println(addd(2,4,5,66));
}
public static int addd(int ...is) //可变参数
{
int sum=0;
for(int i=0;i
{
sum+=is[i];
}
return sum;
}
public static int add(int s,int ...is) // 可变参数
{
int sum=s;
for(int i=0;i
{
sum+=is[i];
}
return sum;
}
-------------------------------------------------------------------------------------------
3 for循环增强
语法 :for(type 变量名: 集合变量名){....}
注意事项
迭代变量必须在{} 中定义
集合变量可以是数组或实现了iterable接口的集合类
举例
public static int add(int x,int ... args)
{
int sum =x;
for(int arg:args)
{
sun+=arg;
}
return sum;
}
for循环增强的好处
在上面这个例子 增强型的for循环 和普通for循环一样
增强型的for循环 优点主要体现在集合中,随便举个例子
比如对 set 的遍历
一般是迭代遍历:
Set set = new HashSet();
Iterator it = set.iterator();
while (it.hasNext()) {
String str = it.next();
System.out.println(str);
}
for循环遍历:
for (String str : set) {
System.out.println(str);
}