----------------------- android培训、java培训、期待与您交流--------------------
静态导入 static import
1、导入一个类下面所有的静态成员
示例:import static java.lang.Math.*;
2、可变参数 variable
void testVariable(int num1,double... num2){}
需要注意的是 可变参数一定要位于参数列表的最后一位否则程序无法识别这和方法的重载是一个道理
3、增强for循环
for(static Object obj : args){}
循环对象可以用修饰语句
4、享源模式 flyweight
装箱时内存会开辟一个池存储数值然后让对象引用此值,如果还有另外一个对象引用相同的值此并且当此值很小(不超过一个字节)的时候那么他们引用的是一个值
5、用普通类(class)模拟枚举(enum)
· 私有构造函数
· 在类中构造static final 对象
6、枚举enum
· 字符串转枚举
Gender male = Gender.valueOf("男");
enum Gender { 男, 女 }
· 可以为枚举定义构造方法
· 枚举中可以含有成员变量及方法
· 枚举中可以含有抽象方法
7、反射 {
反射会导致程序性能下降
字节码,类编译成字节码后存放在内存中
· Fields类->成员变量
· Constructor类->构造方法
· Method类->方法 {
通过反射获取方法适合调用Method对象的invoke() (如果参数为数组时应对参数拆箱方案) 1、将数组再打包成Object[]数组 2、将数组显示转换为(Object)
}
· 数组转换成Object的问题
int[]intArray = new int[]{1,2,3};
String[]stringAyyay = new String[]{"a","b"};
Object obj1 = intArray ; √
Object obj2 = stringArray;√
Object [] obj3 = intArray ; × 基本类型的数组无法转换成Object数组 (它不是对象数组)
Object [] obj4 = stringArray;√
· 用hash集合存储的对象是根据其对应的hash位置来存储的,所以相同hash值会导致添加失效
反射主要是用于框架的开发
}
· 框架的概念以及用反射技术开发框架的原理
Properties 类似一个Hash集合 但是Properties 增强了对文件的操作
· 内省和JavaBean
如果一个类含有getter 和 setter就称之为JavaBean
JDK中提供了一个对JavaBean操作的类 java.beans.PropertyDescriptor 来专门操作Javabean 这就叫做内省
8、注解的入门和应用
注解就是一种标志,向编译程序传达一种信息(他们会通过反射来了解到) 例如@Override
9、泛型
泛型集合的类型规定仅仅在编译之前有作用,编译后会去掉泛型类型信息,所以泛型不会影响执行效率
Map集合的操作
Map.Entry类代表一个组合(key,value)
示例:
Map<String, Integer> maps = new HashMap<String, Integer>();
maps.put("a", 1);
maps.put("b", 2);
maps.put("c", 3);
Set<Entry<String, Integer>> entrySet = maps.entrySet();
for (Entry<String, Integer> entry : entrySet) {
System.out.println("key:" + entry.getKey() + ",value:"
+ entry.getValue());
}
声明泛型时可以用extends来限定
例如: <T extends collection>
也可以用&来进行多个限定,这样参数就必须是一个同时实现多个接口(父类)的类才可以
泛型异常
示例:
static <T extends Exception> sayHi() throws T{
try{}
catch(Exiception e)//这里的Exception不要使用泛型类型,用张老师的话讲就是(泛型异常人家怎么给你抓?)
{
throw (T)e;
}
}
定义多个泛型的时候用逗号隔开
例如:<T extends Exception ,K ,V>
在类中静态方法不能够使用泛型变量,因为静态成员是被所有参数化的类共享的,所以静态成员能有类级别的类型参数
10、类加载器
· java虚拟中可以安装多个类加载器,系统默认有三个主要的类加载器,他们负责家在特定位置的类
类加载器的特征:发起加载的加载器会首先让最上级加载如果加载不到再向下一级一级的传递加载任务,这样可以有效避免两此加载相同字节码
BootStrap \ ExtClassLoader \ AppClassLoader
BootStrap 加载 JRE/lib/rt.jar System 就是 rt.jar中的类
ExtClassLoader 加载 JRE/lib/ext/*.jar
AppClassLoader 加载 ClassPath指定的所有目录和jar
· 类加载器也是java类,他本身也要被类加载器所加载所以必须有一个第一加载器,BootStrap就是这个第一加载器
自定义类加载器需要继承ClassLoder类
· 类加载器的委托机制
·首先当前类的加载器会去加载线程中的第一个类;
·如果类A中引用了类B,java虚拟机将使用加载类A的类加载器来加载类B;
·还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类;
· 每个类加载器加载类时,又先委托给最上级类加载器然后层级递减
·当所有的上级类加载器没有加载到类时,会回到发起者类的加载器,如果还无法加载则会抛出ClassNotFoundException,不会再去找加载类的子类加载器了,如果有其子类的话该用哪个去加载呢,所以java没有提供getChild()方法;
11、面向方面(AOP)概念
为目标的方法增加一些其他的操作就是面向方面
代理类的各个方法中一半除了要调用目标的相应方法和对外但会目标返回的结果外,还可以在代理方法中的以下位置加上系统功能的代码
1、调用目标方法之前
2、调用目标方法之后
3、处理目标方法异常的catch块中
注解就是一种标志,向编译程序传达一种信息(他们会通过反射来了解到) 例如@Override
12、泛型
泛型集合的类型规定仅仅在编译之前有作用,编译后会去掉泛型类型信息,所以泛型不会影响执行效率
Map集合的操作
Map.Entry类代表一个组合(key,value)
示例:
Map<String, Integer> maps = new HashMap<String, Integer>();
maps.put("a", 1);
maps.put("b", 2);
maps.put("c", 3);
Set<Entry<String, Integer>> entrySet = maps.entrySet();
for (Entry<String, Integer> entry : entrySet) {
System.out.println("key:" + entry.getKey() + ",value:"
+ entry.getValue());
}
声明泛型时可以用extends来限定
例如: <T extends collection>
也可以用&来进行多个限定,这样参数就必须是一个同时实现多个接口(父类)的类才可以
泛型异常
示例:
static <T extends Exception> sayHi() throws T{
try{}
catch(Exiception e)//这里的Exception不要使用泛型类型,用张老师的话讲就是(泛型异常人家怎么给你抓?)
{
throw (T)e;
}
}
定义多个泛型的时候用逗号隔开
例如:<T extends Exception ,K ,V>
在类中静态方法不能够使用泛型变量,因为静态成员是被所有参数化的类共享的,所以静态成员能有类级别的类型参数
13、类加载器
· java虚拟中可以安装多个类加载器,系统默认有三个主要的类加载器,他们负责家在特定位置的类
类加载器的特征:发起加载的加载器会首先让最上级加载如果加载不到再向下一级一级的传递加载任务,这样可以有效避免两此加载相同字节码
BootStrap \ ExtClassLoader \ AppClassLoader
BootStrap 加载 JRE/lib/rt.jar System 就是 rt.jar中的类
ExtClassLoader 加载 JRE/lib/ext/*.jar
AppClassLoader 加载 ClassPath指定的所有目录和jar
· 类加载器也是java类,他本身也要被类加载器所加载所以必须有一个第一加载器,BootStrap就是这个第一加载器
自定义类加载器需要继承ClassLoder类
· 类加载器的委托机制
·首先当前类的加载器会去加载线程中的第一个类;
·如果类A中引用了类B,java虚拟机将使用加载类A的类加载器来加载类B;
·还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类;
· 每个类加载器加载类时,又先委托给最上级类加载器然后层级递减
·当所有的上级类加载器没有加载到类时,会回到发起者类的加载器,如果还无法加载则会抛出ClassNotFoundException,不会再去找加载类的子类加载器了,如果有其子类的话该用哪个去加载呢,所以java没有提供getChild()方法;
14、面向方面(AOP)概念
为目标的方法增加一些其他的操作就是面向方面
代理类的各个方法中一半除了要调用目标的相应方法和对外但会目标返回的结果外,还可以在代理方法中的以下位置加上系统功能的代码
1、调用目标方法之前
2、调用目标方法之后
3、处理目标方法异常的catch块中
java5 的新特性
静态导入
装箱(例如: Integer 对象可以直接付int类型的的值)
享元模式 flyweight
枚举
可变参数
注解
Type 接口
泛型
意外收获:
this 关键字在方法中出现是表示调用此方法的对象
----------------------- android培训、java培训、期待与您交流! ----------------------