黑马程序员——Java中JDK1.5的一些新特性

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

 

Java语言的升级,带来了许多的好处,提供了许多的便利,JDK1.5的新特性有静态导入,可变参数,枚举,注解,增强for循环,内省等,下面对这些新特性做了一些总结:

 

静态导入:

例如:Import  static  java.lang.Math.*;

 

可变参数的特点:

(1)    只能出现在参数列表的最后

(2)    位于变量类型和变量名之间,前后有无空格都可以,

              public static int add(int x,int … args)  表示可以接收若干个整数

(3)    调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数

 

可变参数示例:

package itheima;

publicclass Variableparameter {

   /**

    * 可变参数

    */

   publicstaticvoid main(String[] args) {

     

      System.out.println(add(2,3));

      System.out.println(add(2,3,5));

     

  

   publicstaticint add (int x,int...args)

   {

      int sum=x;

      for(int i=0;i<args.length;i++)

      {

         sum+=args[i];

      }

      return  sum;

     

   }

}

增强for循环:

Ctrl+shift+/  :是注释整个段落

语法:

     for(type 变量名:集合变量名){….}

注意事项:

     1,迭代变量必须在()中定义

     2,集合变量可以是数组或实现了Iterator集合的集合类

示例:

publicstaticint add (int x,int...args)

   {

      int sum=x;

      for(int arg : args)

      {

         sum+=arg;

     

      return  sum;

   }

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

自动拆箱:

  Inerger iobj=3;

装箱:

  System.out.println(iobj+12);

示例:

Integer i1=13;

Integer i2=13;

System.out.println(i1==i2);   这个的结果为true

 

Integer i1=137;

Integer i2=137;

System.out.println(i1==i2);   这个的结果为false

这是为什么呢?

对于这些基本数据类型的整数,要装箱成为Integer对象的时候,如果这些数据在-128~127之间的这些数据,一旦被包装成Integer对象后,就会缓存起来,缓存到一个池中,在下次又要把数据装到Integer里面,先看池中有没有,如果有则直接从池中获取,这样节省了内存的空间。

 

Integer num5=Integer.valueOf(12);  //这个静态方法是将一个整数变成Integer,是手动调用一个静态方法,将基本类型变成Integer

Integer num6=Integer.valueOf(12);

System.out.println(num5==num6);  这个结果为true

用类加载器的方式管理资源和配置文件

配置文件应该放在什么地方

getRealPath();得到对应的真实的位置

一定要记住用完整的路径,但完整的路径不是硬编码,而是运算出来的

 

常用的方式:类加载器

但是这种方式的配置文件是只读的

InputStream in=reflectSet.class.getClassLoader().getResourceAsStream("itheima\\config.properties");

 

加载资源的时候:先找到这个类,然后在用这个类去找类加载器

reflectSet.class 

getClassLoader();这个是类加载器

getResourceAsStream("itheima\\config.properties");用类加载器去加载资源

 

但是这种方式的可以用于保存,在写一个OutputStream用于保存

InputStream in=new FileInputStream("config.properties");

 

也可以用这种方式:

InputStream in=reflectSet.class.getResourceAsStream("config.properties");

 

 

内省(IntroSpector)——>了解JavaBean

什么是JavaBean

JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。

 

如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object 简称VO

 

JavaBean的属性是根据其中的settergetter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id,去掉set前缀,剩余的部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。

(1)  setId()的属性名——>id

(2)  isLast()的属性名——>last

(3)  setCPU的属性名是——>CPU

(4)  getUPS的属性名是——>UPS

 

总之,一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量

 

一个符合JavaBean特点的类可以当作普通类一样进行使用,但把它当JavaBean用肯定需要带来一个额外的好处,好处如下:

(1)  JavaEE开发中,经常要使用JavaBean。很多环境就要求按JavaBean方式进行操作,别人都这么用和要求这么做,那你就没什么挑选的余地了

(2)  JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。如果要自己去通过getX方法来访问私有的x,怎么做,有一定难度?用内省这套API操作JavaBean比用普通类得方式更方便。

 

 

需求:用内省的方法来读取JavaBean中的属性

package itheima;

 

import java.beans.PropertyDescriptor;

import java.lang.reflect.Method;

 

publicclass IntroSpectorTest {

 

   publicstaticvoid main(String[] args)throws Exception{

          

      reflectClass rc=new reflectClass(3, 5);

     

      String propertyName="x";

     

      PropertyDescriptor pd=new PropertyDescriptor(propertyName, rc.getClass());

     

        Method methodGetX=pd.getReadMethod();//获取读的方法,getX方法

        Object retVal=methodGetX.invoke(rc);//因为getX方法有返回值,不知道是什么类型的,所以用Object来接收

       

        System.out.println(retVal);

        PropertyDescriptor pd2=new PropertyDescriptor(propertyName, rc.getClass());

     

        Method methodSetX=pd2.getWriteMethod();//获取设置属性的方法,setX方法

       

        methodSetX.invoke(rc,9);//因为setX方法有没有返回类型,就不用任何类型接收

       

        System.out.println(rc.getX());

   }

 

对上面这个例子的解析:

/*总结:

    * get方法:

    * 首先对reflectClass这个对象进行操作,并且将其当成JavaBean来进行操作

    * 获取x的属性名

    * PropertyDescriptor是属性描述符,里面的参数是属性的名字和当作JavaBean的类  就是reflectClass这个类,

    * 相当于从这个JavaBean类中获取前面的参数,也就是属性

    * 得到了这个属性,继而就可得到这个属性的getset方法(getReadMethod()getWriteMethod()

    * 因为是获取属性的值,也就相当于读取属性的值,所以使用getReadMethod()这个方法

    * 这两个方法的返回类型是MethodMethod methodGetX=pd.getReadMethod();

    * methodGetX.invoke(rc)用这个方法定义的methodGetX这个变量去调用invoke方法,

    * 在哪个对象上调用呢?在rc上调用,rcreflectClass类得实例对象,

    * 又因为get方法没有参数类型,所以invoke里面就一个参数

    * 因为get方法有返回值类型,但是我们并不知道是什么类型的,所以使用Object来接收

    *

    * set方法:

    * 上面和get的描述是一样的

    * 因为是设置属性的值,也就相当于写属性的值,所以使用getWriteMethod()这个方法

    * 因为set方法没有返回类型,可直接调用invoke方法

    * methodSetX.invoke(rc9)用这个方法定义的methodSetX这个变量去调用invoke方法,

    * 因为set方法里面有参数,所以要给这个x设置的值就直接写在invoke方法中

    * */

 

复杂的内省操作:

主要记住的是  IntroSpector.getBeanInfo  这个类的静态方法

只要调用这个方法,并给这个方法传递一个对象、属性名和设置值,它就能完成属性修改的功能。

 

privatestatic Object getProperty(Object rc, String propertyName)

         throws IntrospectionException, IllegalAccessException,

         InvocationTargetException {

 

       BeanInfo beanInfo=Introspector.getBeanInfo(rc.getClass());

     

     PropertyDescriptor[] pd=beanInfo.getPropertyDescriptors();

      Object retVal=null;

 

      for(PropertyDescriptor pds:pd)

      {

         if(pds.getName().equals(propertyName))

         {

          Method methodGetX=pds.getReadMethod();//获取读的方法,getX方法

             

           retVal=methodGetX.invoke(rc);

          

           break;

         }

      } 

      return retVal;

   }

 

这个例子的逻辑可以用于有一个集合,从集合中查找某一个特定的元素,找到这个元素在对这个元素进行操作

面试题:

说一说overLoadoverRide的区别(重载和重写的区别):

重载:两个参数的列表、个数和类型完全一样,但是返回值类型不同——>不行

为什么不行?

因为重载是指同一类或父子类之间创建同名的多个方法,它们具有不同的参数列表,因为重载只与参数列表有关,与返回值无关

 

重写:如果父类的方法是私有的,那子类写一个方法和父类一样,那是不是叫重写?  不是重写   等于一个全新的方法

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值