您现在的位置: 主页 > 上位机技术 > JAVA > Java和C++在细节上的差异(二)
本文所属标签:
为本文创立个标签吧:

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

来源:网络整理 网络用户发布,如有版权联系网管删除 2018-08-19 

上一篇文章为大家介绍了《Java和C++的差异第一部分》,在这篇文章中我们继续解开其中的奥妙。

四、枚举:

枚举的是在Java 1.5SE 中开始支持的,以下为Java枚举的基本概念和应用技巧:

1. 所有的enum对象均是由class对象作为底层支持的,该对象继承自JDK中的Enum,但是该底层类确实final类,既不能再被其他的类继承。

2. 枚举的出现完全替代了原有的public static final常量表示法,枚举以一种更加合理、优雅和安全的方式替换了原有的方案。其最基本的声明方式如下:

3. Enum中构造函数的原型为protected Enum(String name, int ordinal),自定义的枚举对象会将自身的名字以字符串的形式,同时将自己在整个常量从声明的顺序作为超类构造函数的两个参数传给超类并由超类完成必要的初始化,如:RED枚举常量将调用super(RED,0)。

4. 枚举中可以定义构造函数、域方法和域字段,但是枚举中的构造器必须是私有(private)的,如果自定义枚举中有了自定义的构造函数,那么每个枚举常量在声明时必须按照自定义构造函数的规则传入参数。枚举对象的构造函数只是在枚举常量对象声明的时刻才调用一次,之后再也不能像普通对象那样通过new的方法创建,见如下代码:

注:枚举常量列表必须写在最前面声明,否则编译器报错。

5. 可以给自定义枚举添加域方法,见如下代码:

6. 枚举中常用域方法:

7. 在枚举中可以声明基于特定常量的类主体,见如下代码:

8. 枚举在switch语句中的用法,见如下代码:

9. 和枚举相关的两个容器EnumMap和EnumSet,声明和主要用法如下。

10. Java枚举和C++枚举的主要区别为两点,一是C++中的枚举中只能定义常量,主要用于switch子句,二是C++中的枚举常量可以直接和数值型变量进行各种数学运算。

五、反射:

1. Java的反射机制主要表现为四点:

1) 在运行中分析类的能力;

2) 在运行中查看对象;

3) 实现数组的操作代码;

4) 利用Method对象,这个对象很像C++中的函数指针。

注:Java的基于反射的应用主要用于一些工具类库的开发,在实际的应用程序开发中应用的场景较少。

2. 获取对象的名称(字符串形式) vs 通过对象的名称(字符串形式)创建对象实例,见如下代码:

如果需要通过调用带有参数的构造函数来创建对象实例,需要使用java.lang.reflect.Constructor对象来完成,见如下代码:

3. 遍历一个未知类型的所有域、构造方法和域方法,见如下函数原型:

Field[] getFields(); 返回指定对象域字段数组,主要包含该类及其超类的所有公有(public)域。

Field[] getDeclaredFields();返回指定对象域字段数组,主要包含该类自身的所有域,包括private等。

Method[] getMethods(); 返回指定对象域方法数组,主要包含该类及其超类的所有公有(public)域方法。

Method[] getDeclaredMethods();返回指定对象域方法数组,主要包含该类自身的所有域方法,包括private等。

Constructor[] getConstructors(); 返回指定对象构造函数数组,主要包含该类所有公有(public)域构造器。

Constructor[] getDeclaredConstructors();返回指定对象构造函数数组,主要包含该类所有域构造器。

int getModifiers(); 返回一个用于描述构造器、方法或域的修饰符的整型数值,使用Modifier类中的静态方法可以协助分析这个返回值。

String getName(); 返回一个用于描述构造器、方法和域名的字符串。

Class[] getParameterTypes(); 返回一个用于描述参数类型的Class对象数组。

Class[] getReturnType(); 返回一个用于描述返回值类型的Class对象。

4. 通过反射编写泛型数组代码,见如下代码比较:

5. 在运行时使用反射的对象或动态调用反射之后的方法。

1) 获取域字段和设置域字段:

2) 通过Method的invoke函数动态调用反射后的方法:

该方式有些类似于C#的委托(delegate)和C++的函数指针。

6. C++自身并没有提供像Java这样完备的反射机制,只是提供了非常简单的动态类型信息,如type_info和typeid。然而在一些C++的第三方框架类库中提供了类似的功能,如MFC、QT。其中MFC是通过宏的方式实现,QT是通过自己的预编译实现。在目前的主流开发语言中,也只有C#提供的反射机制可以和Java的相提并论。



              查看评论 回复



嵌入式交流网主页 > 上位机技术 > JAVA > Java和C++在细节上的差异(二)
 构造 对象 枚举

"Java和C++在细节上的差异(二)"的相关文章

网站地图

围观()