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

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

2015-06-30 08:50 766 查看
------- 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的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为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类中获取前面的参数,也就是属性

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

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

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

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

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

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

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

*

* set方法:

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

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

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

* methodSetX.invoke(rc,9)用这个方法定义的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;

}

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

说一说overLoad与overRide的区别(重载和重写的区别):

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

为什么不行?

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

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

------- android培训java培训、期待与您交流!
-------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: