------- 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的区别(重载和重写的区别):
重载:两个参数的列表、个数和类型完全一样,但是返回值类型不同——>不行
为什么不行?
因为重载是指同一类或父子类之间创建同名的多个方法,它们具有不同的参数列表,因为重载只与参数列表有关,与返回值无关
重写:如果父类的方法是私有的,那子类写一个方法和父类一样,那是不是叫重写? 不是重写 等于一个全新的方法