Java和C++在细节上的差异(二) (二)

2014-11-24 03:03:10 · 作者: · 浏览: 2
ize s : Size.values()) {
31 double d = s.getPricingFactor();
32 System.out.println(s + " Size has pricing factor of " + d);
33 }
34 }
35 /* 结果如下:
36 Small Size has pricing factor of 0.8
37 Medium Size has pricing factor of 1.0
38 Large Size has pricing factor of 1.0
39 ExtraLarge Size has pricing factor of 1.2
40 ExtraExtraLarge Size has pricing factor of 1.2 */
8. 枚举在switch语句中的用法,见如下代码:
1 public enum Color {
2 RED, BLUE, BLACK, YELLOW
3 }
4 public static void main(String[] args) {
5 Color m = Color.BLUE;
6 //case语句中引用枚举常量时不需要再加上枚举的类型名了。
7 switch (m) {
8     case RED:
9 System.out.println("color is red");
10 break;
11 case BLACK:
12 System.out.println("color is black");
13 break;
14 case YELLOW:
15 System.out.println("color is yellow");
16 break;
17 case BLUE:
18 System.out.println("color is blue");
19 break;
20 default:
21 System.out.println("color is unknown");
22 break;
23 }
24 }
9. 和枚举相关的两个容器EnumMap和EnumSet,声明和主要用法如下。
1 EnumMap, V>
2 EnumSet>
3 //Code Example 1
4 public enum State {
5 ON, OFF
6 };
7 public static void main(String[] args) {
8 //EnumSet的使用
9 EnumSet stateSet = EnumSet.allOf(State.class);
10 for (State s : stateSet)
11 System.out.println(s);
12
13 //EnumMap的使用
14 EnumMap stateMap = new EnumMap(State.class);
15 stateMap.put(State.ON, "is On");
16 stateMap.put(State.OFF, "is off");
17 for (State s : State.values())
18 System.out.println(s.name() + ":" + stateMap.get(s));
19 }
20
21 //Code Example 2
22 public enum Size {
23 Small,Medium,Large
24 }
25 public static void main(String args[]) {
26 Map map = new EnumMap(Size.class);
27 map.put(Size.Small, 0.8);
28 map.put(Size.Medium, 1.0);
29 map.put(Size.Large, 1.2);
30 for (Map.Entry entry : map.entrySet())
31 helper(entry);
32 }
33 private static void helper(Map.Entry entry) {
34 System.out.println("Map entry: " + entry);
35 }
10. Java枚举和C++枚举的主要区别为两点,一是C++中的枚举中只能定义常量,主要用于switch子句,二是C++中的枚举常量可以直接和数值型变量进行各种数学运算。

五、反射:

1. Java的反射机制主要表现为四点:
1) 在运行中分析类的能力;
2) 在运行中查看对象;
3) 实现数组的操作代码;
4) 利用Method对象,这个对象很像C++中的函数指针。
注:Java的基于反射的应用主要用于一些工具类库的开发,在实际的应用程序开发中应用的场景较少。
2. 获取对象的名称(字符串形式) vs 通过对象的名称(字符串形式)创建对象实例,见如下代码:
1 public static void main(String args[]) {
2 //1. 通过对象获取其字符串表示的名称
3 Date d = new Date();
       //or Class< extends Date> c1 = d.class;
4 Class< extends Date> c1 = d.getClass();
5 String className = c1.getName();
6
7 //2. 通过字符串形式的名称创建类实例。
8 className = "java.util." + className;
9 try {
10 Class c2 = Class.forName(className);
11 //这里用到的newInstance用于创建c2所表示的对象实例,但是必须要求待创建的类实例
12 //具有缺省构造函数(无参数),很明显newInstance调用并未传入任何参数用于构造对象。
13 Date d2 = (Date)c2.newInstance();
14 } catch (ClassNotFoundException e) {
15 e.printStackTrace();
16