一个workspace可以包含多个project,一个workspace保留了eclipse的一套环境选项的配置,例如,所使用的javac和java命令,等等,细节请查看window->preferences。如果要为eclispe再配置一套环境选项,可以再创建一个workspace。Package explorer视图窗口中的filters菜单项,可以显示空的父包(此功能默认是关闭的)。
Ø 工作空间路径中不要使用空格和中文字符,防止编码导致的诡异问题。
Ø 切换工作间
Ø 导入项目
1.将工程拷贝到工作空间
2.File->Import->General->Existing Projects into Workspace->Import Projects->Browser
Ø 一个Perspective代表了若干个view的集合,如何显示各种view。
Ø 显示窗口:
Window> Show Vew(显示窗口)
Window > Preference > General >ResetPerspective(重置视图)
Ø Eclipse编译器配置
Ø Eclipse的JRE配置
Ø 选择工程,右键->properties可以设置javac,右键->run asàopen run dialog可以设置java。
Ø 快捷键使用技巧:
快捷键的位置:General->keys,设置alt+/键(丁:content a 就会搜索出)进行内容提示时,要注意解除alt+/键原来的绑定关系,直接输入alt+/就可以找到它的绑定关系,删除绑定关系时也可以使用remove binding这个按钮
Ø 代码模板:
代码模板的设置位置:java->editor->Templates
Ø 注意高低版本运行环境与编译环境的配置
内容提示:Alt + /
快速修复:Ctrl + 1
导包:Ctrl + shift + O
进入方法内部Ctrl+左键
向前向后:Alt + 左右方向键
添加块注释 Ctrl+Shift+/
除去块注释 Ctrl+Shift+\
添加/除去行注释 Ctrl+/
复制当前行Ctrl+Alt+上/下(在某些机器上与显卡快捷键冲突)
删除当前行Ctrl+D
查看方法说明F2
Ø 线程堆栈视图
Ø 变量视图
Ø 表达式视图
Ø 局部断点: 在方法上添加的断点!
Ø 观察点: 在成员变量上添加的断点!当访问这个成员,或是修改这个成员时,就会进入断点模式!
Ø 条件断点:当达到某条件时,进入的断点模式就是条件断点
Ø 过滤断点:希望对某些方法可以执行单步进入,对某些类,不执行单步的进入
Ø Junit是一个测试框架,利用它可以在不写main方法的情况下调用被测试方法,从而对方法中的代码进行测试。
Ø 要求:
被测试的方法必须是无参数,非静态,无返回值的公共public方法
Ø 测试过程:
在方法上加上注解:@Test
导入Junit框架jar包
在被测试方法上执行Junit测试
Ø 编写测试用例:
@BeforeClass 在被测试类加载后立即执行,必须是静态的方法
@AfterClass 在被测试类释放前执行,必须是静态的方法
@Before 在测试方法执行前执行
@After 在测试方法执行后执行
Ø Junit测试框架的原理是反射
Ø 可变参数可用来解决一个方法接收的参数不固定的问题,它出现于JDK1.5之后
Ø 可变参数的特点:
1. 只能出现在参数列表的最后
2. "..."出现在变量类型与变量名之间,前后有无空格都行
3. 调用可变参数的方法时,编译器隐含为该可变参数创建了一个数组,可在方法中以数组方式访问该参数!
Ø 可变参数的限制:
1. 一个方法中,只可以定义一个可变长的参数。
2. 可变长的参数,必须要在所有参数的最后。
Ø 由于可变参数的出现,因此Java出现了返回值类型协变的现象!即在Override方法时,返回父类中该方法返回值类型的子类型!详细内容可以参考《thinking in java》
Ø 语法结构:
For((修饰符) Type 变量名 : 集合变量名){...........}
红色部分:表示声明一个Type类型的变量
蓝色部分:可以使数组或实现了Iterable接口的集合类
Ø 增强for循环的缺陷:
1. 不能在遍历时修改值!
2. 不能同时遍历两个平行集合
Ø JDK1.5之后出现的语法,如果编译器是jdk1.5之前版本则不行!
Ø 享元设计模式: 对于Integer类型在一个字节内大小的数字,Java会有缓存!即(-128-->127之间)
示例:Integer num1 = 12;
Integer num2 = 12; 这块相等,<=127都是真的
System.out.println(num1 == num2); //true
Integer num3 = 129; 这块不相等,因为是对象
Integer num4 = 129;
System.out.println(num3 == num4); //false
Ø 枚举也是类,它是用enum声明的类,所有枚举都是Enum的子类。
Ø 枚举默认就是abstract的,不可以实例化。
Ø 枚举中可以拥有abstract抽像方法。
Ø 枚举的所有成员,都默认是public static final类型的。且必须要第一行开始声明。必须在,(逗号)分开。
Ø 所有的枚举,默认都是java.lang.Enum。
Ø Enum类不但是所有枚类。可以通过用户输入的字符串创建一个枚举的实例!
Ø 不可以定义内部枚举或是局部枚举,枚举的公共的基类,还是一个工具举必须是顶层类
Ø 枚举就是让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器会报错!枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
Ø 构造方法私有
Ø 每个元素分别用一个公有的静态成员变量表示
Ø 可以有若干个公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
示例:
************************************************************************************************************************************************************************
public class MyEnum {
public static void main(String[] args) {
WeekDay sun = WeekDay.SUN;
System.out.println(sun.nextDay());
}
//实现星期的枚举类
static abstract class WeekDay{
private WeekDay(){}
public static final WeekDay SUN = new WeekDay(){
@Override
public WeekDay nextDay() {
return MON;
}
};
public static final WeekDay MON = new WeekDay(){
@Override
public WeekDay nextDay() {
return SUN;
}
};
/* //现在想把该方法中的if,else语句转换成每个实现类的方法
public WeekDay nextDay(){
if(this == SUN){
return MON;
} else {
return SUN;
}
}
*/
public abstract WeekDay nextDay();
public String toString(){
return this == SUN ? "SUN":"MON";
}
}
}
************************************************************************************************************************************************************************
Ø 枚举类的values,valueOf,name,toString,ordinal等方法
static 枚举类[] Values:返回枚举中的所有常量
static 枚举类 valueOf(String name) : 根据传递进来的字符串转换成相应的枚举实例
String name(): 返回此枚举常量的名称
int ordinal(): 返回此枚举常量在枚举声明中的位置,从零开始计数
Ø 枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象
Ø 枚举就相当于一个类,可以定义构造方法、成员变量、普通方法和抽象方法!
Ø 枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
Ø 带构造方法的枚举:构造方法必须定义为私有的!
Ø 带有构造方法,抽象方法,成员变量的枚举实例:交通灯
#########################################################################################
public enum TrafficLight{
//三种颜色的交通灯
RED(45){
public TrafficLight next(){
return GREEN;
}
},
GREEN(53){
public TrafficLight next(){
return YELLOW;
}
},
YELLOW(10){
public TrafficLight next(){
return RED;
}
};
//定义一个抽象方法
public abstract TrafficLight next();
//定义一个属性用于控制每个灯亮的时间
private int time;
//枚举的构造方法要私有
private TrafficLight(int time){
this.time = time;
}
}
#########################################################################################
Ø 枚举只有一个成员时,就可以作为一种单例的实现方式。
Ø 一般公司采用下面这种方式实现单例:
public class SingleTon {
private SingleTon(){}
public static SingleTon instance;
static{
instance = new SingleTon();
}
}
Ø 多例类:
是指类的实例的数量有限的类就是多例模式:
#########################################################################################
简单多例代码1: public class Gender {
private Gender(){}
private static Gender MALE;
private static Gender FEMALE;
public static Gender getMale(){
if(MALE == null){
MALE = new Gender();
}
return MALE;
}
public static Gender getFemale(){
if(FEMALE == null){
FEMALE = new Gender();
}
return FEMALE;
}
}
#########################################################################################
多例缓存: public class BaiDu {
/**
* 百度查询天气预报,实现多例缓存
*/
public static void main(String[] args) {
City city1 = BaiDu.getCity("北京");
City city2 = BaiDu.getCity("北京");
System.out.println(city1 == city2);//true
}
private BaiDu(){}
private static Map<String,City> cities = new HashMap<String,City>();
public static City getCity(String cityName){
City city = cities.get(cityName);
if(city == null){
city = new City(cityName);
cities.put(cityName, city);
}
return city;
}
static class City{
private String cityName;
City(String cityName){
this.cityName = cityName;
}
public String toString(){
return cityName;
}
}
}
#########################################################################################
Ø JDK1.5中才出现,是对集合中的元素进行类型限定,将原来可能发生的运行时问题转成编译时问题-即编译时检查。
Ø 泛型是提供给javac编译器使用的,当编译通过,并最终生成class文件以后,将不再带有范型信息,这个过程叫做擦除。
泛型擦除是指,为了兼容JDK1.4.当一个类,拥有泛型,被正确的编译成.class文件以后,泛型信息就已经被擦除了。
Ø 泛型可以定义在方法上也可定义在类上!定义在类上的泛型不可以使用在静态方法中!
Ø 静态方法要自己定义泛型
Ø 泛型不能使用基本类型
Ø ? extends Object 是指可以接收Object及它的子类。
//泛型的向下兼容
private static void print(List<? extends Object> list){
for(Object o : list){
System.out.println(o);
}
}
Ø 用? Super Number方式,必须要接收number或是number的父类。
Ø 注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
Ø 注意class文件并不是字节码,字节码是指类加载器将.class文件加载进内存后形成的二进制文件
Ø 在编译时起限制作用,例如常用的@Override、@OVerload 、@Deprecated
Ø 在运行时给反射使用,例如JUnit测试框架
Ø 注解也是一个类,其默认是java.lang.Annotation的子类。
Ø 注解的特点:
1. 其只有两种类修饰符public、default
2. 可以注解在其他注解上
3. 可以注解在构造、字段、成员变量、局部变量、包、方法、参数、以及类上!
Ø 示例:自定义的简单注解
public @interface MyAnnotation {
}
Ø 通过java.lang.annotation.RetentionPolicy 设置注解的存在范围
CLASS(类范围) |
RUNTIME(运行时范围) |
SOURCE(源代码范围) |
RetetionPolicy:枚举类型 |
Ø 用于设置注解应用在何种元素上,默认可以用于任何元素
Ø 指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。
Ø 注意如果想让注解用在类上:RetentionPilicy.Type
Ø 注解示例2:
#########################################################################################
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//设置注解在运行时也保留
@Retention(value=RetentionPolicy.RUNTIME)
//设置此注解可以应用在构造以及方法上
@Target(value={ElementType.CONSTRUCTOR,ElementType.METHOD})
public @interface MyAnnotation {
}
##################################################################################
@SuppressWarning("Decripted") :Decripted是SuppressWarning的属性值,属性名叫value
用反射进行测试的代码:
if(ReflectPoint.class.isAnnotationPresent(MyAnnotation.class)) {
System.out.println(AnnotationTest.class.getAnnotation(MyAnnotation.class)
);
检查返回的注解对象的类名,发现它其实是一个代理。
----------------------------------
@SuppressWarnings("deprecation")
@MyAnnotation(value="zxx",arrayAttr={3,5,6},lamp=EnumTest.TrafficLamp.GREEN)
public class AnnotationTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.runFinalizersOnExit(true);
if(AnnotationTest.class.isAnnotationPresent(MyAnnotation.class))
{
MyAnnotation myAnnotation = AnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(myAnnotation.color());
System.out.println(myAnnotation.value());
System.out.println(
myAnnotation.arrayAttr().length);
System.out.println(
myAnnotation.lamp().next().name());
System.out.println(myAnnotation.annotationAttr().value());
}
}
@Deprecated
public static void sayHello()
{
System.out.println("hello,传智播客");
}
}
-----------------------------------------------------
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyAnnotation {
String color() default "yellow";
String value() ;
int [] arrayAttr() default {1,2}; //指定缺省值
EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
MetaAnnotation annotationAttr() default @MetaAnnotation("xxx");
}
-----------------------------------------------
public @interface MetaAnnotation
{
String value();
}