Enum

[size=large] http://blog.sina.com.cn/s/blog_6c19162301014yuj.html
一、Eclipse集成开发环境:
Eclipse :2011年11月,IBM投资4000万美元贡献给开源社区。Eclipse 是支持多语言的开发平台。它的价值是为可扩展的集成开发环境提供了一个开放源码平台,这个平台允许任何人构建与环境和其他工具无缝集成的工具(插件)。Eclipse除了一个小型的运行时核心之外,其余的都是插件。
IDE:Integrated Development Environment,集成开发环境。
常见java英文缩写:
JDK:Java Development Kit,编写Java程序的程序员使用的软件。
JRE:Java Runtime Environment,运行java程序的用户使用的软件。
SE:Standard Edition,用于桌面或简单的服务器应用的java平台。
EE:Enterprise Edition,用于复杂的服务器应用的Java平台。
ME:Micro Edition,用于微型手机Cell phone和其他小型设备的Java平台。
J2:Java 2,一个过时的术语,用于描述1998年——2006年之间的Java版本。
SDK:Software Development Kit,一个过时的术语,用于描述1998年——2006年之间的JDK。
u:Update,Sun的术语,用于发布修改的bug。
NetBeans:Sun的集成开发环境。
MyEclipse:其实就是Eclipse的一个插件(plugin),主要用于Java web开发。
JDT:开发java所需要的插件。
CDT:开发C和C++所需要的插件。
Perspective:透视图(也叫视角);将某些有联系的小窗口组成的集合叫做透视图。想要显示这些小窗口只要切换到这个透视图下就可以了,不必一个一个窗口的调用。

Content Assist:内容助理;ALT+/;

在Eclipse里面如何调试查看一个变量的值?
1,debug as:在Debug透视图进行调试。
2,选中要调试的变量,右击选择Watch。

import:导入一个类或者某个包中的所有类。
import static:导入一个类的某个静态方法或者所有静态方法。

Eclipse插件安装方法:
1.拷贝安装。
2.Links安装:eclipse目录下创建links目录>>在links下创建link文件(文本就行),指定插件路径。path=D:/Plugins-Download/GEF-All-3.1;一个link文件里面可以添加多个path。
3.Update安装。只要知道插件的更新地址就行。Help>>software update>>find and install>>选择“search for new features to install”>>next >>“New Renote Site”,添加新的站点后,按eclipse更新向导就可以完成插件安装了。
查看插件:Help >>About Eclipse SDK>>Plug-in Details

Eclipse常用来开发java项目。一下是关于java的一些概念:
Java程序语言:是目前最先进的面向对象编程语言,它的语法和C语言相当类似。
Java虚拟机:或称java解释器(interpreter),是java安装系统最重要的一部分,java程序被设计成具有可移植性,但也只能在安装了java解释器的平台上运行。
Java平台:所有使用java语言编写的程序都必须依赖构成java平台的预定义类集合才能顺利运行。即:预定义类的集合(就像我们常用的Java SE中的那些包和类的集合)。

二、JDK 5.0(代号:Tiger)中的一些新特性:
5.0中引入了可变参数:
invoke(Object obj,Object... args)
1.4中使用的还是数组:
invoke(Object obj ,Object[] args)

为了兼容1.4版本,如果在向invoke中传入的对象是一个数组类型的时候,我们要么再加一层数组嵌套,要么利用强制转换告诉jvm这里是一个对象。因为如果没有特殊处理的话,jvm将按照1.4的方法处理,即把数组拆开!

MethodCharAt.invoke(str,new Object[]{new int[]{2}});
MethodCharAt.invoke(str,(Object)new int[]{2});

可变参数特点:
1,只能出现在参数列表的最后;
2,... 位于变量类型和变量名之间,前后有无空格都可以。
3,调用可变参数的方法时,编译器为该可变参数隐含创建了一个数组,在方法中以数组的形式访问可变参数。
由于可变参数这个特性是在jdk5.0出现的,所以为了兼容老版本,在使用可变参数时,如果我们希望传入的是一个数组,那么jvm会把这个数组拆开,为了避免这样的情况我们可以,在这个数组外面再加一层数组或者申明这个数组是Objecct的。
Example:
在反射中我们用到的这段代码:
MethodCharAt.invoke(str,new Object[]{new int[]{2}});
MethodCharAt.invoke(str,(Object)new int[]{2});

增强for语句(for\in or foreach):
5.0出现的新特性。格式:for(type variableName : variabaleSet){...}

注意事项:
1,迭代的变量必须在()中定义;
2,集合变量可以是数组集合或实现了Iterable接口的集合类。

注释快捷键:ctrl+shift+/ ;
取消注释快捷键:ctrl+shift+\ ;

如何获得新的知识?去oracle官网下载最新JDK的语言规范(langspec)
英语词汇:specification 规范,明确说明,说明书。

自动装箱:基础数据类型(primitive data type)——>相应的对象。
Integer iObj = 12;

自动拆箱:对象——>相应的基础数据类型。
sop( iObj + 12 );

java中在创建一个小于127的Integer对象时,先到缓冲池中去找有没有一个一样的对象,如果没有就创建一个,如果有直接指向那个对象,这是因为小于127的比较常用,所以可以节省内存资源,这里使用了享元设计模式。

强调:Integer小于127的如果内存中存在相同的,就不再建立新的对象。

享元模式(flyweight):如果有很多很小的对象,我们会经常用到,用的时候该对象的内部状态都没有变化,那么就可以把他变成一个对象。那些不同的属性把它变成方法的参数(外部状态),那些相同的属性叫内部状态。

Alt+shift+x:运行;
Alt+shift+x j:运行java Application;

三、枚举类型:
枚举类型:定义一种类型变量,它指向的值都是固定的。这些值称作枚举的元素,这些元素可以是这个枚举类或者其子类的一个实例对象。该类型的取值只可以是这些元素和null。

在没有枚举类型以前我们是怎样实现枚举的功能的呢?

下面是我们模拟枚举类型的一个事例:
package cn.itcast.day1;

public abstract class WeekDay1 {
private WeekDay1() {
}

public final static WeekDay1 SUN = new WeekDay1() {

@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return MON;
}

};
public static final WeekDay1 MON = new WeekDay1() {

@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return MON;
}

};

public abstract WeekDay1 nextDay();


public String toString() {
return this == SUN ? "SUN" : "MON";
}
}

JDK 5.0后,我们可以怎样做:
public enum WeekDay {
SUN, MON, TUE, WED, THU, FRI, SAT
}

就像类和接口一样,enum关键字定义了一个新的引用类型。这些值就像static final字段一样(这就是为什么它们的名称一般用都大写来表示),WeekDay可以被指定为这七个值中的任意一个和null,但是不能是其他值。

思考:在刚接触到枚举的时候我很不解,既然我们可以自己构造一个和枚举功能相当的类,那么JDK在枚举的升级是不是就是简化操作和代码的升级呢?其实不然,简化操作是一方面,其实更重要的是提供了类型安全性。在5.0之前,我们会可能会使用int 型的1来表示SUN,剩下的以此类推,但是当我们应用weekday时,给一个weekday变量赋值的时候我们如果赋予的是一个大于7的值,那么编译是不会报错的。
5.0以前:
public static final int SUN = 1;
如果我们在另外一个地方引用SUN时:
正确的:int day = WeekDay.SUN;
错误但不会报错:int day = 45;
如果打印某个枚举类型,打印出来的就是枚举的字符串本身,与name()方法获得的一样。

下面是交通灯的一个枚举事例:

public enum TrafficLamp {
Red(25) {
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return Green;
}
},
Yellow(5) {
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return Red;
}
},
Green(30) {
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return Yellow;
}
};
public abstract TrafficLamp nextLamp();

private int time;
//定义枚举类的构造方法时,必须是私有的。
private TrafficLamp(int time) {
this.time = time;
}

注意思考:枚举只有一个成员时,就可以作为单例的实现方式。

下面是引自《Java in a Nutsbell》中必须知道的enum特性,以了解及更有力的使用它们:
1. 枚举没有公共的构造函数,枚举类型唯一的实例就是这些枚举声明。
2. 枚举类型不是Cloneable,所以无法为现有的实例创建副本。
3. 枚举类型实现了java.io.Serializable,所以它们可以被序列化,但java的序列化机制会特别处理它们,以确保不会有新的实例被创建。
4. 枚举类型的实例是永远都不会变的:每一个枚举类型值都会保留它自己的特性。
5. 枚举类型的实例是存储于类型本身的public static final字段里,因为这些字段为final,所以它们不可能被不恰当的值改写。
6. 依照惯例,枚举类型的值都是使用大写字母来编写,就和其他static final字段一样。
7. 因为有一个严格限制的具有不同枚举值的集合,所以使用“==”运算符比较枚举值来代替调用equals() Method 一定是安全的。
8. 然而,枚举集合的确有个可行的equals() method。该method在内部使用==而且他被定义为final,所以他无法被覆盖。这个可行的equals() method允许枚举值被用作类似Set、List与Map Collection的成员。
9. 枚举类型有个可行的hashCode() method,与它们的equals() method一致。和equals()一样,hashCode()也被定义为final的。它允许枚举值配合类似java.util.HashMap这样的类一起使用。
10. 枚举类型实现了Java.lang.comparable,而且compareTo() method会依它们出现在enum声明里的顺序来排序枚举值。
11. 枚举类型包括了可行的toString() method,他会返回枚举值的名称。例如,WeekDay.SUN.toString()在默认情况下会返回“SUN”字符串,此method并没有被定义为final,enum类型可以依选择提供custom implementation。
12. 枚举类型提供了一个静态valueOf(),它与默认的toString()相反。把一个字符串变成一个枚举对象:static valueOf() Method。
13. ordinal():获得这个枚举类的index(从0开始的)。
14. 静态的values() method,返回一个包含完整元素的数组。
15. 枚举类型是java.lang.Enum的子类,他是在java5.0出现的(Enum 本身并不是枚举类型)。你不能以手动方式扩展Enum类以产生枚举类型,如果试图这样做,那么会产生变异错误。定义枚举类型的唯一方式就是使用enum关键字。
16. 要扩展枚举类型是不可能的。枚举类型实际上是final,但final关键字在它们的声明里是不必要且不被允许的!因为enum实际上是final,所以它不会是abstract。
17. 和类一样,枚举类型可以实现接口。

在5.0以后,switch语句除了支持byte、short、int和char外,还支持enum(枚举)。
如果switch表达式被判定为null,会抛出空指针异常(NullPointException)。使用null作为case的值是不合法的!可以try!而且在switch中使用枚举,一般要将default:子句包含进来,不然编译器会产生-Xlint警告信息,好让你知道你没有编写程序代码来处理枚举类型所有的可能值,即使你的每一个枚举都写了一个case时,也要将defaul:子句加进来,这可以处理在你的switch语句编译完成之后,有新的值被加入枚举类型的情况。
所以,在switch中使用枚举时,都要记得加default:子句。[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值