您的位置:首页 > 编程语言 > Java开发

Java 高新技术总结

2012-06-14 17:01 113 查看
1.静态导入:import static语句导入一个类中的某个静态方法或所有静态方法。这样可以省略类名,直接调用静态方法。

2.可变参数:只能出现在参数列表的最后。...位于类型和变量名之间,前后有无空格都可以。调用可变参数的方法时 ,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。eg: add(int a,int...b)

3.增强的for循环:迭代变量必须在()中定义。集合变量可以是数组或实现了Iterable接口的结合类。 

4.自动装箱与拆箱:自动装箱:Integer i=4;  自动拆箱:i+5 (i为Integer类型) 。两个指向-128-127之间同一数的对象引用,相同。

5.享元模式(flyweight):如果很多很小的对象他们有很多相同的东西,就可以将他们变成一个对象。不同的部分作为外部属性,作为方法的参数传入。

6.枚举:(星期天用0表示,星期六用6表示。)

为什么要用枚举?

问题:要定义星期几或性别的变量,该怎么定义?假设1-7分别表示星期一到星期日,但有人可能写成int weekday=0 ;枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中的填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

枚举中的方法:name(),rodinal(),valuesOf()

枚举可以定义构造方法,但必须私有。枚举构造方法加个(),里面参数表示调用哪个构造方法。   枚举中可以定义抽象方法,子类实现。

7.反射:

将类变成二进制字节码,然后加载到内存。在由它们来去创造对象。

forName()获取类的字节码,若缓冲区有,直接得到。没有,加载到缓冲区,再得到。

如何得到各个字节码对应的实例对象?类名.class ;对象.getClass();Class.forName("类名")

八个基本类型对应八个class对象。

isPrimitive():是否是基本类型 。基本类型的字节码和他们的包装类的字节码不同。但是int.class=Integer.Type

判断是否是数组类型:Class.isArray()

总之,只要在源程序中出现的类型,都有各自的class实例对象。

反射就是把Java类中的各种成分映射成相应的java类的字节码。

Field:  用反射调用私有方法时,需要用setAccessible(true);

如果传递给Method对象的invoke()方法的第一个参数为null,这有着什么样的意义呢?说明该method对象对应的是一个静态方法。

数组中若类型相同,则对应Class相同。

配置文件:一定要记住用完整的路径,但是完整的路径不是硬编码,而是运算出来的。配置文件可以通过类加载器来取获得。

PropertyDescriptor  :属性描述符 。用于处理JavaBean的属性和方法获取。

IntroSpector.getBeanInfo :在 Java Bean 上进行内省,了解其所有属性、公开的方法和事件。 

Beanutils工具包用来操作JavaBean。需要下载导入。

若属性是引用,可以设置引用的属性。

PropertyUtils :也可以用于操作JavaBean。他直接操作员属性的类型,可避免类型转换的错误。而Beanutils是把属性值当做String类型操作。但后者更强大。

8.Java7新特性:Map map =(name:"zhangsan" , age : 18);

9.注解:

覆盖参数也必须相同。否则不是覆盖。可用注解Override来防止此类事件发生。

重构(抽取方法)只适用于变量。

isAnnotationPresent( annotation) :某个注解是否在上面。在反射中使用。

getA nnotation(java.lang.class):获取某个注解。在反射中使用。

需要在自定义的注解上加上注解:@Retention(RetentionPolicy.******)。括号内容代表作用范围(RUNTIME ,SOURCE ,CLASS)。 .默认是CLASS.。

@Target(****):注解作用的范围(方法,类(ElementType.TYPE))。

注解中可以有方法,使用注解是必须为其注解赋值,以属性的形式为方法赋值。如color()方法,赋值为:color="red",调用时仍用color()方法。

注解也可以有属性。特殊的属性:value ,若只有这一个属性,使用注解时可以直接赋值,value和= 都可以省略。

注解的属性值也可以是注解。

10.泛型:

泛型中,参数化类型中不存在继承。即左右泛型要一致。

在创建数组实例时,数组的元素不能使用参数化的类型,例如:下面语句有错误:

Vector<Integer> vectorList[] =new Vector<Integer>[10].

下面语句没错误:Vector v1=new Vector<String>();  Vector<Object> v=v1; 因为编译期无类型参数。

使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。

限定通配符的上边界:正确:Vector<? extends Number> x=new Vector<Integer>();

                    错误:Vector<? extends Number> x=new Vector<String>();

限定通配符的下边界:正确:Vector<? super Integer> x=new Vector<Number>();

                    错误:Vector<? super Integer> x=new Vector<Byte>();

自定义泛型举例:public static <T> void swap( T x,  T  y){}

可以抛出泛型类型的异常。 

定义泛型的时候可以定义多个泛型参数,用“,”隔开。

类中增加泛型:在类的后面加,如:class GenericDao<T>{} 它里面的方法都需要与此类型保持一致。此类中的静态方法不能增加泛型(因为对象类型无法确定)。

11.类加载器:

类加载器:当前类加载器会把类加载交给父类,父类在交给他的父类,若上面无法处理,则返回。若当前类加载器也无法处理,则抛出异常。不会再往下推。

与父类加载器中相同的类的将无法被加载,委托加载机制。

12.StringBuilder 在单线程下效率更高,StringBuffer 在多线程下效率更高(会考虑安全问题)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息