java基础加强
1.1课程大纲
1)eclipse的使用技巧
2)静态导入
3)可变参数与for循环增强
4)基本数据类型的自动拆箱与装箱
5)枚举
6)反射
7)javaBean内省
8)beanutils工具包
9)注解
10)泛型
11)类加载器
12)代理
13)线程并发库
1.2eclipse的使用技巧
IDE和eclipse开发工具介绍:
IDE:itegrity development environment(集成开发环境)
IDE开发工具都支持使用工程化方式管理一个项目的程序开发过程。
eclipse工程管理和快捷键设置:
一个workspace可以包含多个project,一个workspace保留了eclipse的一套环境选项的配置,可以影响workspace下的工程。
切换工作间:File-->Switch WorkSpace-->选择
修改工程名称:选定工程--->右键单击------>Refactor
快捷键配置:window--->preferences---->General----->keys-----查找content Assist
eclipse视图管理与程序调试:
Debug调试--- (Perspective:透视图。)Debug透视图
透视图:一些小窗口的集合。视图:某个小窗口。打开视图:window---->show view---->选择
调试中选中变量---->右键单击----->watch----->查看变量的值
配置eclipse的编译和开发环境:
设置单个工程的Javac和Java
window---preferences---Java-----Compiler
高版本的Java能够运行低版本的javac编译的程序,但低版本的Java不能运行高版本的javac编译的程序。
在eclipse中配置Java模板代码:
模板代码:Templates。快捷键的绑定。
在eclipse中导入已有的工程:
File----import----General----Existing Project into Workspace
1.3静态导入
普通导入某一个类或某一个包所有的类。
静态导入:import static 语句导入一个类中的某个静态方法或所有静态方法。
1.4可变参数与增强for循环
一个方法接收个数不固定的参数。
可变参数的注意事项:1.只能出现在参数列表的最后;
2。。。位于变量类型和变量名之间;
调用数组时,编译器会为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
增强for循环:for(type 变量名:集合变量名){}
注意:迭代变量必须在()中定义;集合变量可以是数组或实现了Iterable接口的集合类。
1.5基本数据类型的自动装箱与拆箱
Integer i=3;自动装箱
i=i+3;自动拆箱
当数值在byte范围内,如果该值已经存在,则不会开辟新空间了。
1.6枚举
为什么要有枚举?
枚举就是要让某个类型的变量取值只能为若干个固定值中的一个。否则,就会编译失败。
枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量在开发阶段无法实现这一目标。
枚举的基本应用?
枚举就相当于一个类,其中也可以定义构造方法,成员变量,普通方法,和抽象方法。
枚举是一个特殊的类,其中的每一个语速都是该类的一个实例对象。
枚举只有一个成员时,就可以作为一种单例的实现模式。
1.7反射
反射的基石Class类,
Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名为Class类。
Person类代表人,它的实例对象就是各种各样的具体人对象,而Class类代表Java类,它的各个实例对象是指对应各个类在内存中的字节码。
如何获得各个字节码对应的实例对象
类名.class; 对象.getClass(); Class.forName(" haha ");
反射就是把Java类中的各种成分映射成相应的Java类。 分别是Field,Method,Constructor,Package,一个类中的每一个成员都可以用相应的反射API类的一个实例对象表示。
1.8构造方法的反射应用:
Constructor类:代表某个类中的一个构造方法。
一个类中有多个构造方法,根据参数的个数和类型区分清楚那个构造函数。
Class.newInstance();该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。
1.9成员变量的反射应用
Field类:代表某个类中的一个成员变量。
字段Field类的对象代表的是一个变量的定义,而不是该具体的变量。
1.10成员方法的反射
Method类:代表某个类中的一个成员方法。
反射方式得到类中某个方法:Method charAt=Class.forName(" ").getMethod(" ",int.class);
调用方法:charAt.invoke(str,1);
1.11数组与Object的关系及反射类型
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。
代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class
基本类型的以为数组可以被当作Object类型使用,不能当作Object【】类型使用,非基本类型的一维数组,即可以当作Object类型使用,又可以当作Object【】类型来使用。
1.12反射的作用:实现框架功能
框架与工具类的区别:工具类被用户的类调用,而框架则是调用用户提供的类。
框架要解决的核心问题:写程序时不知道要被调用的类名,无法直接创建对象,而是用反射来做。
具体采用配置文件加反射的方式。
1.13对JavaBean的简单内省操作:
JavaBean是一种特殊的类,主要用于传递数据。这种Java类中的方法主要用于访问私有变量,且方法名符合某种命名规则。
如果两个模块之间传递多个信息,可以将这些信息封装到一个javaBean中,这种JavaBean的实例对象称为值对象。
这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问。
如果将一个普通的类当作javaBean来使用,JDK中提供了对javaBean进行操作的一些API,这些API称为内省。
1.14使用Beanutils工具包操作javaBean
Beanutils.getProperty(pt,"x");
Beanutils.setProperty(pt,"x",9);
2.1注解
注解相当于一种标记,加了注解就等于打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具或其他程序可以反射类了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以在包,类,方法,字段,方法的参数以及局部变量上。
@SuppressWarnings(“deprecation”);使用了不赞成使用的类和方法时警告。
注解,就Java.lang包中可以看到JDK提供的最基本的annotation
Annotation types:Deprecated,Override,SuppressWarnings。
2.2注解类
@interface A{}
注解就相当于一个你的源程序中要调用的一个类,要在源程序中应用某个注解,就得先准备好这个注解类。
应用注解:ItCastAnnotation annotation=(ItCastAnnotation)AnnotationTest.getAnnotation(ItCastAnnotation.class);
2.3为注解添加基本属性
在注解类中增加String color();
@M有Annotation(color=“red”)
为属性指定缺省值:String color“() default ”xyz“;
2.4为注解添加高级属性
数组类型的属性
Int【】 ArrayAttr() default {1,2,3};
@MyAnnotation(arrayAttr)
如果数组属性中只有一个元素,这时候属性值部分可以省略大括
枚举类型的属性
EnumTest.TrafficLamp lamp();
@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)
注解类型的属性
MetaAnnotation annotationAttr() default @MetaAnnotation("xxx");
@MyAnnotation( annotationAttr=@MetaAnnotation("yyy"))
总结:枚举和注解都是特殊的类,不能用new 创建他们的实例对象,创建枚举的实例对象就是在其中增加元素,而创建注解的实例对象直接用@放上一个标记即可。
2.5泛型
泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住了源程序中的非法输入,编译器编译带类型说明的集合会去掉类型信息,使程序运行效率不会收到影响。
了解泛型:
ArrayList<E>整个称为泛型类型,其中的E称为类型变量或类型参数,而ArrayList<Integer>称为参数化额类型,其中的Integer称为类型参数的实例或实例类型参数。
其中的<>可以念做typeof,ArrayList称为原始类型。
2.6参数化类型与原始类型的兼容性
参数化类型可以使用一个原始类型的对象,编译报告警告;原始类型可以使用一个参数化类型的对象,编译报告警告。
参数化类型不考虑参数类型的继承关系;在创建数组实例时,数组的元素不能使用参数化的类型。
2.7泛型的通配符?
使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数无关的方法,不能调用与参数有关的方法。
限定通配符的上边界:<? extends Number>;限定通配符的下边界<? supper Integer>
泛型集合类的综合案例:
HashMap<String,Integer> hm=new HashMap<String,Integer>();
hm.put("xxef",19);
hm.put("dfe",18);
Set<Map.Entry<String,Integer>> mes=hm.entrySet();
for(Map.Entry<String,Integer> me:mes)
{
System.out.println(me.getKey()+";"+me.getValue());
}
2.8自定义泛型方法
private static <T> T add(T x,T y){
return (T)(x+y);
}
用于放置泛型的参数类型的尖括号应出现在方法的其他所有修饰符之后和在方法的返回值之前。按照惯例,类型参数通常用单个大写字符表示。
除了在应用泛型时可以使用extends限定符,在定义泛型时也可以使用extends限定符,并且可以用&来指定多个边界。
在泛型中可以同时有多个参数类型。
2.9如果类的实例对象中的多处都要用到同一泛型参数,即这些地方引用的泛型类型要保持同统一个实例类型时,这时候就要采用泛型类型的方式进行定义,也就是类级别的泛型。
格式:public class<E> GenericDao{
private T field1;
public void save(T obj){}
public T getByID(int id){}
}
类级别的泛型是根据引用该类名时指定的类型信息来参数化类型变量的。
new genericDao<String>();