静态导入:
import static语句导入一个类中的某个静态方法或所有静态方法
如:import static java.lang.Math.*; 其导入math类中的静态方法
可变参数:
public class Varable {
public static void main(String [] args){
System.out.println(add(2,3));
System.out.println(add(2,7,5));
}
public static int add(int x,int ...args){
int sum=x;
for(int i=0;i<args.length;i++){
sum+=args[i];
}
return sum;
}
}
add方法中的参数 int...args就是可变参数,可加入多个int类型的参数。
其特点是:只能出现在参数列表的最后;位于变量类型和变量名之间,前后有无空格都可以;调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
增强for循环:
for ( type 变量名:集合变量名 ) { … }
增强for循环和iterator遍历的效果是一样的,也就说增强for循环的内部也就是调用iteratoer实现的。 其优点是使代码变得简洁,让程序员使用是更加方便,但其也有局限性,对于数组,不能方便的访问下标值; 对于集合,与使用Interator相比,不能方便的删除集合中的内容(在内部也是调用Interator),所以除了简单遍历并读取其中的内容外,不建议使用增强的for循环。
基本数据类型的自动拆箱与装箱:
自动装箱:
Integer num1 = 12; 本来12是int类型的数据,但由于num1是Integer的对象,所以12自动装箱为integer对象
自动拆箱:
System.out.println(num1 + 12); num1本来是Integer对象,但由于其与int类型数据12相加,所以其自动拆箱为int类型的数据
基本数据类型的对象缓存:
Integer num1 = 12;
Integer num2 = 12; 这块相等,<=127都是真的
System.out.println(num1 == num2);
Integer num3 = 129; 这块不相等,因为129超出了int类型的范围,不能自动拆箱,所以它是对象,false
Integer num4 = 129;
System.out.println(num3 == num4);
Integer num5 = Integer.valueOf(12);
Integer num6 = Integer.valueOf(12) ; 这块的道理同上
System.out.println(num5 == num6);
枚举:
当使用enum定义枚举类型时,实际上所定义出来的类型是继承自java.lang.Enum类。而每个被枚举的成员其实就是定义的枚举类型的一个实例,它们都被默认为final。无法改变常数名称所设定的值,它们也是public和static的成员,这与接口中的常量限制相同。可以通过类名称直接使用它们。定义枚举类型其实就是在定义一个类,只不过很多细节由编译器帮你补齐了,所以,某种程度上enum关键词的作用就像是class或interface.
如: enum Person{
CHINESE, //中国人
AMERICAN, //美国人
ENGLISH; //英国人
}
这是定义枚举常量,每个常量都代表了各自的意思。
反射:
class类是反射的基石,反射就是把Java类中的各种成分映射成相应的java类。
Constructor类代表某个类中的一个构造方法:Constructor [] constructors= Class.forName("java.lang.String").getConstructors();
通过class.forName将类加载进来,通过getConstructors()获取该类所有的构造方法,
String obj = (String)Class.forName("java.lang.String").newInstance();中的newInstaance是获取该类中默认的构造方法
Field类代表某个类中的一个成员变量
例子:
ReflectPoint point = new ReflectPoint(1,7);
Field y = Class.forName("cn.itcast.corejava.ReflectPoint").getField("y");
System.out.println(y.get(point));
Field x = Class.forName("cn.itcast.corejava.ReflectPoint").getDeclaredField("x");
x.setAccessible(true);
System.out.println(x.get(point));
Method类代表某个类中的一个成员方法
得到类中的某一个方法:
例子: Method charAt = Class.forName("java.lang.String").getMethod("charAt", int.class);
调用方法:
通常方式:System.out.println(str.charAt(1));
反射方式: System.out.println(charAt.invoke(str, 1));
getMethod中的charAt是类中的方法名,int.class是该方法的参数型,charat.invoke()中的str是要调用该方法的对象,1是该方法的参数。
反射的作用是实现框架功能,框架就像我做房子卖给用户住,由用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我提供的框架中。框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类。