(即该对象的地址)的一个引用,而非对象自身的引用。仅仅声明一个对象变量并不给对象分配内存,你必须用“new”关键字来分配内存和创建对象。
这两种方法最根本的不同在于:不可能象在C中那样就Java内存地址做指针
算术或其他操作。Java中对象的地址是相对的(或虚拟的),它由虚拟机任意分配,因此你没有理由还想要指针地址。
E)垃圾收集
垃圾收集自动收集内存中未引用的内存,并将其归回空闲内存链表中。JVM使用此功能将不在使用的内存还给系统。
当Java程序说明并实例化一个对象或数组时,它仅仅做一个JVM请求,访问其下面的系统内存(通常是通过主机操作系统)并分配内存,Java的垃圾收集系统通过内存收集对象,然后检查它们的引用链。Java的垃圾收集系统的工作方式一般是
搜索内存中的对象,然后检查它们的引用表。它计算程序中有多少变量当前正在引用每个对象。若对象的引用数目为零,它知道此对象不再在使用了,它的内存可以收回。其结果就是,不必像你在C语言所作的那样,要人工来释放分配的内存。在C中,释放内存是一个必要、耗时且易出错的细节。Java自动而精确的处理此过程,去除了C/C++程序中那种常见的错误致因。
F)网络
由于今天的嵌入式系统通常都是网络的,采用内置网络支持的语言节约了在实现
网络协议和
通信程序方面耗费的大量时间和努力。在Java中,网络类包括TCP/IP流和使用TCP及UDP的数据报程序,用于HTTP和URL服务的操作方法,以及错误检查代码和恢复功能。
虽然实现网络也可能用其他语言,比如C语言,但那些语言要求特别的附件软件包,DLL,或其他必须由操作系统,或者第三方销售提供程序模块,特别附件通常要求有操作系统或第三方工具的知识,不象Java,有标准的、内置的网络支持。
Java包括网络包出于必要,因为设计者不能对一个作为基础的操作系统的网络设施做任何假定,他们必须得包括集成网络程序库,以确保Java程序能在所有平台上
工作。
G)动态配置
动态配置是指一系统启动时的用户制定配置或重新配置。需载入特殊的硬件配置、网络参数或在引导期间支持特定用途的一些实用程序的系统,常常使用动态配置。
Java以动态捆绑来支持动态配置。当你组成一个程序的各个类文件编译成字节码时,在你的类文件之间,或者对JVM包的类(如图形、网络以及核心语言支持)引用,还没有被解决。当JVM载入你的程序时,它动态的载入并捆绑(即链接)你的
程序引用的所有的类。因此,要改变系统配置,你所需要做的一切就是修正相应的类文件。下一次系统时,JVM自动捆绑新文件到你的程序中,而新的配置将生效执行。
H)异常处理
与许多操作系统和程序不同,对嵌入
系统而言,重新启动通常是无法接受的,就像我们都不希望打电话或者看电视时突然有
技术性的中断一样。这意味着实际上所有嵌入式系统都必须足够坚实以截取错误来防止它们使程序或更糟的是使整个设备崩溃。
程序错误的致因很多。相对来说,很少是因为继承逻辑错误,而大多数程序的崩溃是因为意外输入,或者是因为程序不能调用系统资源来完成某个特定操作。
在Java中,由抛出(产生)一个异常来提示错误。使用专门为异常处理而设计的语句(关键字try、catch、和finally),程序就能将其错误处理代码安排到几个集中区域,try程序块是程序执行的正常流程。当一个异常发生在try块(包括该嵌套块中的各层子程序)中,控制就交给了catch块。不管是否有异常发生,finally块中的代码始终要被执行。未被处理的异常会由调用堆栈自下而上传播JVM并终止程序。你不再需要动手编程,来将错误状态通过几层函数调用返回。而是,在错误发生由检测错误的代码直接抛出一个异常