------- android培训、java培训、期待与您交流! ----------
静态导入:
import语句可以导入一个类或某个包中的所有类。
import static语句导入一个类中的某个静态方法或所有静态方法。
可变参数:
只能出现在参数列表的最后。
...位于变量类型和变量名之间,前后有无空格都可以。
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
public static int add(int x,int... args)
自动装箱:Integer num1 = 12;
自动拆箱:System.out.println(num1+12);
枚举:
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。
枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象。
带有构造方法的枚举:
public enum WeekDay{
SUN(1),MON(),TUE,WED,THI,FRI,SAT;
private WeekDay(){System.out.println("first");}
private WeekDay(int day){System.out.println("second");}
}
带有抽象方法的枚举:
public enum TrafficLamp{
RED(30){
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(45){
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;}
}
反射:
反射就是把Java类中的各种成分映射成相应的Java类。
Constructor类
代表某个类的一个构造方法。
获取构造方法。
Constructor onstructors[] =Class.forName("java.lang.String").getConstructors();
获取某一个构造方法。
Constructor constructor =Class.forName("java.lang.String").getConstructor(StringBuffer.class);
创建实例对象。
通常方式:String str = new String(new StringBuffer("abc"));
反射方式:String str = (String)constructor.newInstance(new StringBuffer("abc"));
class->constructor->new object
Field类
代表某个类中的一个成员变量。
ReflectPoint point = new ReflectPoint(1,7);
Field y=Class.forName("cn.itcast.corejava.ReflectPoint").getField("y");
Method类
代表某个类中的一个成员方法。
Method charAt =Class.forName("java.lang.String").getMethod("charAt",int.class);
调用方法:
通常方式:System.out.println(str.charAt(1));
反射方式:System.out.println(charAt.invoke(str,1));
数组的反射
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。
代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。
基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用,
非基本数据类型的以为数组,既不可以当作Object类型使用,又可以当作
Object[]类型使用。
Array工具类用于完成对数组的反射操作。
反射的作用是为了实现框架功能。
你做的门调用锁,锁是工具,你做的门被房子调用,房子是框架,房子和锁都是别人提供。
JavaBean
是一种特殊的Java类,主要用于传递数据信息,这种Java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
注解
就是给程序打上一种标记,编译器和其他程序可以用反射来了解你的类及各种元素的标记,从而进行相应操作。
注解类:
@interface A{}
应用了注解类的类:
@A
class B{}
对应用了注解类的类进行反射操作的类:
class C{
B.class.isAnnotionPresent(A.class);
A a = B.class.getAnnotion(A.class);
}
注解可以增加属性,value是默认属性。
@ItcastAnnotation(color="red",value="abc")
泛型
泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉“类型”信息,使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其他类型的数据,例如,用反射得到集合,再调用其add方法即可。
ArrayList类定义和ArrayList类引用
整个称为ArrayList泛型类型。
ArrayList中的E称为类型变量或类型参数。
整个ArrayList称为参数化的类型。
ArrayList中的Integer称为类型参数的实例或实际类型参数。
ArrayList中的<>念作typeof。
ArrayList称为原始类型。
在创建数组实例时,数组的元素不能使用参数化的类型。
Vector VectorList[] = new Vector[10];//错误。
泛型中的?通配符
Collection<?> a可以和任意参数化的类型匹配,只有使用的时候才知道是什么类型。
使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用做引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。
限定通配符的上边界:
Vector<? extends Number> x = newVector<Integer>();//正确。
Vector<? extends Number> x = newVector<String>();//错误。
限定通配符的下边界:
Vector<? super Integer> x = newVector<Number>();//正确。
Vector<? super Integer> x = newVector<Byte>();//错误。
提示:限定通配符总是包括自己。
类加载器
Java虚拟机可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:
BootStrap,ExtClassLoader,AppClassLoader。
类加载器也是Java类,因为其他是Java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器,不是Java类,这正是BootStrap。
Java虚拟机中的所有类加载器采用具有父子关系的树形结构进行组织,在实例化每个类加载器对象时,需要为其指定一个父级类加载器对象或者默认采用系统类加载器为其父级类加载器。
每个类加载器加载类时,会先委托给其上级类加载器。
BootStrap加载JRE/lib/rt.jar
ExtClassLoader加载JRE/lib/ext/*.jar
AppClassLoader加载classpath指定的所有jar或目录
代理类
与目标累具有相同的接口,每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码。
动态代理类
JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作代理类,即动态代理类。
JVM生成的动态类必须实现一个或多个接口,所以,JVM生成的动态类只能用作具有相同接口的目标类的代理。
CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以,如果要为一个没有实现接口的类生成动态代理类,那么可以使用CGLIB库。
代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以在代理方法中的如下四个位置加上系统功能代码:
1,在调用目标方法之前。
2,在调用目标方法之后。
3,在调用目标方法前后。
4,在处理目标方法异常的catch块中。