`

Java和C++中的static

阅读更多

原文地址:http://hi.baidu.com/aezealer/blog/item/fb8fdd438113c8169213c6c5.html

 

在Java程序中,很多main方法前面都会被标记上static修饰符。现在,我们要讨论一下static这个修饰符在Java和C++这两中语言中的含义。

术语“static”有段不寻常的历史。起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。在C中static实际通常有两种含义:一是在声明局部变量时,表示该局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有的值,就是上一次函数调用结束时的值;另一种含义是表示不能被其他文件访问的全局变量和函数。后来,C++重用了这个关键字,并赋予它一种新的含义:表示属于一个类而不是属于此类的任何一个特定对象的变量和函数。这种含义同在Java中是一样的。

首先先说一下这个修饰符的具体含义。当我们在设计一个类时,类中的有些字段或方法,并不是其每个对象都要实现一个拷贝的。

例如在Java中,当我们定义一个Employee时:

classEmployee
{
    ……
    privateintid;
    privateintnoOfEmployee=1;
}

这样定义一个类后,每一个雇员有一个ID号码,和一个雇员数。但实际雇员数是没有必要在每个雇员中都保留一份的。对于一个类Eemployee只需一个雇员数就可以了。而且每一个雇员有一个雇员数,当雇员数变化时,还要更新每一个雇员内的字段,比较麻烦。而static正式解决这个问题的一种方法。无论在Java还是在C++中,若将一个数据成员还是方法声明为staic。无论类有多少个实例,这个数据成员或方法只有一个。下面,我们在Java和C++中分别讨论它。

在Java中,静态变量并不常见,最长使用的是静态常量。如在Math类中定义了一个静态常量。

publicclassMath
{
    ……
    publicstaticfinaldoublePI=3.14159265358979323846;
    ……
}

在程序中可以使用Math.PI来访问此常量。如果关键字static被省略,那么PI则是Math类的一个实例字段。也就是说如果要访问PI,需要通过Math类的一个对象,而且每个对象都有自己的一份PI拷贝。

在C++中,静态数据成员通常放在类的内部实现部分中定义。定义时,需要用类名引导。在对静态数据成员访问时,使用类名或对象名都可以。通常静态数据成员用的较多的场合为:

·用于保存流动变化的对象个数。

·作为一个标记,指示一个特定的动作是否发生。

·一个指向一个链表第一个或最后一个成员的指针。

无论在Java中还是在C++中,静态方法是不向对象施加操作的方法。可以把静态方法看作是没有this参数的方法(在C++中即为没有this成员指针的函数)。因为静态方法并不操作对象,所以不能用静态方法类访问实例字段。但是它可以访问自身类中的静态字段。

通常在以下良两种情况下需要使用静态方法:1.该方法不需要访问对象的状态,其所需的参数都通过显示参数提供。2.该方法只需要访问类的静态字段。

静态方法在Java中还有另外一个用途是工厂方法。工厂方法用于产生同一类的对象。许多工厂方法如:

NumberFormate.getNumberInstance()

NumberFormate.getCurrencyInstance()

这些方法都是使用类,而不是对象去调用它们,因此都是静态方法。还有,Java中的main方法也是静态方法。Main方法并不地任何对象施加操作。事实上,程序开始执行时还不存在任何对象。静态main方法执行并构造程序所需的对象。

总之,static解决了如何处理那些属于类但不属于对象的变量或方法的问题。无论在Java中还是在C++中,其功能基本上是相同的。有差异的不过是语法上的表现。
================================
Java中的泛型与C++模板的比较2007年09月18日星期二17:00
泛型本质上是提供类型的"类型参数",它们也被称为参数化类型(parameterizedtype)或参量多态(parametricpolymorphism)。其实泛型思想并不是Java最先引入的,C++中的模板就是一个运用泛型的例子。

GJ(GenericJava)是对Java语言的一种扩展,是一种带有参数化类型的Java语言。用GJ编写的程序看起来和普通的Java程序基本相同,只不过多了一些参数化的类型同时少了一些类型转换。实际上,这些GJ程序也是首先被转化成一般的不带泛型的Java程序后再进行处理的,编译器自动完成了从GenericJava到普通Java的翻译。

GJ程序的语法在表面上与C++中的模板非常类似,但是二者之间有着本质的区别。

首先,Java语言中的泛型不能接受基本类型作为类型参数――它只能接受引用类型。这意味着可以定义List<Integer>,但是不可以定义List<int>。

其次,在C++模板中,编译器使用提供的类型参数来扩充模板,因此,为List<A>生成的C++代码不同于为List<B>生成的代码,List<A>和List<B>实际上是两个不同的类。而Java中的泛型则以不同的方式实现,编译器仅仅对这些类型参数进行擦除和替换。类型ArrayList<Integer>和ArrayList<String>的对象共享相同的类,并且只存在一个ArrayList类。

分享到:
评论

相关推荐

    C++库封装JNI接口-实现java调用c++

    在跨平台的软件开发中,有时我们需要在Java和C++之间进行交互,这通常是由于性能需求、使用已有的C++库或特定硬件接口的原因。Java Native Interface (JNI) 是Java平台提供的一种机制,允许Java代码和其他语言写的...

    解决Java 和 C++ 程序之间通讯的方法(有图例,含源码)

    总结来说,结合内存映射文件和JNI,开发者能够高效地实现在Java和C++程序间的数据交换,这在多语言混合编程和系统集成中非常有用。然而,这种解决方案需要注意内存管理,防止数据同步问题,并确保正确处理异常和错误...

    JAVA调用C++编写的DLL(C++和JAVA源码)

    在IT行业中,跨语言通信是一项常见的任务,尤其是在Java和C++这样的组合中。Java的跨平台特性与C++的高效性能结合,可以实现许多复杂的系统设计。本篇将详细讲解如何通过Java调用C++编写的DLL(动态链接库)。 标题...

    JAVA调用C++demo

    在IT行业中,跨语言通信是一项常见的需求,Java和C++作为两种不同的编程语言,它们各自在特定领域有着显著的优势。为了充分利用这两种语言的特点,开发者有时需要在Java代码中调用C++编写的库或功能。本篇文章将详细...

    Java调用c++类对象

    在给定的文件列表中,`writeutfLib`可能是一个实现了JNI接口的动态链接库,而`WriteExample`可能是一个Java示例项目,展示了如何在Java中调用`writeutfLib`中的C++类和方法。通过运行这个示例,我们可以看到Java如何...

    非常好用java调用c++ dll文件demo

    Java调用C++ DLL文件是跨语言编程中的一个重要应用场景,特别是在既有Java代码库又有C++动态链接库的情况下。本文将详细讲解如何在Java程序中调用C++编写的DLL文件,以及一个可用的示例。 首先,理解Java与C++交互...

    java调用C++编写的动态库dll

    在`NativeDemo+java代码`压缩包中,应该包含了Java源代码`NativeDemo.java`,以及C++源代码和VS2013工程文件,供你参考和实践。通过学习和实践这个例子,你可以更深入地理解Java如何与C++库进行交互,这在处理底层...

    使用JNI进行JAVA和C++之间的互调

    在这个场景中,你提到的是使用JNI在VS2013环境下,将Java与C++进行互调。 首先,让我们了解一下JNI的基本工作原理: 1. **定义Java方法:** 在Java类中,你需要声明一个native方法,这意味着它的实现将在本地代码...

    java调用c++生成so库

    压缩包文件的文件名称列表中的"jniso"可能是一个示例项目,包含了一个名为"mylib"的C++编译生成的SO库,以及可能的Java源代码和相关的JNI头文件。通过分析这些文件,你可以进一步学习和实践Java调用C++的过程。

    Java调用C++类库--JNI

    通过学习和理解这些知识点,开发者可以有效地利用JNI在Java应用中整合C++的高性能计算或其他功能,同时注意避免潜在的问题,如内存管理和性能瓶颈。在实际项目中,这通常涉及到对Java和C++的深入理解,以及对JNI API...

    java调用C++写的dll的实例

    在实际项目中,需注意处理好数据类型的转换,确保Java和C++之间的数据传递正确无误。同时,考虑到不同操作系统的差异,如Linux下的SO库和Windows下的DLL,确保库文件在目标平台上可正确加载和运行。

    aes加解密算法(java和c++互通)

    在Java和C++之间实现AES加解密算法的互通,是跨平台通信和数据保护的重要环节。以下是对这个主题的详细阐述: ### AES算法原理 AES是由NIST(美国国家标准与技术研究所)在2001年采纳的标准,它基于Rijndael算法,...

    在Qt平台C++和Java代码的交互

    此外,注意线程同步,因为Java和C++可能在不同的线程环境中运行。 总结来说,Qt平台上的C++与Java代码交互涉及到JNI接口的使用,包括C++函数的声明、Java方法的调用、动态库的加载以及在Qt项目中的整合。熟练掌握...

    JAVA调用C++/C#的DLL

    在IT行业中,跨语言通信是一项常见的需求,尤其是在Java与C++或C#之间。标题"JAVA调用C++/C#的DLL"涉及到的技术点主要集中在Java Native Interface(JNI)上,这是一种允许Java代码与其他编程语言(如C++或C#)进行...

    swig--在java、C#中调用c++写的DLL(以vs2012配置为例)

    标题中的“swig”是指Software Interface Generator,它是一个开源工具,用于将C和C++代码与多种编程语言(如Java和C#)互操作。在本案例中,我们将探讨如何利用SWIG在Java和C#中调用由C++编写的动态链接库(DLL)。VS...

    Java调用C++的dll之-C++工程

    在IT行业中,跨语言通信是一项常见的任务,尤其是在Java和C++这两个广泛应用的编程语言之间。本文将深入探讨如何使用Java通过JNI(Java Native Interface)来调用C++编写的动态链接库(DLL)方法,以实现Java与C++的...

    java调用c++生成dll

    在Java编程环境中,有时我们需要利用C++库的功能,但Java本身并不直接支持C++代码的调用。这时,我们可以借助JNI(Java Native Interface)来实现Java与C++之间的交互。JNI提供了一种标准的方式,让Java代码能够调用...

    java调用C和C++

    ### Java调用C和C++的关键技术:JNI详解 #### 一、引言 随着软件开发领域的不断发展,跨语言编程已成为一种趋势。Java作为一种广泛使用的编程语言,因其平台无关性而受到开发者的青睐。然而,Java为了保持其跨平台...

    用JNI实现java和C++的相互调用

    在Java编程环境中,有时我们需要利用C或C++的高性能特性,这时可以借助Java Native Interface (JNI) 进行Java和C++之间的交互调用。JNI允许Java代码调用本地(非Java)代码,并且反之亦然。下面我们将详细介绍如何用...

Global site tag (gtag.js) - Google Analytics