1、java5的增加for循环
语法:
for (type 变量名: 集合变量名) {.....}
注意事项:
- 迭代变量必须在()中定义!
- 集合变量可以是数组或实现了Iterable接口的集合类
举例:
public static int add(intx , int...args){ int sum=x; for(int arg: atgs){ sum+=arg; } ruturn sum; }
2、枚举
枚举的作用:
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错,枚举可以让编译器在编译的时候就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
java5中枚举的基本应用:
1 package com.itheima.gaoxin1; 2 3 public class EnumTest { 4 5 /** 6 * @param args 7 */ 8 public static void main(String[] args) { 9 Weekday wd=Weekday.FRI;10 System.out.println(wd);//枚举自动封装了tostring方法11 System.out.println(wd.name());//显示自己的名字12 System.out.println(wd.ordinal());//显示在枚举中的排行13 System.out.println(Weekday.values().length);//枚举的个数14 System.out.println(Weekday.valueOf("SUN"));//设定枚举值15 16 }17 18 public enum Weekday{19 SUN,MON,TUE,WED,THI,FRI,SAT20 }21 22 }
带有构造方法,抽象方法的枚举。
1 package com.itheima.gaoxin1; 2 3 public class EnumTest { 4 5 /** 6 * @param args 7 */ 8 public static void main(String[] args) { 9 Weekday wd=Weekday.FRI;10 System.out.println(wd);//枚举自动封装了tostring方法11 System.out.println(wd.name());//显示自己的名字12 System.out.println(wd.ordinal());//显示在枚举中的排行13 System.out.println(Weekday.values().length);//枚举的个数14 System.out.println(Weekday.valueOf("SUN"));//设定枚举值15 16 }17 18 public enum Weekday{19 SUN(1),MON(),TUE,WED,THI,FRI,SAT;//必须放在第一行 (1)表示调用带有一个参数的20 private Weekday(){21 System.out.println("空构造函数");22 }23 private Weekday( int day){24 System.out.println("带一个参数的");25 }26 }27 28 public enum TrafficLamp{29 RED(30){30 public TrafficLamp nextLamp(){31 return GREEN;32 }33 },34 GREEN(45){35 public TrafficLamp nextLamp(){36 return YELLOW;37 }38 },39 YELLOW(5)40 {41 public TrafficLamp nextLamp(){42 return RED;43 }};44 45 public abstract TrafficLamp nextLamp();46 private int time;47 private TrafficLamp(int time){48 this.time=time;49 }50 }51 }52 }
3、反射
反射的基石-->Class类
如何得到各个字节码对应的实例对象?
1,类名.class,例如: System.class
2,对象.getClass(),例如,new Dat().getClass()
3,Class.forName("类名"),例如 Class.forName("java.util.Date"),
什么叫反射:反射就是把java类中的各个成分,映射成相应的java类
Constructor类代表某个类中的构造方法
得到某个类的所有构造方法:
eg:Constructor [] constructors=Class.forName("java.lang.String").getConstructors();
得到某一个构造方法:
Constructor constructor=Class.forName("java.lang.String").getConstructor(StringBuffer.class)
//获取方法时要用到类型
创建实例对象
通常方式:String str= new String(new StringBuffer("abc"));
反射方式:Sting str=(String)constructor.newInstance(newStringBuffer("abc"));
//调用获得的方法时用用到上面相同类型的实例对象
Class.newInstance()方法:
eg:String obj=(String)Class.forName("java.lang.String").newInstance();
该方法内部先得到默认的构造方法。然后该构造方法创建实例对象
该方法内部的具体代码用到了缓存机制来保存默认构造方法的实例对象
成员变量的反射:
ReflectPoint pt1=new ReflectPoint(3,5);
Field fileldY=pt1.getClass().getField("y");
System.out.println(fildeY.get(pt1));
访问类中的私有变量时:
Field fileldX=pt1.getClass().getDeclaredField("x");
fieldX.setAccessible(true);//设为可访问
System.out.printle(fieldX.get(pt1));
成员方法的反射:
Method类代表类中的一个成员方法,
得到类中的某一个方法:
eg: Method.charAt=
Class.forName("java.lang.String").getMethod("charAt",int.class);
调用方法:
通常方式:Ststem.out.pring(str.chatAt(1)));
反射方法:Systrm.out.println(chatAt.invoke(str,1));
如果传递给Method对象的invoke()方法的第一个参数为null,这就意味着该Method对象对应的是一个静态方法