---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
一、JDK1.5新特性
1、 静态导入:
(1)import语句可以导入一个类或某个包中的所有类。
(2)import static语句导入一个类中的某个静态方法或所有静态方法。
语法举例:
import static java.lang.Math.sin;//导入Math类中的sin静态方法。
import static java.lang.Math.*; //导入Math类中的所有静态方法。
2、可变参数
可变参数的特点:
(1)只能出现在参数列表的最后;
(2)...位于变量类型和变量名之间,前后有无空格都可以;
(3)调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
例如:System.out.println(countScore(2,3,5)); System.out.println(countScore(1,2,3,5));
3、枚举
(1)为什么要有枚举?
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
(2)用普通类如何实现枚举功能
私有的构造方法:每个元素分别用一个公有的静态成员变量表示
可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
(3)扩展:枚举类的values,valueOf,name,toString,ordinal等方法。
(4)总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。
枚举元素时SUN(1)和SUN()效果一样,都是调用的默认的构造函数。
枚举只有一个成员时,就可以作为一种单例设计模式的实现方式。
4、枚举的高级应用:
枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
(1)带构造方法的枚举
构造方法必须定义成私有的
如果有多个构造方法,该如何选择哪个构造方法?
枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
(2)带方法的枚举
定义枚举TrafficLamp
实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。
枚举只有一个成员时,就可以作为一种单例的实现方式。
《注意》如果枚举元素后面没有大括号对,那是不会生成内部类的。先看有内部类的效果,再看没有内部类的效果,eclipse自动删除原来的内部类。
(3)写带有抽象方法的枚举步骤和技巧:
1)enum TrafficLamp{RED,GREEN,YELLOW}
2)enum TrafficLamp{RED,GREEN,YELLOW;public abstract next();}
3)enum TrafficLamp{RED{},GREEN{},YELLOW{};public abstract next();}
4)填充各个{}中的next方法。
5、Class类
Java程序在运行时,系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。
Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。其实对象是对应各个类在内存中的字节码。
虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。
基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也都对应一个 Class 对象。
每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。
(1)各个字节码对应的实例对象(Class类型)获取方法,即获取Class对象的三种方式:
1)类名.class,例如,System.class;
2)对象.getClass(),例如,new Date().getClass();
3)Class.forName("类名"),例如,Class.forName("java.util.Date");
6、反射
反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示。表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field(成员字段)、Method(方法)、Contructor(构造方法)、Package(包)等等。
(1)反射技术:
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性以及方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
简单一句话:反射技术可以对类进行解剖。
(2)反射作用
1)在运行时判定任意一个类所具有的成员变量和方法;
2)在运行时构造任意一个类的对象;
3)在运行时判定任意一个对象所属的类;
4)在运行时调用任意一个对象的方法;
5)生成动态代理。
7、Constructor类
Constructor类代表某个类中的一个构造方法
(1)得到某个类所有的构造方法:Constructor [] constructors= Class.forName("java.lang.String").getConstructors();
(2)得到某一个构造方法:Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);//获得方法时要用到类型
(3)创建实例对象:
1)通常方式:String str = new String(new StringBuffer("abc"));
2)反射方式: String str = (String)constructor.newInstance(new StringBuffer("abc"));//调用获得的方法时要用到上面相同类型的实例对象
//Person类
package com.itheima;
public class Person {
private String name;
public int age;
public Person(){
System.out.println("Person is run");
}
public Person(String name,int age){
this.age=age;
this.name=name;
}
public String toString(){
return name+":"+age;
}
}
//示例
package cn.itheima;
public class CreateClassDemo {
public static void main(String[] args) throws Exception {
createPersonClass();
}
//通过Class对象创建类实例方法
public static void createPersonClass() throws Exception{
//获取Person类的Class对象
String className="cn.itheima.Person";
Class clazz=Class.forName(className);
//通过newInstance方法获取类的无参构造函数实例
Person p=(Person)clazz.newInstance();
}
}
8、Field类
Field类代表某个类中一个成员变量。
1)Field getField(String s);//只能获取公有和父类中公有
Field getDeclaredField(String s);//获取该类中任意成员变量,包括私有
setAccessible(ture); //如果是私有字段,要先将该私有字段进行取消权限检查的能力。也称暴力访问。
set(Object obj, Object value);//将指定对象变量上此Field对象表示的字段设置为指定的新值。
Object get(Object obj);//返回指定对象上Field表示的字段的值。
//获取Person对象的成员变量
public static void getPersonField() throws Exception{
//如果想要给该变量赋值,必须先要有对象。
Class clazz=Class.forName("cn.itheima.Person");
Person p=(Person)clazz.newInstance();
//获取所以的成员变量
Field[] fs=clazz.getFields();
for(Field f:fs){
System.out.println(f);
}
//获取指定的成员变量
Field fage=clazz.getField("age");
Field fname=clazz.getDeclaredField("name");
//显示改变后的值
fage.set(p, 20);
System.out.println(fage.get(p));
//暴力访问私有变量
fname.setAccessible(true);
fname.set(p, "zhangsan");
System.out.println(fname.get(p));
}
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net