Java基础再进阶学习总结(一)
小五游侠 8/3/2015 10:51:04 PM
1. 方法可变参数使用方法:
public int add(int x,int ... args){
......
}
2. 增强for循环:
for(int arg:args){
......
}
3. 枚举的基本使用
public enum WeekDay{
SUN,MON,TUE,WED,THI,FRI.SAT
}
私有的构造方法:
抽象的构造方法:
public enum Trafficlamp{
RED(30){
public Trafficlamp nextlamp(){
return GREEN;
}
},
GREEN(30){
public Trafficlamp nextlamp(){
return YELLOW;
}
},
YELLOW(30){
public Trafficlamp nextlamp(){
return RED;
}
};
public abstract Trafficlamp nextlamp();
private int time;
private Trafficlamp(int time){this.time=time;}
}
枚举只有一个成员是,就可以作为一种单例的实现方式.
4. 反射的基础Class类
众多的类可以用class表示,当程序使用到某一个类的时候,会将这个类装成字节码存放到硬盘里面再转到内存里面.
Person p = new Person();
Class cls = Person.class;//字节码 p.getClass(); Class.forName("java.lang.String"); forName()的作用是返回字节码
返回字节码的方式有三种:
类名.class.例如System.class
对象.getClass,例如,new Date().getClass()
Class.forName(“类名”), 例如,Class.forName(“java.lang.String”);
有九个预定义Class实例对象,八个基本对象类型+一个void
Class.isPrimitive() 是否基本类型
Class.isArray() 是否数组类型
反射就是把java类中的各种成分映射成相应的java类
Constructor类(构造方法) 注意区分编译时,运行时
//String.class.getConstructor(StringBuffer.class,int.class);
Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
String str2 = (String)constructor1..newInstance(new StringBuffer(“abc”));
System.out.println(str2.charAt(2));
Field类(成员变量)
public class Point{ public String str = "ccw"; private int x; public int y; public Point(int x,int y){ this.x = x; this.y = y; } } Point p = new Point(3,5); //getField()获取可见的成员变量 Fied fieldY = p.getClass.getField("y"); //获取成员y的值,fieldY不是对象身上的变量,而是类上,要用它 fieldY.get(p); //获取不可见成员变量 Field fieldX = p.getClass().getDeclareField("x"); //暴力反射 fieldX.setAccessible(true); fieldX.get(p); //反射的一个综合实例 Field[] fields = p.getClass.getFields(); for(Field f:fields){ //判断字节码相等,用== 语义才正确 if(f.getType() == String.class){ String oldValue = (String)f.get(p); String newValue = oldValue.replace("c","w"); f.set(p,newValue); } }
Method类(成员方法)
String str = "ccw"; Method methodCharAt = String.class.getMethod("charAt",int.class); //(执行对象,参数) 调用静态方法是(null,参数) methodCharAt.invoke(str,1); String stratingClassName = arg[0]; Method mainMethod = Class.forName(startingClassName).getMehtod("main",String[].class); //new String[]{"111","222"} 会报错 (Object)new String[]{"111","222"} mainMethod.invoke(null,new Objec[]{new String[]{"111","222"}});
数组的反射应用
每一个具有相同维数(一维数组,二维数组),及具有相同的元素类型,及类型相同的数组都属于同一个class。与元素个数无关
java.util.Arrays 类,有大量的对数组进行操作的静态方法public class ReflectArray{ public static void main(String args[])throws Exception{ int [] a1 = new int[3]; int [] a2 = new int[5]; int [][] a3 = new int[2][3]; String [] a4 = new String[4]; System.out.println(a1.getClass() == a2.getClass()); //true //System.out.println(a1.getClass() == a3.getClass()); //false //System.out.println(a1.getClass() == a4.getClass()); //false System.out.println(a1.getClass().getName()); //结果:[I [:表示数组 I:表示整型 //获得父类名字,,先通过字节码获得父类字节码,在通过父类字节码获得名字 System.out.println(a3.getClass().getSuperclass().getName()); //java.lang.Object System.out.println(a4.getClass().getSuperclass().getName()); //java.lang.Object Object aObj1 = a1; Object aObj2 = a4; //基本类型的一维数组不能转换为Object数组 //Object[] aObj3 = a1; //int[] a1 可以理解为一个数组,里面装int, int是不属于Object,所以会报错 Object[] aObj4 = a3; //int [][] a3 可以理解为 int[] 里面装 int[] Object[] aObj5 = a4; //String [] a4 可以理解为 一个数组,里面装 String,String属于Object a1[0]=1; a1[1]=2; a1[2]=3; a4[0]="a"; a4[1]="b"; a4[2]="c"; a4[3]="d"; System.out.println(a1); //[I@35ce36 [I:int类型数组,@35ce36:hashcode值 System.out.println(a4); //[Ljava.lang.String;@757aef:String类型数组,hashcode值为@757aef //Arrays类的asList方法,将数组转换成list System.out.println(Arrays.asList(a1));//[[I@35ce36], //因为jdk1.4中asList方法接收的是Object数组,int不属于Object System.out.println(Arrays.asList(a4)); //[a,b,c,d],成功输出 //打印数组内容 } }
代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。
基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。java.lang.reflect.Array 用于反射数组
例:数组反射的应用//使用反射得到数组的值, 长度 public class ReflectArray2{ public static void main(String args[])throws Exception{ int [] a1 = new int[3]; int [] a2 = new int[5]; int [][] a3 = new int[2][3]; String [] a4 = new String[4]; a1[0]=1; a1[1]=2; a1[2]=3; a4[0]="a"; a4[1]="b"; a4[2]="c";a4[3]="d"; printObject(a1); printObject("abcv"); printObject(a4); } public static void printObject(Object obj){ Class clazz = obj.getClass(); //获取obj的class if(clazz.isArray()){ //如果class是数组 int len = Array.getLength(obj); //通过对数组反射的类Array得到数组的长度 for(int i=0;i<len;i++){ System.out.println(Array.get(obj,i)); //逐个取出数组中的数据 } }else{ System.out.println(obj); } } }