五、Java基础加强

时间:2023-01-02 19:23:48

Java基础加强

1、MyEclipse的使用
工作空间(workspace)、工程(project)
在eclipse下Java程序的编写和运行,及java运行环境的配置。
快捷键的配置,常用快捷键:
内容提示:Alt + /
快速修复:Ctrl + 1
导包:Ctrl + shift + O
格式化代码块:ctrl + shift + F
大小写转换:变大写 Ctrl+Shift+x 变小写Ctrl+Shift+Y
添加注释 Ctrl+Shift+/
除去注释 Ctrl+Shift+\

2、Debug的使用
断点调试模式
(1)跟踪程序的运行状态;(2)方便查看程序的源代码.
设置断点:双击该行
Step Over : 跳过 F6
Resume:跳到下一个断点 如果没有 程序执行结束. F8
Step Into : 跳入(压栈) F5
Drop to Frame:回到方法的最定端
Step Return:跳出方法(弹栈) F7
去除断点:
在debug视图中 右上角 breakpoints

3、Junit的使用
测试方法:必须是 public void 不能传入任何的参数 public void demo1(){}

@Test :标识这个方法 需要进行测试.
@Ignore :忽略 这个方法不参与测试.
@Before :标记在每个测试方法之前都会执行
@After :标记在每个测试方法之后都会执行
@BeforeClass:标记 会在测试方法之前执行一次 这个方法必须是static
@AfterClass:标记 会在测试方法之后执行一次 这个方法必须是static

4、JDK5.0新特性
泛型
枚举
静态导入
自动装箱/拆箱
for/in语句(增强for循环)
可变参数
注解、字符串格式化、Java5线程并发库

5、泛型(Generic) —泛形的作用
JDK5以前,对象保存到集合中就会失去其特性,取出时通常要程序员手工进行类型的强制转换

JDK5中的泛形允许程序员使用泛型技术限制集合的处理类型
List<String> list = new ArrayList<String>();

注意:泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛形的java程序后,生成的class文件中将不再带有泛形信息,以此使程序运行效率不受到影响,这个过程称之为“擦除”。

泛形的基本术语,以ArrayList<E>为例:<>念着typeof
ArrayList<E>中的E称为类型参数变量
ArrayList<Integer>中的Integer称为实际类型参数
整个ArrayList<Integer>称为参数化类型ParameterizedType

使用Type-Safe的集合对象
List
Set
Map

泛型的类型转换
List<Integer> ints = new LinkedList<Integer>();
List<Number> nums = new LinkedList<Integer>();

6、自定义泛型——泛型方法
Java程序中的普通方法、构造方法和静态方法中都可以使用泛型。方法使用泛形前,必须对泛形进行声明,语法:<T> ,T可以是任意字母,但通常必须要大写。<T>通常需放在方法的返回值声明之前。例如:
public static <T> void doxx(T t);
练习:
编写一个泛形方法,实现指定位置上数组元素的交换。
编写一个泛型方法,接受任意一个数组,颠倒数组中所有元素
注意:
只有对象类型才能作为泛型方法的实际参数(Integer)。
在泛型中可以同时有多个类型,例如:
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){}
}

注意,静态方法不能使用类定义的泛形,而应单独定义泛形。

7、枚举类
为什么需要枚举?
一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,此类问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决
JDK 5新增的 enum 关键字用于定义一个枚举类
创建枚举格式:
enum 枚举类型名称 {
枚举对象1名称,
枚举对象2名称,
… ,
枚举对象n名称;
}
员工、角色案例

枚举类具有如下特性:
枚举类也是一种特殊形式的Java类。
枚举类中声明的每一个枚举值代表枚举类的一个实例对象。
与java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必须为私有的(这点不难理解)。
枚举类也可以实现接口、或继承抽象类。
JDK5中扩展了swith语句,它除了可以接收int, byte, char, short外,还可以接收一个枚举类型。
若枚举类只有一个枚举值,则可以当作单态设计模式使用。

枚举类API
Java中声明的枚举类,均是java.lang.Enum类的孩子,它继承了Enum类的所有方法。常用方法:
name() 返回枚举对象名称
ordinal() 返回枚举对象下标
valueof(Class enumClass, String name) 转换枚举对象
自定义的枚举类 在编译阶段自动生成下面方法
valueof(String name) 转换枚举对象
values() 获得所有枚举对象数组
思考
枚举对象、枚举对象下标、枚举对象名称表示之间的转换

8、静态导入
JDK 1.5 增加的静态导入语法用于导入类的某个静态属性或方法
使用静态导入可以简化程序对类静态属性和方法的调用。
语法:
Import static 包名.类名.静态属性|静态方法|*
例如:
import static java.lang.System.out;
import static java.util.Arrays.sort;
import static java.lang.Math.*;

9、自动装箱
JDK5.0的语法允许开发人员把一个基本数据类型直接赋给对应的包装类变量, 或者赋给 Object 类型的变量,这个过程称之为自动装箱。
自动拆箱与自动装箱与之相反,即把包装类对象直接赋给一个对应的基本类型变量。
典型应用:
List list = new ArrayList();
list.add(1);
int j = (Integer)list.get(0);

10、for/in语句
引入增强for循环的原因:抛弃Iterator
for/in语句的适用范围
遍历数组
遍历实现Iterable接口的集合类
语法格式:
for(变量类型 变量 :需迭代的数组或集合){

}

11、可变参数
从JDK 5开始, Java 允许为方法定义长度可变的参数
public void foo(int … args){ }
注意事项:
调用可变参数的方法时, 编译器将自动创建一个数组保存传递给方法的可变参数,因此,程序员可以在方法体中以数组的形式访问可变参数
可变参数只能处于参数列表的最后, 所以一个方法最多只能有一个长度可变的参数
可变参数方法的要求
一个方法最多只能有一个可变参数;
可变参数必须是最后一个参数;
可变参数只能出现在方法的形参中,局部变量或属性是不能使用这种东西的。

12、反射
JavaSE中的高级特性
什么是反射?
剖析Java类中的各个组成部分映射成一个个java对象
类 java.lang.Class
java.lang.reflect
构造方法 Constructor
成员变量 Field
方法 Method

反射用在哪里
多用于框架和组件,写出复用性高的通用程序

13、Class类
Java中java.lang.Class类用于表示一个类的字节码(.class)文件

如何得到某个class文件对应的Class对象
已知类和对象的情况下
类名.class
对象.getClass() ---- Object类提供
未知类和对象的情况下
Class.forName(“包名.类名”)

Class类代表某个类的字节码,并提供了加载字节码的方法:forName(“包名.类名”)
forName方法用于加载类字节码到内存中,并封装成一个Class对象

14、Constructor类
Constructor类的实例对象代表类的一个构造方法

得到某个类所有的构造方法
Constructor [] constructors= Class.forName("java.lang.String").getConstructors();

得到指定的构造方法并调用
Constructor constructor = Class.forName(“java.lang.String”).getConstructor(String.class);
String str = (String)constructor.newInstance(“abc”);

Class类的newInstance()方法用来调用类的默认构造方法
String obj =(String)Class.forName("java.lang.String").newInstance();

15、Field类
Field类代表某个类中的一个成员变量,并提供动态的访问权限
Field对象的获得
得到所有的成员变量
Field[] fields = c.getFields(); // 取得所有public属性(包括父类继承)
Field[] fields = c.getDeclaredFields(); // 取得所有声明的属性
得到指定的成员变量
Field name = c. getField("name");
Field name = c. getDeclaredField("name");
设置Filed变量是否可以访问
field. setAccessible(boolean);
Field变量值的读取、设置
field.get(obj)
filed.set(obj,value);

16、Method类
Method类代表某个类中的一个成员方法
Method对象的获得
获得所有方法
getDeclaredMethods()
getMethods()
获得指定的方法
getDeclaredMethod(String name, Class<?>... parameterTypes)
getMethod(String name, Class<?>... parameterTypes)

通过反射执行方法
invoke(Object obj, Object... args)
如果执行static方法 ,第一个参数obj 传入 null