JDK1.5的新特性以及反射

------- android培训java培训、期待与您交流! ----------

静态导入:

当需要用到一个工具类,而这个类中的方法大多是静态方法的时候,为了方便书写,免去写静态类类名的麻烦,可以导入这个类的静态方法,比如Arrays类,可以在程序开头写importstatic  java.util.Arrays.*;导入这个类的静态方法,就可以不用写Array.xxxx(),而是直接写xxxx()。但如果有可能导入的两个类有同名的方法,这时候就需要写上所属的对象或者类。

 

增强for循环:

格式:

for(数据类型变量名 : 被遍历的集合(Collection)或者数组)

{

      

}

底层封装了迭代器。所以使用有局限性。

以数组为例比较一般for循环和增强for循环

int[] arr = {3,5,1};

 

              for(intx=0; x<arr.length; x++)

              {

                     System.out.println(arr[x]);

              }

              for(inti : arr)

              {

                     System.out.println("i:"+i);

              }

 

可变参数:

public int sum(int a,int b){}

public int sum(int a,int b,int c){}

public int sum(int [] arr){}

 

在没有泛型的当一个方法通用但参数不固定时,非常麻烦,可变参数可以自动把参数封装成数组,床多少参数都行

public int sum(int …args/*如果还有其他参数,可变参数必须放在最后*/){}

 

基本数据类型自动拆箱,装箱:

Integer x = 4;//自动装箱。相当于Integer x = new Integer(4)

x = x/* x.intValue() */ + 2;//x+2:x 进行自动拆箱。变成成了int类型。和2进行加法运算。

                                   //再将和进行装箱赋给x。

 

泛型:

好处

1.将运行时期出现问题ClassCastException,转移到了编译时期。,

       方便于程序员解决问题。让运行时问题减少,安全。,

 

2,避免了强制转换麻烦。

class Utils<QQ>
{
        private QQ q;
        public voidsetObject(QQ q)
        {
               this.q = q;
        }
        public QQgetObject()
        {
               return q;
        }
}

定义泛型后,当我们需要用这个Utils类,即创建Utils的对象时,就得给qq指定类型,这样这个类的类型就固定了,比如Utils<String>ex =new Utils<String>();创建这么个对象。那上面那个类相当于变成这个样子:
class Utils
{
        private
 String q;
        public voidsetObject(
String q)
        {
               this.q = q;
        }
        public 
String getObject()
        {
               return q;
        }
}
而如果要用Object的话相当于把传入的对象向上提上成Object了,也就是你得到的是一个Object对象,那以后要用就需要在向下转型,这种转换是要求开发者对实际参数类型可以预知的情况下进行的。用泛型就避免这样的麻烦。

 

枚举:

枚举实质上还是一个类,他里面定义的成员是这个枚举类的实例对象。因为枚举不能有其他对象所以他的构造方法必须是私有的。我们在定义带参数的枚举构造方法时需要注意。

package cn.itcast.day1;

 

public class EnumTest {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

       // TODO Auto-generatedmethod stub

       WeekDay2 weekDay = WeekDay2.SUN;

       System.out.println(weekDay.nextDay());

       WeekDay weekDay2 = WeekDay.FIR;

       System.out.println(weekDay2);

    }

   

    public enum WeekDay{

       SUN(2),MON,TUE,WED,THI,FIR,STA;

      

       private WeekDay(){

           System.out.println("First");

       }

       private WeekDay(int x){

           System.out.println("second");

       }

      

    }

   

    public enum TraffickLamp{

       RED(30){

 

           @Override

           public TraffickLamp nextLamp() {

              // TODO Auto-generatedmethod stub

              returnGREEN;

           }

          

       },

       YELLOW(5){

 

           @Override

           public TraffickLamp nextLamp() {

              // TODO Auto-generatedmethod stub

              returnRED;

           }

          

       },

       GREEN(45){

 

           @Override

           public TraffickLamp nextLamp() {

              // TODO Auto-generatedmethod stub

              returnYELLOW;

           }

          

       };

      

       public abstract TraffickLamp nextLamp();

       private int time;

       private TraffickLamp(int time){this.time = time;}

    }

 

}

 

反射:

Java程序中的各个Java类,它们是否属于同一类事物,也可以用一个类来描述这类事物。这个类的名字就是Class。他是反射的基石。每个java类都是Class的一个实例对象,它们的内容不同,但是,它们的特征相同,方法,字段,父类,包。反射就是把Java类中的各种成分映射成相应的java类。

得到字节码的三种方法:

类名.class

对象. getClass()

Class.forName("类名")。

 

获取构造方法:

getConstructor()方法,

Constructor constructor =Class.forName(“java.lang.String”).getConstructor(StringBuffer.class)。

当有多个构造方法时可以获取所有构造方法返回一个数组

Constructor [] constructors=Class.forName("java.lang.String").getConstructors();

获取构造方法后就可以用构造方法创建这份字节码的对象了

String str =(String)constructor.newInstance(new StringBuffer("abc"));

 

获取字段:即字节码中的成员变量

使用getField("变量名");方法。getDeclardField方法可以获得字节码中的私有变量,通过setAccessible方法可以暴力发射得到私有变量的值

 

获取方法:

使用getMethod()。Method charAt =Class.forName("java.lang.String").getMethod("charAt",int.class);

得到一个类中的方法后就可以用invoke方法调用这个方法了。

System.out.println(charAt.invoke(str, 1));如果invoke方法的第一个参数为null那说明这个方法是静态方法不需要创建对象也能调用。

 

------- android培训java培训、期待与您交流! ----------  详细请查看: http://edu.csdn.net/heima/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值