1.静态导入
作用:用于简化程序对类静态属性和方法的调用。
语法:import static 包名.类名.静态属性|静态方法|*
例如:
import static java.lang.System.out
import static java.lang.Math.*
2.自动拆箱/装箱
自动装箱:指开发人员可以把一个包装类对象直接赋值给基本的数据类型,
Integer i=1; //装箱
自动拆箱:指开发人员可以把一个基本数据类型直接赋给对应的包装类,
int j=i; //拆箱
典型应用:
List list=new ArrayList();
list.add(1);
int j=(Integer)list.get(0);
3.增强for循环
jdk5.0之前的版本在遍历数组或集合中的元素是,需先获取数组的长度或集合的迭代器,比较麻烦
jdk5.0之后增强了for循环,以简化此类操作,增强的for循环只能用在数组或实现Iterable接口的集合上。
格式语法:
for(变量类型 变量:需迭代的数组或集合){
......
操作
......
}
//Map双列集合的遍历方式
//HashMap 倒序输出
//LinkedHashMap 正序输出
Map map=new HashMap();
map.put(“1”, “zhangsan”);
map.put(“2”, “lisi”);
map.put(“3”, “wangwu”);
//传统的方式
/*Set set=map.keySet();
Iterator iterator=set.iterator();
while (iterator.hasNext()) {
String key = (String) iterator.next();
String value=(String) map.get(key);
System.out.println(key+value);
}*/
//增强的for取map 方式1
for(Object obj:map.keySet()){
String keyString=(String) obj;
String valueString=(String) map.get(keyString);
System.out.println(keyString+valueString);
}
//增强的for取map 方式2
for(Object obj:map.entrySet()){
Map.Entry entry= (java.util.Map.Entry) obj;
String key=(String)entry.getKey();
String value=(String) map.get(key);
System.out.println(key+value);
}
※购物车时商品的先后顺序一定会用的,重点知识
需要注意的问题:增强for只适合取数组,要想改变数组的值,就要用传统的方试
4.可变参数
例子:
@Test
public void testSum(){
sum(1,2,3,4,5,6,7,8,9,10);
}
public void sum(int …nums){ //nums为可变参数
//可变参数,可以看做数组
int sum=0;
for(int i:nums){
sum+=i;
}
System.out.println(sum);
}
需要注意的问题: 可变参数就是数组,在传入参值的时候注意参数类型
可变参数只能处于参数列表的最后,所以一个方法最多只能有一个可变参数
5.枚举
1)作用:一些程序在运行时,它需要的数据不能是任意的,而且是一定范围内的值,jdk5.0后开始 用枚举来实现,在这之前是采用自定义类来解决的。
2)定义一个枚举,关键字:enum,一个枚举也可以构造函数,字段和方法
3)带抽象方法的枚举:在创建字段枚举时,需要将抽象方法实现
4)枚举类:
是一种特殊形式的java类, 枚举中声明的每一个枚举值代表枚举类的一个实例对象,
与java中的普通类一样,在声明枚举时,也可以声明属性,方法,和构造函数,但构造函数必须为私有(这点不难理解),枚举类也可以实现接口,获继承抽象类,
(若枚举类中只有一个枚举值,可当做单态设计模式)
5)java中声明的枚举类
java.lang.Enum类的子类,继承了Enum类的所有方法,常用方法:
请查看(API帮助文档)
反射(※※※※※※※※)
描述:一个类有多个组成部分,例如:成员变量,方法,构造方法等,反射就是加载类,并解剖出类的各个组成部分
疑问:在开发过程中什么情况下才需要使用反射,并解剖出类的各个成员?
1)做框架用到
2)学框架用
加载类:
1)java中有一个Class类用于代表某一个类的字节码。
2)Class既然代表某一个类的字节码,它当然就要提供加载某个类字节码的方法:forName(“类的 完整名称”)。例如:Class clazz=Class.forName(“类名”);就完成了加载类
forName方法用于加载某个类的字节码到内存当中,并使用class对象进行封装
(扩展:带包的类名称称之为类的完整名称)
3)另外等到class对象的两种方式:
类名.class
对象.getClass()
以Person类为例:
//加载类的方式一
Class clazz1=Class.forName(“/blockDemo/src/cn/itcast/reflect/Person.java”);//加载类的方式二 Class clazz2=new Person().getClass(); //加载类的方式三 Class clazz3=Person.class;
4)反射类的构造函数:Constructor c = clazz.getConstructor(参数类型.class);//公有
Constructor c=clazz.getDeclaredConstructor(参数类型.class);//私有
实例化对象的方法:c.newInstance(构造方法参数)
有参,无参,公有,私有都能解剖
面试题目:类中的私有成员外部可以访问吗? 不可以,私有的只能内部可以访问,
但是,反射可以做到访问私有,利用暴力反射。
反射类的方法:Method method = clazz.getMethod(参数类型.class); //公有
Method method = clazz.getDeclareMethod(参数类型.class); //私有
执行方法:invoke();
反射类的字段: Field field = clazz.getField(字段名);//公有
Field field = clazz.getDeclareField(字段名);//私有
详细代码请参考文件夹code中blockDemo。内省※(Introspector)
1)为啥要学内省?
开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术来操作此
类过于麻烦,所有sun公司开发了一套API,专门用来操作java对象的属性。
2)什么是java对象的属性和属性的读写方法?3)内省访问javaBean属性的两种方式:
a.通过PropertyDescriptor类操作Bean属性
b.通过Introspector类获得Bean对象的BeanInfo,然后通过BeanInfo来获取属性的描述器
(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应getter/setter方法,
然后通过反射机制来调用这些方法。
(注意:一个类的属性不是由字段来决定,而是由get或set来决定)