静态导入
importstaticjava.lang.Math.max;//导入类下的某个静态方法。
importstaticjava.lang.Math.*;//导入类下的所有静态方法。
可变参数与for循环增强
//可变参数方法
public static int add(int x,int… args){//int b…只能在最后一个。
//方法实现体。
//在方法中以数组的形式来使用args变量。
}
增强for循环。
for(type 变量名:集合变量名){
//循环体
}
注意事项:
迭代变量必须在()定义!
集合变量可以是数组或实现Iterable接口的集合类。
基本数据类型的自动拆箱与装箱
Integernum1 = 2;//5.0版本后的jdk自动装箱语法
System.out.println(num1+ 3);// 5.0版本后的jdk自动拆箱语法
对于基本数据类型,自动装箱会将-128~127之间的数据自动缓存起来。
Integer num1 = 12;
Integer num2 = 12;
num1 == num2 ?//true
Integer i1 = 128;
Integer i2 = 128;
I1 == i2 ?//false
享元模式:flyweight
就是把很多相同的对象封装成一个对象,而不同属性则封装成一个外部状态。
反射
Class类代表Java类,它的各个实例对象又分别对应什么呢?
对应各个类在内存中的字节码,例如,Person类的字节码,ArrayList类的字节码,等等。
一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型是什么呢?
如何得到各个字节码对应的实例对象( Class类型)
类名.class,例如,System.class
对象.getClass(),例如,new Date().getClass()
反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Contructor、Package等等。
反射学习要点
就是学会运用反射的API来获取一个类中各个成员对象,如成员变量、构造方法和普通方法,然后运用获取的对象进行操作。
从jdk1.2以后出现了反射的机制。
Class.forName()方法作用:
返回字节码,加载方式有两种,一种是这份字节码已经加载过待在虚拟机里了直接返回,还有一种是java虚拟机中还没有这份字节码,则用类加载器去加载,把加载进来的字节码缓存在内存中。
1. 对象.getClass();
2. 类名.class;
3. Class.forName(“类全路径限定名”);//Class.forName(“java.lang.String”)
Class对象的isPrimitive()方法判断某个类型是否是基本类型。
int.class == Integer.TYPE;//true, Integer.TYPE返回包装类的基本类型Class对象
只要在源程序中出现的类型,都有各自的Class实例对象。
反射就是把java类中的各种成分映射成相应的java类。
Field类的getFIeld方法只能拿到可见的字段。
getDeclaredField方法可以拿到private字段。
可使用对象setAccessible(true).则可以取到私有成员的值。
Field类小示例:
private static void changeFieldValue() throwsIllegalAccessException {
Useruser = new User();
user.setAge(1002);
user.setUsername("abddeb");
Field[]fields = user.getClass().getDeclaredFields();
for(Field field : fields) {
field.setAccessible(true);
if(field.getType() == String.class) {
StringvalString = (String)field.get(user);
StringnewVal = valString.replace('b', 'a');
field.set(user,newVal);
}
}
System.out.println(user.getAge());
System.err.println(user.getUsername());
}
静态方法反射调用:
methodObj.invoke(null,””);//因为是静态方法不需要对象调用,第一个参数传空。
为了兼容jdk1.4,以数组作为方法参数被反射调用时,不能直接传入对应的一个数组对象(java会自动将数组元素拆开),此时应该对传入的数组对象再打包一次,例如:
class MethodTest{
public static void myMethod(String[] args){
}
}
你做的门调用锁,锁是工具,你做的门被房子调用,房子是框架,房子和锁都是别人提供的。
ClassLoader | getClassLoader() 返回该类的类加载器。 |
InputStream | getResourceAsStream(String name) 查找具有给定名称的资源。 |
静态方法反射调用:
methodObj.invoke(null,””);//因为是静态方法不需要对象调用,第一个参数传空。
为了兼容jdk1.4,以数组作为方法参数被反射调用时,不能直接传入对应的一个数组对象(java会自动将数组元素拆开),此时应该对传入的数组对象再打包一次,例如:
class MethodTest{
public static void myMethod(String[] args){
}
}
反射的调用:
Method method = MethodTest.class.getMethod(“myMethod”,String[].class)
Method.invoke(null,new Object[]{new String[]{“111”,”222”}});
或者:
Method.invoke(null,(Object){new String[]{“111”,”222”}});
基本类型的一维数组可以被当作Object类型使用,不能当做Object[]类型使用,非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。
Object[] a = new String[]{};//编译通过。
System.out.println(Arrays.asList(a));
System.out.println(Arrays.asList(newString[]{"2","3"}));
往HashSet添加完数据后,不要对元素中参与hashCode运算的属性进行修改,否则hashCode发生改变,当要删除该元素时将出现无法找到该元素的现象,这是会导致内存泄露的一个情况。
框架与框架要解决的核心问题:框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类。