可变参数
在程序编写过程中,一个方法可能会接收若干个参数,参数个数是不确定的,通常会使用重载的方法,定义出多个方法名相同,参数列表不同,实现相同的功能,JDK 1.5 提供了方法的可变参数特性,在参数个数不确定时,通过可变参数方法实现函数功能,避免了因重载列出大量的相同方法。
可变参数的特点
只能出现在参数列表的最后
。。。位于变量类型和变量名之间,前后有无空格都可以
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数
。。。位于变量类型和变量名之间,前后有无空格都可以
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数
可变参数的使用示例
public class VarableParameter
{
public static void main(String[] args)
{
System.out.println(add(2,3,5));
System.out.println(add(2,1,3,5));//调用可变参数方法,传入不同个数int型参数
}
public static int add(int x,int... args)//可变参数位于参数列表的最后面
{
int sum=x;
for(int i=0;i<args.length;i++)
{
sum+=args[i];
}
return sum;
}
}
for循环增强语法:for(type 变量名:集合变量名){...}
注意事项:
迭代变量必须在()中定义
集合变量可以是数组或者实现了Iterable接口的集合类
基本数据类型的自动拆箱与装箱
自动装箱:
Integer i1=12;//将基本数据类型int型的12自动装箱成Integer 对象
自动拆箱:
Integer i2+13;// 将Integer 类型的i2 对象 自动拆箱成int 型 与13相加,相加后的结果再自动装箱成Integer对象
享元模式 flyweigth
当对象很小,数值不变使用频率又很高,就创建一个对象
当有很多很小的对象,他们有很多相同的属性那么就将它变成一个对象,将不同的部分变成外部属性作为方法的参数传入
Integer i3=15;
Integer i4=15;
i3==i4 结果为true
Integer i5=129
Integer i6=129
i5==i6 结果为false
i7=Integer.valueOf(12);同理//返回int 的Integer实例
i8=Integer.valueOf(12);
在装箱时如果数字在一个字节之内(-128~127),就会放在一个缓存池,当再次创建该对象时就不在开辟空间,而是直接在缓存池中取出数据,节省内存空间。
Integer i1=12;//将基本数据类型int型的12自动装箱成Integer 对象
自动拆箱:
Integer i2+13;// 将Integer 类型的i2 对象 自动拆箱成int 型 与13相加,相加后的结果再自动装箱成Integer对象
享元模式 flyweigth
当对象很小,数值不变使用频率又很高,就创建一个对象
当有很多很小的对象,他们有很多相同的属性那么就将它变成一个对象,将不同的部分变成外部属性作为方法的参数传入
Integer i3=15;
Integer i4=15;
i3==i4 结果为true
Integer i5=129
Integer i6=129
i5==i6 结果为false
i7=Integer.valueOf(12);同理//返回int 的Integer实例
i8=Integer.valueOf(12);
在装箱时如果数字在一个字节之内(-128~127),就会放在一个缓存池,当再次创建该对象时就不在开辟空间,而是直接在缓存池中取出数据,节省内存空间。
枚举
C语言中有枚举
枚举:类中定义的变量的值只能是类中规定的值,这个变量是类类型的变量,每一个枚举都是一个对象
为什么要有枚举
枚举就是让某个类型的变量的取值只能为若干个固定类型中的一个,否则编译器就会报错,枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通方式在开发时无法实现这一目标。
枚举:类中定义的变量的值只能是类中规定的值,这个变量是类类型的变量,每一个枚举都是一个对象
为什么要有枚举
枚举就是让某个类型的变量的取值只能为若干个固定类型中的一个,否则编译器就会报错,枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通方式在开发时无法实现这一目标。
定义一个WeekDay类来模拟枚举的功能
每个元素分别用一个共有的静态成员变量表示
可以有若干共有方法或抽象方法,例如,要提供的getNextDay 方法必须是抽象的采用抽象方法定义getNextDay 就将大量的if else 语句转移成了一个个独立的类
每个元素分别用一个共有的静态成员变量表示
可以有若干共有方法或抽象方法,例如,要提供的getNextDay 方法必须是抽象的采用抽象方法定义getNextDay 就将大量的if else 语句转移成了一个个独立的类
public abstract class WeekDay {
private WeekDay(){}
public static final WeekDay Mon=new WeekDay(){
//内部类
public String getNextDay()
{
return "Tue";
}
};
public final static WeekDay Tue=new WeekDay(){
public String getNextDay()
{
return "Thu";
}
};
public final static WeekDay Thu=new WeekDay(){
public String getNextDay()
{
return "For";
}
};
public final static WeekDay For=new WeekDay(){
public String getNextDay()
{
return "Fri";
}
};
public final static WeekDay Fri=new WeekDay(){
public String getNextDay()
{
return "Sat";
}
};
public final static WeekDay Sat=new WeekDay(){
public String getNextDay()
{
return "Sun";
}
};
public final static WeekDay Sun=new WeekDay(){
public String getNextDay()
{
return "Mon";
}
};
public abstract String getNextDay();//抽象方法类也标记成抽象的
}
package cn.heima.day1;
public class EnumTest {
public static void main(String[] args) {
WeekDay weekday=WeekDay.Tue;
System.out.println(weekday.getNextDay());
}
}
枚举的类用enum 关键字
枚举相当于一个类,枚举中的元素相当于类
枚举自动的将类提供了toString 方法,
提供了name,ordinal,compareTo,valueOf,values (返回数组)
枚举只有一个元素时可以作为是一种单例的实现方式
实现带有抽象方法的枚举
public enum TrafficLamp//带有抽象方法的枚举
{
RED(30){
public TrafficLamp nextLamp()
{
return GREEN;
}
},
YELLOW(5){
public TrafficLamp nextLamp()
{
return RED;
}
},
GREEN(45){
public TrafficLamp nextLamp()
{
return YELLOW;
}
};
public abstract TrafficLamp nextLamp();//构造方法
private int time;
private TrafficLamp(int time){}//构造方法是私有的
}