枚举类(class classname):
为了让编译器能自动检查某个值在枚举的集合内,并且,不同用途的枚举需要不同的类型来标记,不能混用,我们可以使用enum来定义枚举类:
enum Weekday
{
SUN, MON, TUE, WED, THU, FRI, SAT;
}
public static void main(String[] args)
{
Weekday day = Weekday.WED;
if (day == Weekday.SAT || day == Weekday.SUN)
System.out.println("Work at home!");
else
System.out.println("Work at office!");
}
注意到定义枚举类是通过关键字enum实现的,我们只需依次列出枚举的常量名。和int定义的常量相比,使用enum定义枚举有如下好处:
- enum常量本身带有类型信息
- 不可能引用到非枚举的值,因为无法通过编译
- 不同类型的枚举不能互相比较或者赋值,因为类型不符
enum的比较:
使用enum定义的枚举类是一种引用类型。引用类型比较,要使用 equals() 方法,如果使用比较,它比较的是两个引用类型的变量是否是同一个对象。因此,引用类型比较,要始终使用 equals() 方法,但 enum 类型可以例外,因为 enum 类型的每个常量在 JVM 中只有一个唯一实例,所以可以直接用 = = == == 比较
enum类型:
enum定义的类型就是class,只不过它有以下几个特点:
- 定义的enum类型总是继承自java.lang.Enum,且无法被继承
- 只能定义出enum的实例,而无法通过new操作符创建enum的实例
- 定义的每个实例都是引用类型的唯一实例
- 可以将enum类型用于switch语句
编译后的enum类和普通class并没有任何区别,因为enum是一个class,每个枚举的值都是class实例,因此,这些实例有一些方法: - name(): 返回常量名,例如:
String s = Weekday.SUN.name(); // "SUN"
- ordinal():返回定义的常量的顺序,从0开始计数,改变枚举常量定义的顺序就会导致ordinal()返回值发生变化,例如:
int n = Weekday.MON.ordinal(); // 1
结构体(struct structname):
结构体也相当于把几种数据类型组合起来。结构体是值类型,赋值时会直接复制
定义:
struct example //方法一:声明结构体
{
int num;
};
struct stu //方法二:声明同时定义变量 stu1、数组 stu2
{
int name;
}stu1,stu2[20];
struct //方法三:没有类型名,只需要下面直接定义的俩变量
{
char* name;
} temp1,temp2;
共用体(union unionname):
概念:
用同一段内存存放不同类型的变量,也就是使用覆盖技术,后一个数据覆盖前面的数据,使几个不同的变量共享同一段内存的结构成为共用体。往往在数据处理中,有时需要对同一段内存空间安排不同的用途,这时用共用体类型比较方便
定义:
struct MyStruct
{
long num;
float score;
char name[20];
int age;
struct MyStruct *netx;
};
MyStruct.num; //使用:直接通过结构体名.成员变量访问
特点:
- 共用体与结构体非常相似,结构体变量所占内存长度等于各个成员占内存长度的和,每个成员分别占有自己的内存,而共用体变量所占内存长度等关于最长的成员的长度
- 同一段内存可以存放几种不同类型的成员,但每一瞬间只能存放其中一个成员
- 可以对共用体变量初始化,但初始化表中只能有一个常量
- 共用体变量中起作用的是最后一次被赋值的成员变量
- 共用体变量的地址和它的各个成员的地址都是同一地址
- 不能对共用体变量名赋值,也不能企图引用变量名来得到一个值
- 共用体类型可以出现在结构体类型定义中,也可以定义共用体数组,反之也可以