Java基础增强

  【MyEclipse快捷键的配置】
·内容提示: Alt + /
·快速修复: Ctrl + 1
·导包: Ctrl + Shift + O
·格式化代码块: Ctrl + Shift + F
·向前向后: Alt + 方向键
·复制代码: Ctrl + Alt + ↓
·添加注释: Ctrl + Shift + /
·除去注释: Ctrl + Shift + \
·查看代码: Ctrl + 鼠标左键
·source: Alt + Shift + S
·导包 Ctrl + Shift + O
【程序的调试和运行】
·设置断点: 在需要加入断点的代码前双击
F5(跳入) F6(跳入) F7(跳出)
·断点注意的问题:
1、断点调试完成后,要在breakpoints视图中清除所有断点
2、断点调试完成后,一定要记得结束运行断点的jvm
【Junit】
在需要Junit测试的方法前加上@Test然后想都不用想Ctrl 1 再说。
@Before 加载资源 @After 释放资源
【静态导入】
·静态导入用于简化程序对类静态属性和方法的调用。
·语法:
import static 包名.类名.静态属性|静态方法|*
·例如:
import static java.lang.System.out;
import static java.lang.Math.*;
【jdk5自动装箱/拆箱】
·自动装箱:指开发人员可以把一个基本数据类型直接赋给对应的包装类。
·自动拆箱:指开发人员可以直接把一个包装类对象直接赋给对应的基本数据类型。
·典型应用:
List list = new ArrayList();
list.add(1);
int j = (integer)list.get(0);
【增强for循环】
·引入增强for循环的原因:在JDK5以前的版本中,遍历数组或集合中的元素,需先获得数组的长度或集合的迭代器,比较麻烦!
·JDK5中定义了一种新的语法——增强for循环,以简化此类操作。增强for循环只能用在数组、或实现Iterable借口的结合类上。
·语法格式:
for(变量类型 变量:需迭代的数组或集合){
}
public class For {
@Test
public void test0(){
int arr[] = {1,2,3};
for(int i : arr){
System.out.println(i);
}
}
@Test
public void test1(){
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
for(Object obj : list){
int i = (Integer)obj;
out.println(i);
}
}
@Test
public void test2(){
Map map = new HashMap();
map.put("1", "aaa");
map.put("2", "bbb");
map.put("3", "ccc");

//传统方式1
Set set = map.keySet();
Iterator it = set.iterator();
while(it.hasNext()){
String key = (String)it.next();
String value = (String)map.get(key);
System.out.println(key + "=" + value);
}
}
@Test
public void test3(){
Map map = new LinkedHashMap();  //重要,做购物车要用到
map.put("1", "aaa");
map.put("2", "bbb");
map.put("3", "ccc");

//传统方式2
Set set = map.entrySet();
Iterator it = set.iterator();
while(it.hasNext()){
Map.Entry entry = (Entry) it.next();
String key = (String)entry.getKey();
String value = (String)entry.getValue();
System.out.println(key + "=" + value);
}
}
@Test
public void test4(){
Map map = new LinkedHashMap();  //重要,做购物车要用到
map.put("1", "aaa");
map.put("2", "bbb");
map.put("3", "ccc");

//增强for取map的第1种方式
for(Object obj : map.keySet()){
String key = (String) obj;
String value = (String) map.get(key);
System.out.println(key + "=" + value);
}
}
@Test
public void test5(){
Map map = new LinkedHashMap();  //重要,做购物车要用到
map.put("1", "aaa");
map.put("2", "bbb");
map.put("3", "ccc");

//增强for取map的第2种方式
for(Object obj : map.entrySet()){
Map.Entry entry = (Entry) obj;
String key = (String) entry.getKey();
String value = (String) entry.getValue();
System.out.println(key + "=" + value);
}
}
//使用增强for循环要注意的几个问题:增强for循环只适合取数据,要修改数组或集合中的数据需要用传统方式
@Test
public void test6(){
int arr[] = {1,2,3};
for(int i : arr){
i = 10;
}
for(int i = 0; i < arr.length; i++){
arr[i] = 10;
}
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
【可变参数】
·测试JDK中具有可变参数的类Arrays.asList()方法。分别传多个参、传数组,传数组又传参的情况。
·从JDK5开始,Java允许为方法定义长度可变的参数。语法:
public void foo(int ...args){
}
·注意事项:
·调用可变参数的方法时,编译器将自动创建一个数组保存传递给方法的可变参数,因此,程序员可以在方法中以数组的形式访问可变参数
·可变参数只能处于参数列表的最后,所以一个方法最多只能有一个长度可变的参数。
【枚举类】
·为什么需要枚举?
·一些方法运行时,它需要的数据不能使任意的,而必须是一定范围内的值,此类问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举类予以解决。
·JDK5新增的enum关键字用于定义一个枚举类。
·枚举类具有如下特性
·枚举类是一种特殊形式的Java类。
·枚举类中生命的每一个枚举值代表类的一个实例对象。
·与java中普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必须为私有的。
·枚举类也可以实现接口、或继承抽象类。
·JDK5中还扩展了switch语句,它除了可以接收int,byte,char,short外,还可以接收一个枚举类型。
·若枚举只有一个枚举值,则可以当做单态设计模式使用。
·Java中声明的枚举类,均是java.lang.Enum类的孩子,它继承了Enum类的所有方法。常用方法:
·name() 返回此枚举常量的名称,在其枚举声明中对其进行声明。
·ordinal() 返回枚举常量的名称,
·valueof(Class enumClass,String name)
·values()此方法虽然在JDK文档中查不到,但每个枚举类都具有该方法,它用于遍历枚举的所有枚举值。
·作业: 请编写一个关于星期几的枚举WeekDay,要求:
·枚举值:MON,TUE,WED,THU,FRI,SAT,SUN
·该枚举要有一个方法,调用该方法返回中文格式的星期。
【反射】
·一个类有多个组成部分,例如:成员变量,方法,构造方法等。反射就是加载类,并解剖出类的各个组成部分。
·编程时什么情况下才需要加载类,并剖析出类的各个组成部分呢?
【加载类】
·Java中有一个Class类用于代表某一个类的字节码。
·Class既然代表某个类的字节码,它当然就要提供加载某个类字节码的方法:forName()。forName方法用于加载某个类的字节码到内存中,并使用clas对象进行封装
·另外另种得到class对象的方式:
·类名.class
·对象.getClass()
【解剖类】
·Class对象提供了如下常用方法:
public Constructor getConstructor(Class<?> ...parameterTypes)
public Method getMethod(String name, Class<?> ...parameterTypes)
public Field getField(String name)
//解剖私有成员
public Constructor getDeclaredConstructor(Class<?> ...parameterTypes)
public Method getDeclaredMethod(String name, Class<?> ...parameterTypes)
public Field getDeclaredField(String name)
·这些方法分别用于从类中解剖出构造函数、方法和成员变量(属性),解剖出的成员分别使用Constructor、Method、Field对象表示。
·思考:假设你是一个框架设计者,解剖出这些成员后你会干什么?
【利用Constructor创建对象】
public Object newInstance(Object ...initargs)
initargs用于指定构造函数接收的参数
·练习:反射类无参、有参、私有的构造函数,创建类的对象。
·多学一招:sun公司为简化开发人员创建对象,它在class对象中也提供一个newInstance方法,用于创建类的对象。这样开发人员可以避免每次都需要去反射Constructor类以创建对象。
·不过需要注意的是:class.newInstance方法内部是反射类无参的构造函数创建的对象,所以利用此种方式创建类对象时,类中必须有一个无参的构造函数。
【利用Method执行方法】
·Method对象提供了如下方法,用于执行它所代表的方法:
public Object invoke(Object obj,Object ...args)
·练习:使用Method分别执行无参、有参、多个参(带数组和基本数据类型)、静态、私有的方法。
·jdk1.4和jdk1.5的invoke方法的区别
·jdk1.5: public Object invoke(Object obj, Object ...args)
·jdk1.4: public Object invoke(Object obj, Object[] args)
【内省(Introspector)】
·为什么要学内省?
·开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术完成此类操作过于麻烦,所以sun公司开发了一套API,专门用于操作java对象的属性。
·什么是Java对象的属性和属性的读写方法?
·内省访问JavaBean属性的两种方式:
·通过PropertyDescriptor类操作Bean的属性
·通过Introspector类获得Bean对象的BeanInfo,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter、setter方法,然后通过反射机制来调用这些方法。
【泛型(Generic)——泛型的作用】
·JDK5以前,对象保存到集合中就会失去其特性,取出时通常要程序员手工进行类型的强制转换,这样不可避免就会引发程序的一些安全问题。例如:
ArrayList = new ArrayList();
list.add("abc");
Integer num = (Integer) list.get(0);  //运行时就会出错,但编码时发现不了
·JDK5中的泛型允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能发生的问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出)。
【掌握泛型的基本使用】
·掌握泛型集合的存取
【泛型的几个注意事项】
·使用泛型时的几个常见问题:
·使用泛型时,泛型类型须为引用类型,不能是基本数据类型。
·ArrayList<Object> list = new ArrayList<String>();
·ArrayList<String> list = new ArrayList<Object>();
·ArrayList<String> list = new ArrayList();
·ArrayList list = new ArrayList<String>();
·注意:泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛型的java程序后,生成的class文件将不再带有泛型信息,从此使程序运行效率不受影响,这个过程称之为“擦出”。
·泛型的基本术语,以ArrayList<E>为例:<>念“typeof”
·ArrayList<E>中的E称为类型参数变量
·ArrayList<Integer>中的Integer称为实际类型参数
·整个成为ArrayList<E>泛型类型
·整个ArrayList<Integer>称为参数化类型ParameterizedType
【自定义泛型——泛型方法】
·Java程序中的普通方法、构造方法和静态方法中都可以使用泛型,方法使用泛型前,必须对泛型进行声明,语法<T>,T可以是任意字母,但通常必须要大写。<T>通常需放在方法的返回值声明之前。例如:
public static <T> void doxx(T t)
·练习:
·编写一个泛型方法,实现数组元素的交换。
·编写一个泛型方法,接收一个任意数组,并颠倒数组中所有元素。
·注意:
·只有对象类型才能作为泛型方法的实际参数。
·在泛型中可以同时有多个类型,例如:
public static <K,V> V getValue(K key) {return map.get(key);}
【自定义泛型——泛型类和反射泛型】
·如果一个类多处都要用到同一个泛型,这时可以把泛型定义在类上(即类级别的泛型),语法格式如下:
public class GenericDao<T> {
private T field1;
public void save(T obj){}
public T getId(int id){}
}
·注意,静态方法下不能使用类定义的泛型,而应单独定义泛型。
·泛型的典型应用:BaseDao和反射泛型
public BaseDao(){
  Type type = this.getClass().getGenericSuperclass();
ParameterizedType pt = (ParameterizedType)type;
clazz = (Class)pt.getActualTypeArguments()[0];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值