-----------------ASP.Net+Unity开发、.Net培训、期待与您交流! ---------------
JAVA增强
一,JDK1.5 新特性
import static java.lang.Math.*;
public class StaticImport{
public static void main(String[] args){
System.out.println(max(0,1));
//System.out.println(Math.max(0,1));
}
}
2,可变参数
public class VariableParament{
public static void main (String[] args){
System.out.println(getAdd(2,3,4));
}
public static int getAdd(int x,int ... arrs){
int sum=x;
for(int i=0;i<arrs.length;i++){
sum=sum+i;
}
return sum;
}
}
3,高级for循环
语法:
for(type 变量名:集合变量名){ ... }
如:
public static int getAdd(int x,int ... arrs){
int sum=x;
for(int arg : arrs){
sum=sum+arg;
}
return sum;
}
4,自动装箱拆箱
Integer i3 = 128; Integer i4 =128;
i4==i5 此处为false
这也是一种模式,叫享元模式,即flyweight pattern;
public class EnumTest{
public static void main(String[] args){
WeekDay week = WeekDay.MON;
System.out.println(week);
System.out.println(week.name);
System.out.println(week.ordinal);
System.out.println(WeekDay.valueOf("SUN"));
System.out.println(weekDay.values().length);
}
public enum WeekDay{
SUN,MON,TUE,WEN,THU,FRI,SAT
}
}
public class Traffic{
public static void main (String[] args){
TrafficLamp tl = TrafficLamp.RED;
System.out.println(tl.nextLamp());
}
public enum TrafficLamp{
RED(30){
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(45){
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){
this.time=time;
}
}
}
二,反射:是从jdk1.2开始的。并不是jdk1.5新特性。
第一种,
第二种,
第三种,
注意:Class.forName()作用。
九个预定义Class实例对象:(八种基本数据类型+布尔类型)
Int.class == Integer.TYPE
数组类型的Class实例对象
Class.isArray();
总之,只要在源程序中出现的类型,都有各自的Class实例对象,例如int[] void
反射:就是将java中的每一个成分映射成相应地类。
Construtcor[] constructors = Class.forName("java.lang.String").getConstructors()
Constructor
constructor
=Class.forName("java.lang.String").getConstrucor(StringBuffer.class);
//这里指定了是StringBuffer参数。
String str = (String)constructor.new Instance(new StringBuffer("abc"));
//这里指定了是StringBuffer对象。
上面两行代码等效于 String str = new String(new StringBuffer("abc"));
当需要得到某一个不带参数的构造方法时,可以直接用Class类中的newInstance()方法。
ReflectPoint pt1 = new ReflectPoint(3,5);//这里参数x是私有的,而y是公有的。
Field FieldY = pt1.getClass.getField("y");
//FieldY的值是多少呢?是5,错。FieldY不是对象身上的变量,
//而是类上要用它去取某个对象上的值。
如:System.out.println(FieldY.get(pt1));//这里指的是5;
另外如果需要获取私有成员变量。需要这样做:
Field FieldX = pt1.getClass.getDeclareField("x");
FieldX.setAccessible(true);
System.out.println(FieldX.get(pt1));
String str ="abc";
Method methodCharAt = String.class.getMethod("charAt",int.class);
char a = methodCharAt.invoke(str,2);
//在jdk1.4中,可以写作 char a = methodCharAt.invoke(str,new Object(){2});
//还用到自动装箱
上面两行代码等效于 char b = str.charAt(2);
注意:如果传递给Method对象的invoke()方法中的第一个参数为null。说明该Method对象对应的应该是一个静态方法。
int[] a1 =new int[3];
int[] a2 =new int[4];
a1.getClass()==a2.getClass() 其值为true。a1.getClass.getName="[I"。
public class StringEg {
public static void main(String[] args) {
String[] str = new String[]{"abc","abd","dfd"};
PrintObj(str);
PrintObj("hello world");
}
private static void PrintObj(Object obj) {
if (obj.getClass().isArray()){
for(int i=0;i<str.length;i++){System.out.println(Array.get(obj, i));}
}
else {
System.out.println(obj);
}
}
}
注意:
三,HashSet与ArrayList的比较,以及hashcode的分析
当一个对象呗存储进HashSet集合以后,就不能修改这个对象中那些参与计算hash值的字段了,因为,这样对象修改后的hash值与
最初存储进HashSet集合中的哈希值就不同了。这种情况下,会导 致无法从HashSet集合中独立删除当前对象,从而造成内存泄露。
四,反射的作用:实现框架的功能。
//这里的配置文件应该放在project目录下。
//这里可以填写相对路径,也可以填写绝对路径。
四,JavaBean
Class Person{
private int x;
public int getAge(){
return x;
}
public void setAge(int age){
this.x=age;
}
}
应用:在一个类中读取另外一个JavaBean中的属性值。
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.jar.Attributes.Name;
//获取Point类中的属性值,并设置。
public class PointTest {
private static Map age;
public static void main(String[] args) throws Exception{
Point pt = new Point(3, 5);
String propertyName="x";
//获取x值。
BeanInfo beanInfo = Introspector.getBeanInfo(pt.getClass());
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for(PropertyDescriptor pd : pds){
if (pd.getName().equals(propertyName)) {
Method getMethod = pd.getReadMethod();
System.out.println(getMethod.invoke(pt));
break;
}
}
//设置x值。
}
}
第二种方式:
使用BeanUtils这个工具类来进行get和set属性。
BeanUtils.getProperty(pt,"x");
//注意这里操作的是字符串“x”。
BeanUtils.setProperty(pt,"x","8");
另外一种是使用PropertyUtils.getProperty(pt,x)//注意这里是x,并不是字符串。
BeanUtils不仅可以操作JavaBean,而且可以操作map集合。
五,注解,Annotation
如:
注解类:
应用注解类的类:
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
// 编译器将把注释记录在类文件中,在运行时 VM 将保留注释
@Target(ElementType.METHOD)
//指定注解类存放位置,存放咋i类中,方法上等等。
public @interface MyAnnotation
{
}
import java.lang.annotation.Annotation;
public class AnnotationTest {
public static void main(String[] args) {
if (AnnotationTest.class.isAnnotationPresent(MyAnnotation.class)) {
Annotation annotation = AnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(annotation);
}
}
}
为注解增加属性及高级属性:
public @interface MetoAnnotation{
String value();
}
public @interface MyAnnotation{
String color() default "blue"; //设置缺省属性,即默认属性。
String value();
int[] arrAttr();
EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;//枚举类型的属性
MetoAnnotation annotationAttr() default @MetoAnnotation("lhm");
}
@MyAnnotation(value=“xyz”,arrAttr={1,2,3},annotationAttr=@MetoAnnotation("zxx
//注意:如果只有value属性,则可以不用写“value=”,当数组只有一个元素时,可以不用{},即 //arrAttr=1;
public class AnnotationTest{
}
六,泛型。
ArrayList称为泛型类型
ArrayList中的E称为类型变量或类型参数
ArrayList称为参数化的类型
ArrayList中的Integer称为类型参数的实例或实际类型参数
ArrayList中的<>念type of
ArrayList称为原始类型
参数化类型可以引用一个原始类型的对象,编译报告警告。如:
Collection c = new Vector();
原始类型可以引用一个参数化类型的对象,编译报告警告。如:
Collection c = new Vector();
Vector v = new Vector(); //错误
Vectorv = new Vector(); //也错误
Vector vector[] = new Vector[10];//错误
Vector v1 = new Vector();//原始类型可以引用参数化类型
Vectorv = v1;//参数化类型也可以引用原始类型。
泛型中的?通配符