--------------------------- android培训、java培训、期待与您交流!---------------------------
1 静态导入:
使用静态导入的好处:提高编写代码的效率。
静态成员的使用,使用import static 引入静态成员。
例子:
没有静态导入
Math.max(3,6);
有了静态导入
import static java.lang.Math.*;
max(3,6);
其中import static java.lang.Math.*;就是静态导入的语法,它的意思是导入Math类中的所有static方法和属性。
这样我们在使用这些方法和属性时就不必写类名。
注意:默认包无法用静态导入,另外如果导入的类中有重复的方法和属性则需要写出类名,否则编译时无法通过。
2 可变参数:(底层是通过数组来实现的)
特点:
如果有多个参数,可变参数要定义在最后边..位于变量类型和变量名之间,前后有无空格都可以;在调用可变参数的方法时,编译器会为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
3 for循环增强
格式:
for(数据类型 变量名: 数组或集合变量名)
{
执行语句;
}
简化了对数组,集合的遍历。
注意:迭代变量必须在()中定义。集合变量可以是数组或实现了Iterable接口的集合类。
例子:
public class VariableParameter {
public static void main(String[] args) {
System.out.println(add(3,5));
System.out.println(add(3,5,7));
}
private static int add(int x, int ...arr) {//arr就是定义了一个可变参数。
for(int g:arr){//for循环增强
x+=g;
}
return x;
}
}
4 基本数据类型的自动装箱与拆箱
特点:
自动封箱解箱只在必要的时候才进行。还有其它选择就用其它的
自动装箱:Integer num = 12;
自动拆箱:Int num = new Integer(12);
基本Boolean/Byte/Integer(数值范围:-128至127)数据类型的对象缓存:
Integer num1 = 12;
Integer num2 = 12;
System.out.println(num1 == num2);结果为true
Integer num3 = 129;
Integer num4 = 129;
System.out.println(num3 == num4);结果为false
因为数值范围在:(-128至127)数据类型的对象缓存。
注意:
封装类可以等于null ,避免数字得0时的二义性。Integer i=null;int ii=i; 会抛出NullException 异常。相当于 int ii=i.intValue();
5 枚举
枚举就是要让某个类型的变量取值只能为若干个固定值中的一个。否则,编译时就会报错。
枚举(Enum)可以使用构造方法,构造方法必须是私有的(private)。枚举(Enum)可以使用成员变量和成员方法,枚举的所有成员必须位于元素列表之后。
枚举只有1个成员时,就可以作为一种单例的实现方式。
小练习:
public class EnumTest {
public static void main(String[] args) {
WeekDay MON =WeekDay.MON;//获取枚举WeekDay的元素。
WeekDay weekDay2 =WeekDay.TUE;
System.out.println(weekDay2);
System.out.println(weekDay2.name());//获取枚举的名字
System.out.println(WeekDay.valueOf("SUN"));//将字符串“SUN”变成枚举中所对应的对象SUN。
System.out.println(weekDay2.ordinal());//获取weekDay2的角标。
System.out.println(WeekDay.values().length);//将枚举中所有的元素装入WeekDay[]数组中并获取其的长度。
}
public enum WeekDay{
SUN(1),MON(),TUE,WED,THT,FRI,SAT;
private WeekDay(){System.out.println("frist");};//MON~SAT的构造函数。
private WeekDay(int day){//这个SUN(1)的构造函数。
System.out.println("second");
};
}
}
6 反射
在java中就是反射就是把Java类中的各种成分映射成相应的java类。
反射的作用:
用于工具,架构,动态开发等开发工程
三种得到类对象的途径:
1.Class.forName(“类名”),例如Class.forName(“java.util.Date”) //输入全类名
2.对象.getClass(),例如new Date().getClass() //得到该对象的类对象
3.类名.class,例如object.class
常用方法:
isPrimitive() : 判定指定的 Class 对象是否表示一个基本类型。
isArray() :判定此 Class 对象是否表示一个数组类。
getConstructors() :获取Class对象的所有构造方法。
getConstructor(Class<?>... parameterTypes):获取 Class对象的指定的构造方法。
newInstance():创建此 Class 对象所表示的类的一个新实例。
getSuperclass() :获取其父类的class对象。
Constructor的反射:
例子:
String str1 = new String(new StringBuffer("abc")); //用Constructor构造此String对象
Constructor constructor1 = String.class.getConstructor(StringBuffer.class);//获取构造方法。
String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));//使用构造方法并向里面传递参数。
Class.newInstance的作用:调用用默认的构造方法 ,省去中间Constructor的步骤
Class.forName("java.lang.String").newInstance();//获取空参数的构造方法的实例对象。
Field的反射:
Field FLY = rp1.getClass().getField("y"); //FLY不是对象上的变量,代表类身上字节码的变量 ,要用它去取某个对象上对应的值。
FLY.get(rp1); //用get取得y的值
暴力反射:取私有变量
Field FLX = rp1.getClass().getDeclaredField("x");//x为私有变量,所以用此方法
FLX.setAccessible(true);//设置可用
System.out.println(FLX.get(rp1));
Method的反射:
String s1 =new String("cds");
Method CharAt =String.class.getMethod("charAt", int.class);//取得String的charAt(int i)的方法
System.out.println(CharAt.invoke(s1,1));//调用这个方法,如果底层方法是静态的,该参数可以为 null,因为静态方法没有对象。
System.out.println(CharAt.invoke(s1,new Object[]{2}));//JDK1.5的形式 可以自动装箱
Method ValueOf =String.class.getMethod("valueOf", int.class);//获取valueOf(int i )这个静态方法。
System.out.println(ValueOf.invoke(null,1));//表示静态方法
小练习:
例子:(在一个函数中调用另一个函数的主函数)
import java.lang.reflect.*;
public class ReflectArray {
public static void main(String[] args) throws Exception {
//TestArguments.main(new String[]{"123","456","789"});下面函数效果和这句一样。
String StatingClassName ="TestArguments";//获取要调用主函数的类名。
Method mainMethod = Class.forName(StatingClassName).getMethod("main",String[].class);//获取TestArguments主函数的方法。
mainMethod.invoke(null, (Object)new String[]{"111","222","333"});//传递参数是数组就必须这么写
mainMethod.invoke(null, new Object[]{new String[]{"aaa","bbb","ccc"}});//传递参数是数组就必须这么写
}
}
class TestArguments{
public static void main(String[] args) {
for(String s :args){
System.out.println(s);
}
}
}
数组的反射:
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。
代表数组的Class实例对象的getSuperclass()方法返回的父类为Object类对应的Class。
基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用,非基本数据类型的一维数组,既可以当作Object使用,也可以当作Object[]使用。
Arrays.asList()方法:将数组转换为List。处理int[]和String[]时的差异。int[]为存入一个地址为List,String[]为存入里面的元素进入List。
ArrayList与HashSet比较:
HashCode:由此对象的内存地址换算而来。
哈希算法:将集合分为若干个储存区域,每个对象可以算出一个哈希码,将哈希码分组,每组分别对应某个储存区域,根据一个对象的哈希码就能确定该对象储存在哪个区域。
HashSet: 采用哈希算法的集合。实现了Collection接口,只能存入不同HashCode对象,即只存入不同的对象,如果希望存入具有相同内容的两个对象,则需覆盖对象的HashCode和 equals方法。
ArrayList:实现了Collection接口,对象之间有指定顺序,允许重复元素——即使是同一对象,也会被顺序存入。
提示:当一个对象被存入HasthSet中后,就不能再修改这个对象中那些参与计算哈希值的字段了,否则,修改后的哈希值与最初存入HashSet的就不相符了,此时HashSet将无法检索到此对象,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄漏(..无用后仍在内存中占用空间,从而造成内存的浪费)。
反射的作用:
实现框架功能,在写程序的时候无法知道要调用的类名,所以在程序中无法直接new某个类的实例对象,而要用反射的方式来做。
做框架的配置文件路径设置:
InputStream f =ReflectPoint2.class.getResourceAsStream("包名+类名");//文件路径为ReflectPoint2.class这个calss文件的路径。
--------------------------- android培训、java培训、期待与您交流!---------------------------
详细请查看: http://edu.csdn.net/heima/