导航:首页 > 操作系统 > android智能指针

android智能指针

发布时间:2022-09-28 01:47:07

‘壹’ android有什么好的技术点适合进行技术分享

  1. 进程间通信的Binder机制。FrameWork 层的核心。

  2. JNI 的使用。FrameWork 层的基石,几乎整个 FrameWork 层都是通过 JNI 实现对 Library 层调用的。

  3. Material Design 设计。传说中设计师导向型的 UI 风格。

  4. OpenGL ES 3.1 ,Android 5.0开始提供 java 接口和原生支持。

  5. 低功耗蓝牙(貌似从4.3开始支持)。

  6. Android 5.0提供的 JobScheler API。允许通过为系统定义要在以后的某个时间或特定条件下异步运行的任务,优化电池寿命。

  7. Zygote 进程。FrameWork 层的祖宗,所有的 app 进程以及系统服务进程都是 zygote fork 出来的。不然怎么会叫 zygote 呢。

  8. Android Netd。Android 中网络守护进程,通过封装各种底层协议,隔离底层网络接口的差异,给 FrameWork 层提供统一接口服务。

  9. Vold: Volume Daemon, 用于管理和控制 Android 平台外部存储设备的后台进程,这些管理和控制,包括 SD 卡的插拔事件检测、 SD 卡挂载、卸载、格式化等。

  10. Rild: Radio Interface Layer Daemon, 用于智能手机的通信管理和控制的后台进程,所有和手机通信相关的功能,例如接打电话、收发短信/彩信、 GPRS 等都需要 Rild 的参与。

  11. Surface 系统。你会明白 Activity 是如何完成界面绘制的。

  12. 有 Zygote fork 出来的 SystemServer 。Android 中几乎所有的核心服务(ActivityManagerService、WindowManagerService 等)都存在于 SystemServer 中。

  13. 智能指针。所有 Android 源码剖析的书必讲的一个。

‘贰’ android平台下怎么使用智能指针

Android中定义了两种智能指针类型,一种是强指针sp(strong pointer),一种是弱指针(weak pointer)。其实成为强引用和弱引用更合适一些。强指针与一般意义的智能指针概念相同,通过引用计数来记录有多少使用者在使用一个对象,如果所有使用者都放弃了对该对象的引用,则该对象将被自动销毁。

‘叁’ OpenCV(二)掩码操作与平滑(均值,高斯模糊)

OpenCV知识总结来到了下一个难度高一点的,掩码操作和模糊效果,这是图像处理里面常见的操作。
如果遇到问题请在这里联系我: https://www.jianshu.com/p/67324fb69074

掩码操作实际上思想上很简单:根据一个掩码矩阵(卷积核)重新计算图像中的每一个像素。掩码矩阵中的值表示近邻像素的值(包括自身像素的值)对新像素的值有多大的影响,从数学上观点看来,就是对掩码矩阵内每一个设置好权重,然后对对应的像素领域内做一个权加平均。

卷积是什么?用一个简单的公式来表示:

本质上,卷积就是这种思想。卷积把万事万物看成一个输入,当万事万物的状态出现了变化,则会通过某种系统产生变化,变成另一种输出状态。而这个系统往往就在数学眼里就叫做卷积。

而在深度学习中,往往每一个卷积核是一个奇数的矩阵,做图像识别的时候会通过这个卷积核做一次过滤,筛选出必要的特征信息。

那么掩码操作在数学上是怎么回事?我们平常运用掩码做什么?在OpenCV中掩码最常见的操作就是增加图片对比度。对比度的概念是什么,在上一节聊过,通俗来讲就是能够增强像素之间的细节。我们可以对对每个像素做如下操作:

可能这幅图,理解起来比较困难。实际上流程如此:

举个例子,就以计算出掩码矩阵之后的E的位置,能看到此时是原图中所有的像素都会取出和掩码矩阵一样大小的矩阵。也就是取出原图的红色那一块的领域,分别对E周边包括自己做了一次加权处理,最后赋值回E中。

并且进行如下的权加公式:

这样就能对原来的矩阵进行掩码处理。但是这么做发现没有,如果我们要对A做掩码处理就会发现掩码矩阵对应到原图的位置不存在。现在处理有两种,一种是不对边缘的像素做掩码处理,另一种是为周边的图像做一个padding处理,这种操作在深度学习的图像处理中很常见,通常设置0像素,或者拷贝对边的边缘像素。

能看到这里处理和卷积处理不太一样,只是为了方便,把这种掩码滤波操作称为一种核,是自相关,并不是去计算卷积。

能看到此时这两张图片的对比度有很明显的区别。经过掩码矩阵之后,会发现原图会更加平滑一点,而掩码操作之后会导致整个图片最亮和最暗之间的差距拉大。

从数学公式上来看,当前像素权重为5,周边的点的权重是-1和0.能够发现会对当前的节点加深,同时把周围的像素值减掉,就增加了每一个像素点和周边像素差值,也就是对比度。

当然在OpenCV中,有这么一个函数filter2D,处理掩码操作。

这里创建一个3*3的核。这个核实际上就是上图的那个。这样传递一个掩码矩阵和图像的深度就完成了掩码操作。

平滑也称为模糊,是一项高频率使用的操作。
平滑的作用有很多,其中一项就是降噪音。平滑处理和掩码操作有点相似,也是需要一个滤波器,我们最常用的滤波器就是线性滤波器。线性滤波处理的输出像素值 是输出像素值 的权加和:

其中,h(k,l)成为核,它仅仅只是一个权加系数。图形上的操作和上面的图相似。不妨把核当成一个滑动窗口,不断的沿着原图像素的行列扫动,扫动的过程中,不断的把路过像素都平滑处理。

这里先介绍均值滤波器,它的核心如下:

这里的参数意思是,src:输入的图像,dst:经过均值模糊之后的输出图像,Size:是指这个滤波器的大小,Point是指整个图像模糊绕着哪个原点为半径的进行处理,传入(-1,-1)就是指图像中心,这样就能模糊整个图像。

其计算原理很简单就是,把核里面的所有权重设置为1,最后全部相加求平均值。最后赋值到原来的像素上。

最有用的滤波器 (尽管不是最快的)。 高斯滤波是将输入数组的每一个像素点与 高斯内核 卷积将卷积和当作输出像素值。

高斯模糊实际上是一个二维的高斯核。回顾一下一维的高斯函数:

那么二维实际上就是,就是在原来的x,y轴的情况下,增加一个z轴的纬度,实际上看起来就像一座山一样。

二维的高斯函数可以表示为:

为了达到达到

其OpenCV的调用方式:

这里的参数意思是,src:输入的图像,dst:经过高斯模糊之后的输出图像,Size:是指这个滤波器的大小。sigmaX和sigmaY分别指代的是高斯模糊x轴上和y轴上的二维高斯函数的变化幅度。

换个形象的话说,用上图举个例子,就是确定这个高斯函数这个山的x方向的陡峭程度以及y轴方向的陡峭程度。

下面就高斯模糊,均值模糊和原图的比对

能看到,高斯模糊比起均值模糊保留了图像中相关的形状信息。

为什么会这样呢?原因很简单。因为在计算高斯模糊之前,会根据当前像素区域中所有的像素点进行一次,核的计算,越往中心的权重越高,权重如同小山一下,因此中心的像素权重像素一高了,虽然模糊但是还是保留了原来的形状。

但是当高斯模糊的矩阵大小和sigmaX,sigmaY相似的时候,整个高斯函数就不像山,而是想平原一样平坦。换句话说,整个高斯核中的权重就会,偏向一,就会导致和均值模糊类似效果。

高斯模糊计算流程:
图像中某一段图形的像素是如下分布,

这个时候高斯模糊需要一个核去对每一个位置做滤波。此时不同于均值模糊,没有固定的核矩阵,而是通过上面这个矩阵,计算出高斯的核,最后再计算变化后的矩阵每一个对应的像素。

虽然原理是这样,但是实际上OpenCV为了迅速,在原生实现的时候,内部判断到核是小于7的大小,设置一套固定的高斯模糊矩阵。

这样直接就结束,不是我文章的风格,作为一个程序员,还是有必要探索一下,为什么OpenCV计算速度会比我们自己手写的快。

为了让源码看的不那么辛苦,先聊聊OpenCV底层的设计思想。首先在OpenCV中,内置了几种计算方案,按照效率高低优先度依次的向后执行。

这种设计可以看成我们的平常开发的拦截器设计。当发现优先度高的计算模式发现可以使用的时候,OpenCV将会使用这种模式下的算法进行运算。

一般来说,OpenCV内置如下四个层级计算方案,按照优先顺序依次为:

能看到按照这个优先级不断的向下查找,找到当前OpenCV最快的计算环境。除了最后一个之外,其他三个都是并发计算。

记住这个流程,我们查看OpenCV的源码就很轻松了。

先来看看filter2D的源码。

果不其然,在filter2D实现的第一步,就开始调用CV_OCL_RUN宏去调用OpenCL的显卡并发计算。

能看到,这里面发送了一个condition和一个方法到OpenCL中运行。但是如果,OpenCV在编译的时候,我们没有打开这个OpenCL的选项,没有OpenCL的环境的时候,它实际上就是一个没什么用处的宏:

当有了OpenCL的环境,这个宏就会替换成这个:

能清晰的看到,此时会判断当前的OpenCL是否还在活跃,活跃的状态,并且条件和方法符合规范,就会通过CV_IMPL_ADD,把方法添加到一个vector向量中,让OpenCL读取执行。

在这里面,OpenCV想要使用OpenCL进行计算,就需要这个Mat的类型是UMat,并且是纬度小于等于2.当不符合这两个条件将不会执行OpenCL。

UMat是专门给OpenCL规范计算而使用的矩阵。里面有很多和Mat相似的方法。

此时可能是多线程处理,因此会添加一个智能锁,去保证数据的正确性。

具体的思路,将不作为重点,这边先看看OpenCV是传入了ocl_filter2D的方法,看看这个方法在OpenCL中的执行流程。

OpenCL会把命令最后发送到显卡处理。

实际上这一步和上面的方法有点相似。本质上都是获取需要模糊的区域,如果是(-1,-1),则取中心点,接着判断当前滤波对边缘的处理(BORDER_ISOLATED 不去获取Point为圆心设置的模糊之外的区域)。

能看到这个枚举已经解释很清楚了,默认的边缘处理是复制二个和倒数第二个填充边缘。
最后进入到hal的filter2D进一步操作。

能看到这里有四种方式:

在情况1中,一般的情况replacementFilter2D返回的是一个没有实现的错误码,第二种情况是Intel的并行计算库,没有任何研究,跳过。我们来看看第三种情况和第四种情况

当然这里面判断能够使用dft的判断首先要当前必须要整张图做滤波处理,其次是不能是(0,0)的点为圆心做滤波。最后要判断当前当前的cpu指令是否支持,支持则允许核的宽 高最高为130以内使用原生实现,否则只支持核的宽 高为50以内使用原生实现。

能看到这里面的核心就是调用crossCorr,处理核以及原图的矩阵(使用了快速傅立叶处理相关性计算)。最后从同add添加到目标Mat中,由于add的delta函数为0,因此就和替代的效果一致。

能看到此时,先初始化一个FilterEngine(线性滤波引擎),接着使用apply调用滤波引擎的执行方法。

我们来看看线性引擎的创建:

实际上在这个过程中通过makePtr创建一个sharedptr的指针指向FilterEngine,其原理和Android的智能指针相似。

这个引擎不是关键关键的是getLinearFilter,这个方法创建了一个线性滤波器的实际操作对象。

我们来看看这个结构体:
能看到这里面会根据次数传进来的目标矩阵和原始矩阵的位深创建不同的滤波操作者。

假设,我们现在原图和目标图都是8位位深的矩阵,我们只需要关注下面这个构造函数。

Fliter2D结构体持有着模糊中心点,核,原/目标矩阵, 可以猜测到实际上正在做操作的就是这个结构体。

在preprocess2DKernel方法中,Fliter2D把核的相关信息存储到coords,coeffs中

可以看到此时会判断当前的核矩阵中type是什么,接着再把矩阵中每一个不为0的位置设置进coords,像素数值设置到_coeffs。此时相当于把核矩阵展开成一个向量。

能看到此时滤波引擎会先调用FilterEngine__start,再调用FilterEngine__proceed执行计算。
实际上在FilterEngine__start中计算的是本次循环,需要计算的边界。

FilterEngine__proceed中才是正式计算,做dst循环,最后把具体操作丢给线性引擎生成的Fliter2D的方法中。

了解这两个东西我们直接抽出核心看看fliter是如何运作:

‘肆’ c++难学么不学c直接c++可以么

c++其实和c有很大的不同,c++是面向对象的,所以可以不用学c而直接学c++,我觉得这样更容易上手,不容易受c的影响;至于难学,是指里面的指针等内容吧,对于编程语言,只要多看多练,应该都不难掌握的,关键是坚持。

‘伍’ Android系统开发人员选项中指针位置如何实现的

Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析

1、Android
系统的运行时库层代码是用C++来编写的,用C++来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃。不过系统提供了智能指针,避免出现上述问题;
2、在使用C++来编写代码的过程中,指针使用不当造成内存泄漏一般就是因为new了一个对象并且使用完之后,忘记了delete这个对象,而造成系统崩溃。一般就是因为一个地方delete了这个对象之后,其它地方还在继续使原来指向这个对象的指针。
3、为了避免出现上述问题,一般的做法就是使用引用计数的方法,每当有一个指针指向了一个new出来的对象时,就对这个对象的引用计数增加1,每当有一个指针不再使用这个对象时,就对这个对象的引用计数减少1,每次减1之后,如果发现引用计数值为0时,那么,就要delete这个对象了,这样就避免了忘记delete对象或者这个对象被delete之后其它地方还
在使用的问题了。
4、如何实现这个对象的引用计数呢?肯定不是由开发人员来手动地维护了,要开发人员时刻记住什么时候该对这个对象的引用计数加1,什么
时候该对这个对象的引用计数减1,一来是不方便开发,二来是不可靠,一不小心哪里多加了一个1或者多减了一个1,就会造成灾难性的后果。
5、智能指针是一个对象,不过这个对象代表的是另外一个真实使用的对象,当智能指针指向实际对象的时候,就是智能指针对象创建的时候,当智能指针不再指向实际对象的时候,就是智能指针对象销毁的时候。在C++中,对象的创建和销毁时会分别自动地调用对象的构造函数和析构函数,负责对真实对象的引用计数加1和减1的工作就落实到智能指针对象的构造函数和析构函数的身上了,这也是为什么称这个指针对象为智能指针的原因。

‘陆’ android 中什么时候使用弱指针wp

Android中定义了两种智能指针类型,一种是强指针sp(strong pointer),另外一种是弱指针(weak pointer)。其实称之为强引用和弱引用更合适一些。强指针与一般意义的智能指针概念相同,通过引用计数来记录有多少使用者在使用一个对象,如果所有使用者都放弃了对该对象的引用,则该对象将被自动销毁。
弱指针也指向一个对象,但是弱指针仅仅记录该对象的地址,不能通过弱指针来访问该对象,也就是说不能通过弱智真来调用对象的成员函数或访问对象的成员变量。要想访问弱指针所指向的对象,需首先通过wp类所提供的promote()方法将弱指针升级为强指针。弱指针所指向的对象是有可能在其它地方被销毁的,如果对象已经被销毁,wp的promote()方法将返回空指针,这样就能避免出现地址访问错的情况。
弱指针是怎么做到这一点的呢?其实说白了一点也不复杂,原因就在于每一个可以被智能指针引用的对象都同时被附加了另外一个weakref_impl类型的对象,这个对象中负责记录对象的强指针引用计数和弱指针引用计数。这个对象是智能指针的实现内部使用的,智能指针的使用者看不到这个对象。弱指针操作的就是这个对象,只有当强引用计数和弱引用计数都为0时,这个对象才会被销毁。

‘柒’ import语法什么时候开始支持

Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言,应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展,Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。

Java编程语言的风格十分接近C++语言。继承了C++语言面向对象技术的核心,Java舍弃了C++语言中容易引起错误的指针,改以引用取代,同时移除原C++与原来运算符重载,也移除多重继承特性,改用接口取代,增加垃圾回收器功能。在Java SE 1.5版本中引入了泛型编程、类型安全的枚举、不定长参数和自动装/拆箱特性。太阳微系统对Java语言的解释是:“Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言”

Java不同于一般的编译语言或直译语言。它首先将源代码编译成字节码,然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编写,到处运行”的跨平台特性。在早期JVM中,这在一定程度上降低了Java程序的运行效率。但在J2SE1.4.2发布后,Java的运行速度有了大幅提升。

与传统类型不同,Sun公司在推出Java时就将其作为开放的技术。全球数以万计的Java开发公司被要求所设计的Java软件必须相互兼容。“Java语言靠群体的力量而非公司的力量”是 Sun公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同,此外,微软公司后来推出了与之竞争的.NET平台以及模仿Java的C#语言。后来Sun公司被甲骨文公司并购,Java也随之成为甲骨文公司的产品。

现时,移动操作系统Android大部分的代码采用Java 编程语言编程。

早期的Java

Java的发明人詹姆斯·高斯林

Duke,Java语言的吉祥物

语言最开始只是Sun计算机(Sun MicroSystems)公司在1990年12月开始研究的一个内部项目。Sun计算机公司的一个叫做帕特里克·诺顿的工程师被公司自己开发的C++和C语言编译器搞得焦头烂额,因为其中的API极其难用。帕特里克决定改用NeXT,同时他也获得了研究公司的一个叫做“Stealth计划”的项目的机会。

“Stealth计划”后来改名为“Green计划”,詹姆斯·高斯林和麦克·舍林丹也加入了帕特里克的工作小组。他们和其他几个工程师一起在加利福尼亚州门罗帕克市沙丘路的一个小工作室里面研究开发新技术,瞄准下一代智能家电(如微波炉)的程序设计,Sun公司预料未来科技将在家用电器领域大显身手。团队最初考虑使用C++语言,但是很多成员包括Sun的首席科学家比尔·乔伊,发现C++和可用的API在某些方面存在很大问题。

工作小组使用的是嵌入式系统,可以用的资源极其有限。很多成员发现C++太复杂以至很多开发者经常错误使用。他们发现C++缺少垃圾回收系统,还有可移植的安全性、分布程序设计、和多线程功能。最后,他们想要一种易于移植到各种设备上的平台。

根据可用的资金,乔伊决定开发一种集C语言和Mesa语言大成的新语言,在一份报告上,乔伊把它叫做“未来”,他提议Sun公司的工程师应该在C++的基础上,开发一种面向对象的环境。最初,高斯林试图修改和扩展C++的功能,他自己称这种新语言为C++ ++ --,但是后来他放弃了。他将要创造出一种全新的语言,被他命名为“Oak”(橡树),以他的办公室外的橡树命名。

就像很多开发新技术的秘密工程一样,工作小组没日没夜地工作到了1993年的夏天,他们能够演示新平台的一部分了,包括Green操作系统,Oak的程序设计语言,类库及其硬件。最初的尝试是面向一种类PDA设备,被命名为Star7,这种设备有鲜艳的图形界面和被称为“Duke”的智能代理来帮助用户。1992年12月3日,这台设备进行了展示。

同年11月,Green计划被转化成了“FirstPerson有限公司”,一个Sun公司的全资子公司,团队也被重新安排到了帕洛阿尔托。FirstPerson团队对建造一种高度交互的设备感兴趣,当时代华纳发布了一个关于电视机顶盒的征求提议书时(Request for proposal),FirstPerson改变了他们的目标,作为对征求意见书的响应,提出了一个机顶盒平台的提议。但是有线电视业界觉得FirstPerson的平台给予用户过多的控制权,因此FirstPerson的投标败给了SGI。与3DO公司的另外一笔关于机顶盒的交易也没有成功,由于他们的平台不能在电视工业产生任何效益,公司被并回Sun公司。

Java和互联网

1994年6月,在经历了一场历时三天的脑力激荡的讨论后,约翰·盖吉、詹姆斯·高斯林、比尔·乔伊、帕特里克·诺顿、韦恩·罗斯因和埃里克·斯库米,团队决定再一次改变了努力的目标,这次他们决定将该技术应用于万维网。他们认为随着Mosaic浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看到的。作为原型,帕特里克·诺顿写了一个小型万维网浏览器,WebRunner,后来改名为HotJava[12]。

1994年10月,HotJava和Java平台为公司高层进行演示。1994年,Java

1.0a版本已经可以提供下载,但是Java和HotJava浏览器的第一次公开发布却是在1995年3月23日SunWorld大会上进行的。升阳公司的科学指导约翰·盖吉宣告Java技术。这个发布是与网景公司的执行副总裁马克·安德森的惊人发布一起进行的,宣布网景将在其浏览器中包含对Java的支持。1996年1月,升阳公司成立了Java业务集团,专门开发Java技术。

Java和“Java”

由于商标搜索显示,Oak已被一家显示卡制造商注册。于是同年,Oak被改名为Java。当使用十六进制编辑器打开由Java源代码编译出的二进制文件(.class文件)的话,最前面的32位将显示为CA FE BA BE,即词组“CAFE BABE”(咖啡屋宝贝)。

Java近况

一套Java编辑器软件

J2SE环境与CDC的关连

JVM的所在角色

JSPX网页的概念

在流行几年之后,Java在浏览器中的地位被逐步侵蚀。它在简单交互性动画方面的用途已经完全被Adobe公司的Flash排挤,2005年Java倾向只被用于雅虎游戏那样的更为复杂的应用程序。Java同时遭受到来自微软的反对,他们决定在新版本的Internet Explorer和Windows中不再附带Java平台。

与此相反。在万维网的服务器端和手持设备上,Java变得更加流行。很多网站在后端使用JSP和其他的Java技术。

在桌面系统上,独立的Java程序还是相对少见,这是因为Java平台的运行开销较大,而许多人的电脑上没有安装Java,由于网络带宽在以前较小,下载Java曾经是个耗时的事情。但是随着计算机计算能力、网络带宽在10年中获取了很大的进步,同时虚拟机和编译器的质量得到了提高,许多应用程序得到了广泛的使用,包括:

开源软件:

NetBeans和Eclipse等软件开发工具

Android操作系统

JEdit

Azureus BitTorrent客户端。

JNode操作系统

Apache软件基金会的Ant、Derby、Hadoop、Jakarta、POI和Tomcat

JBoss和GlassFish应用服务器

商业软件:

EIOffice(永中Office)

Minecraft

纯Java 3D游戏合金战士Chrome

IBM Websphere、ColdFusion和WebLogic

IntelliJ IDEA

还有许多用Java写的软件,可以在http://www.java.com 找到。在以下网页可以看到非常多用Java写的程序:http://java.sun.com/procts/ 下面有大量用Java Swing开发的桌面Java程序 http://java.sun.com/procts/jfc/tsc/sightings/ 目前Java提供以下三个版本:

Java Platform, Enterprise Edition(Java EE:Java平台企业版)

Java Platform, Standard Edition(Java SE:Java平台标准版)

Java Platform, Micro Edition(Java ME:Java平台微型版)

Java Platform, Card Edition

Java开放源代码项目

2006年SUN在JavaOne公布Java 开放源代码项目,并推出OpenJDK项目。[13]Java虚拟机、Java编译器和Java类库以GNU通用公共许可证公开。

版本历史

主条目:Java版本历史

1995年5月23日,Java语言诞生

1996年1月,第一个JDK-JDK1.0诞生

1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术

1996年9月,约8.3万个网页应用了JAVA技术来制作

1997年2月18日,JDK1.1发布

1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议规模之纪录

1997年9月,JavaDeveloperConnection社区成员超过十万

1998年2月,JDK1.1被下载超过2,000,000次

1998年12月8日,JAVA2企业平台J2EE发布

1999年6月,SUN公司发布Java的三个版本:标准版(J2SE)、企业版(J2EE)和微型版(J2ME)

2000年5月8日,JDK1.3发布

2000年5月29日,JDK1.4发布

2001年6月5日,NOKIA宣布,到2003年将出售1亿部支持Java的手机

2001年9月24日,J2EE1.3发布

2002年2月26日,J2SE1.4发布,自此Java的计算能力有了大幅提升

2004年9月30日18:00PM,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5更名为Java SE 5.0

2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名,以取消其中的数字“2”:J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Java ME

2006年12月,SUN公司发布JRE6.0

2009年12月,SUN公司发布Java EE 6

2010年11月,由于Oracle公司对于Java社区的不友善,因此Apache扬言将退出JCP[14]

2011年7月28日,Oracle公司发布Java SE 7

2014年3月18日,Oracle公司发表Java SE 8

语言特性

Java之所以被开发,是要达到以下五个目的:

应当使用面向对象程序设计方法学

应当允许同一程序在不同的计算机平台执行

应当包括内建的对计算机网络的支持

应当被设计成安全地执行远端代码

应当易于使用,并借鉴以前那些面向对象语言(如C++)的长处。

Java技术主要分成几个部分:Java语言、Java运行环境、类库。一般情况下说Java时并不区分指的是哪个部分。

Java在1.5版本时,做了重大改变,Sun公司并1.5版本重命名为Java 5.0。

面向对象

Java的特点之一就是面向对象,是程序设计方法的一种。“面向对象程序设计语言”的核心之一就是开发者在设计软件的时候可以使用自定义的类型和关联操作。代码和数据的实际集合体叫做“对象”。一个对象可以想象成绑定了很多“行为(代码)”和“状态(数据)”的物体。对于数据结构的改变需要和代码进行通信然后操作,反之亦然。面向对象设计让大型软件工程的计划和设计变得更容易管理,能增强工程的健康度,减少失败工程的数量。

跨平台性

Java语言的第二个特性就是跨平台性,也就是说使用Java语言编写的程序可以在编译后不用经过任何更改,就能在任何硬件设备条件下运行。这个特性经常被称为“一次编译,到处运行”。

执行Java应用程序必须安装爪哇运行环境(Java Runtime Environment,JRE),JRE内部有一个Java虚拟机(Java Virtual Machine,JVM)以及一些标准的类库(Class Library)。通过JVM才能在电脑系统执行Java应用程序(Java Application),这与.Net Framework的情况一样,所以电脑上没有安装JVM,那么这些程序将不能够执行。

实现跨平台性的方法是大多数编译器在进行Java语言程序的编码时候会生成一个用字节码写成的“半成品”,这个“半成品”会在Java虚拟机(解释层)的帮助下运行,虚拟机会把它转换成当前所处硬件平台的原始代码。之后,Java虚拟机会打开标准库,进行数据(图片、线程和网络)的访问工作。主要注意的是,尽管已经存在一个进行代码翻译的解释层,有些时候Java的字节码代码还是会被JIT编译器进行二次编译。

有些编译器,比如GCJ,可以自动生成原始代码而不需要解释层。但是这些编译器所生成的代码只能应用于特定平台。并且GCJ目前只支持部分的Java API。

甲骨文公司对于Java的许可是“全兼容的”,这也导致了微软和升阳关于微软的程序不支持RMI和JNI接口、并且增加特性为己所用的法律争端。升阳最终赢得了官司,获得了大约两千万美元的赔偿,法院强制要求微软执行升阳公司关于Java的许可要求。作为回应,微软不再在Windows系统中捆绑Java,最新的Windows版本,Windows Vista和Internet Explorer 7.0版本也不再提供对于Java应用程序和控件的支持。但是升阳公司和其他使用Java运行时系统的公司在Windows操作系统下对用户提供无偿的第三方插件和程序支持。

Java语言使用解释层最初是为了轻巧性。所以这些程序的运行效率比C语言和C++要低很多,用户也对此颇有微词。很多最近的调查显示Java的程序运行速度比几年前要高出许多,有些同样功能的程序的效率甚至超过了C++和C语言编写的程序[来源请求]。

Java语言在最开始应用的时候是没有解释层的,所有需要编译的代码都直接转换成机器的原始代码。这样做的后果就是获得了最佳的性能,但是程序臃肿异常。从JIT技术开始,Java的程序都经过一次转换之后才变成机器码。很多老牌的第三方虚拟机都使用一种叫做“动态编译”的技术,也就是说虚拟机实时监测和分析程序的运行行为,同时选择性地对程序所需要的部分进行编译和优化。所有这些技术都改善了代码的运行速度,但是又不会让程序的体积变得失常。

程序的轻便性事实上是软件编写很难达到的一个目标,Java虽然成功地实现了“一次编译,到处运行”,但是由于平台和平台之间的差异,所编写的程序在转换代码的时候难免会出现微小的、不可察觉的错误和意外。有些程序员对此非常头疼,他们嘲笑Java的程序不是“一次编译,到处运行”,而是“一次编译,到处调试”。以Java

AWT为例,早期Java

AWT内提供的按钮、文字区等均是以计算机系统所默认的样式而显示。这令Java程序在有些没有提供图案的计算机系统产生错误(在Microsoft

Windows设有窗口管理器,在一些Linux distribution则没有)。后来SUN公司针对Java AWT一些问题而推出Java

Swing。

平台无关性让Java在服务器端软件领域非常成功。很多服务器端软件都使用Java或相关技术建立。

自动垃圾回收(Garbage Collection)

C++语言被用户诟病的原因之一是大多数C++编译器不支持垃圾收集机制。通常使用C++编程的时候,程序员于程序中初始化对象时,会在主机内存堆栈上分配一块内存与地址,当不需要此对象时,进行析构或者删除的时候再释放分配的内存地址。如果对象是在堆栈上分配的,而程序员又忘记进行删除,那么就会造成内存泄漏(Memory

Leak)。长此以往,程序运行的时候可能会生成很多不清除的垃圾,浪费了不必要的内存空间。而且如果同一内存地址被删除两次的话,程序会变得不稳定,甚至崩溃。因此有经验的C++程序员都会在删除之后将指针重置为NULL,然后在删除之前先判断指针是否为NULL。

C++中也可以使用“智能指针”(Smart Pointer)或者使用C++托管扩展编译器的方法来实现自动化内存释放,智能指针可以在标准类库中找到,而C++
(题主你怎么可以问这么沙比的问题!)

托管扩展被微软的Visual

C++

7.0及以上版本所支持。智能指针的优点是不需引入缓慢的垃圾收集机制,而且可以不考虑线程安全的问题,但是缺点是如果不善使用智能指针的话,性能有可能不如垃圾收集机制,而且不断地分配和释放内存可能造成内存碎片,需要手动对堆进行压缩。除此之外,由于智能指针是一个基于模板的功能,所以没有经验的程序员在需要使用多态特性进行自动清理时也可能束手无策。

Java语言则不同,上述的情况被自动垃圾收集功能自动处理。对象的创建和放置都是在内存堆栈上面进行的。当一个对象没有任何引用的时候,Java的自动垃圾收集机制就发挥作用,自动删除这个对象所占用的空间,释放内存以避免内存泄漏。

注意程序员不需要修改finalize方法,自动垃圾收集也会发生作用。但是内存泄漏并不是就此避免了,当程序员疏忽大意地忘记解除一个对象不应该有的引用时,内存泄漏仍然不可避免。

不同厂商、不同版本的JVM中的内存垃圾回收机制并不完全一样,通常越新版本的内存回收机制越快,IBM、BEA、SUN等等开发JVM的公司都曾宣称过自己制造出了世界上最快的JVM[来源请求],JVM性能的世界纪录也在不断的被打破并提高。

IBM有一篇有关Java内存回收机制比不激活垃圾收集机制的C++内存处理快数倍的技术文章[15],而着名的Java技术书籍《Java编程思想》(Thinking in Java)也有一段论述Java内存及性能达到甚至超过C++的章节[16]。

基本语法

编写Java程序前应注意以下几点:

大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的。

类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如MyFirstJavaClass。

方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写,例如myFirstJavaMethod。

源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记Java是大小写敏感的),文件名的后缀为.java。(如果文件名和类名不相同则会导致编译错误)。

主方法入口:所有的Java程序由public static void main(String[] args)方法开始执行。

Java关键字

关键字 下面列出了Java关键字。这些关键字不能用于常量、变量、和任何标识符的名称。

关键字

描述

abstract

抽象方法,抽象类的修饰符

assert

断言条件是否满足

continue

不执行循环体剩余部分

default

switch语句中的默认分支

do-while

循环语句,循环体至少会执行一次

double

64-bit双精度浮点数

else

if条件不成立时执行的分支

enum

枚举类型

extends

表示一个类是另一个类的子类

final

表示定义常量

finally

无论有没有异常发生都执行代码

float

32-bit单精度浮点数

for

for循环语句

goto

用于流程跳转(不可用,意即不可随意跳转)

if

条件语句

implements

表示一个类实现了接口

import

导入类

instanceof

测试一个对象是否是某个类的实例

int

32位整型数

interface

接口,一种抽象的类型,仅有方法和常量的定义

long

64位整型数

native

表示方法用非java代码实现

new

分配新的类实例

package

一系列相关类组成一个包

private

表示私有字段,或者方法等,只能从类内部访问

protected

表示保护类型字段

public

表示共有属性或者方法

return

方法返回值

short

16位数字

static

表示在类级别定义,所有实例共享的

strictfp

浮点数比较使用严格的规则

super

表示基类

switch

选择语句

synchronized

表示同一时间只能由一个线程访问的代码块

this

调用当前实例或者调用另一个构造函数

throw

抛出异常

throws

定义方法可能抛出的异常

transient

修饰不要序列化的字段

try

表示代码块要做异常处理

void

标记方法不返回任何值

volatile

标记字段可能会被多个线程同时访问,而不做同步

while

while循环

注释

注释作用:标识程序是干什么的,以及它是如何构建的。注释帮助程序员进行相互沟通以及理解程序。注释不是程序设计语言,所以编译器编译程序时忽略它们。

接口和类别

Java自带了创建接口的类别,可以这样使用:

public interface Deleteable {

void delete();

}

这段代码的意思是任何实现(implement)Deleteable接口的类别都必须实现delete()方法。每个类别对这个方法的实现可以自行定制。由此概念可以引出很多种使用方法,下面是一个类别的例子:

‘捌’ Android图形系统(六)-app与SurfaceFlinger服务连接过程

经过上一篇的概览,我们对Android图形系统渲染流程有了一个大致的了解,这篇开始做细节分析。那么先来总结下app与SurfaceFlinger服务连接过程。

经过前面的activity 、window 、view 的分析我们大致了解了Activity的显示过程。其实Surface的创建过程与Activity的显示过程密不可分。

那么就从Activity.makeVisible 开始捋下流程:

1 Activity.makeVisible getWindowManager() 并执行addView。

2 经过WindowManagerImpl 和 WindowManagerGlobal addView , 最终创建了ViewRootImpl

3 ViewRootImpl 内部会new Surface() ,它是一个Parcelable对象,可在进程间传递,但目前仅是一个空壳,还未被赋值。
同时,通过WindowManagerGlobal.getWindowSession()获取了Session实例,准备好了与WMS通信,并且Session内有个成员变量SurfaceSession值得关注,它的初始化是在Session的windowAddedLocked方法,先埋个伏笔。

4 根据流程我们知道,最终ViewRootImpl会在走setView, 在这个方法中开始了两个流程:

requestLayout执行会走消息,因此它虽然在addToDisplay前面,但是执行是在之后的,因此我们先来看看mWindowSession.addToDisplay,这个过程最终是在WMS执行addWindow方法:

我们之前埋过伏笔的,windowAddedLocked创建了SurfaceSession 对象,并将当前 Session 添加到 WMS.mSessions 成员变量。SurfaceSession 的创建会调用 JNI,在 JNI 调用 nativeCreate()。

从这里开始要细说下了,这是应用程序与SurfaceFlinger建立连接的关键点:

跟踪到android_view_SurfaceSession.cpp 的nativeCreate()方法,创建了SurfaceComposerClient 对象,并且将这个对象赋值给类型为sp<SurfaceComposerClient>的智能指针mSession时,就会导致SurfaceComposerClient类的成员函数onFirstRef被调用:

SurfaceComposerClient类的成员函数getComposerService用来获得SurfaceFlinger服务的一个代理接口.

ComposerService类是单例模式,当我们第一次调用它的静态函数getInstance的时候,它就会在构造函数中获得SurfaceFlinger服务的一个代理接口,并且保存在它的成员变量mComposerService中,同时会通过这个代理接口的成员函数getCblk来获得一块匿名共享内存mServerCblkMemory。这块匿名共享内存是由SurfaceFlinger服务创建的,用来描述系统显示屏的信息,例如,显示屏的个数、大小、方向、密度等等信息。

这时候sm有值了,在接着onFirstRef()往下执行:

是不是感觉特别绕,下面来简单总结下:

首先ComPoserService作为client 与 SurfaceFlinger server进行binder IPC , 获取到SurfaceFlinger创建的Client对象,它相当于是SurfaceFlinger内部对应用程序客户端的封装对象,而Client与SurfaceComposerClient又互为binder ipc的两端,SurfaceComposerClient为client端,Client为server端。

这样,应用进程成功通过SurfaceComposerClient与SurfaceFlinger建立了连接。

下篇分析app请求SurfaceFlinger创建Surface过程。

参考:
https://blog.csdn.net/Luoshengyang/article/details/7857163
https://blog.csdn.net/armwind/article/details/73436532

‘玖’ 如何从github获取源代码

Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言,应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展,Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。

Java编程语言的风格十分接近C++语言。继承了C++语言面向对象技术的核心,Java舍弃了C++语言中容易引起错误的指针,改以引用取代,同时移除原C++与原来运算符重载,也移除多重继承特性,改用接口取代,增加垃圾回收器功能。在Java SE 1.5版本中引入了泛型编程、类型安全的枚举、不定长参数和自动装/拆箱特性。太阳微系统对Java语言的解释是:“Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言”

Java不同于一般的编译语言或直译语言。它首先将源代码编译成字节码,然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编写,到处运行”的跨平台特性。在早期JVM中,这在一定程度上降低了Java程序的运行效率。但在J2SE1.4.2发布后,Java的运行速度有了大幅提升。

与传统类型不同,Sun公司在推出Java时就将其作为开放的技术。全球数以万计的Java开发公司被要求所设计的Java软件必须相互兼容。“Java语言靠群体的力量而非公司的力量”是 Sun公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同,此外,微软公司后来推出了与之竞争的.NET平台以及模仿Java的C#语言。后来Sun公司被甲骨文公司并购,Java也随之成为甲骨文公司的产品。

现时,移动操作系统Android大部分的代码采用Java 编程语言编程。
早期的Java

Java的发明人詹姆斯·高斯林

Duke,Java语言的吉祥物

语言最开始只是Sun计算机(Sun MicroSystems)公司在1990年12月开始研究的一个内部项目。Sun计算机公司的一个叫做帕特里克·诺顿的工程师被公司自己开发的C++和C语言编译器搞得焦头烂额,因为其中的API极其难用。帕特里克决定改用NeXT,同时他也获得了研究公司的一个叫做“Stealth计划”的项目的机会。

“Stealth计划”后来改名为“Green计划”,詹姆斯·高斯林和麦克·舍林丹也加入了帕特里克的工作小组。他们和其他几个工程师一起在加利福尼亚州门罗帕克市沙丘路的一个小工作室里面研究开发新技术,瞄准下一代智能家电(如微波炉)的程序设计,Sun公司预料未来科技将在家用电器领域大显身手。团队最初考虑使用C++语言,但是很多成员包括Sun的首席科学家比尔·乔伊,发现C++和可用的API在某些方面存在很大问题。

工作小组使用的是嵌入式系统,可以用的资源极其有限。很多成员发现C++太复杂以至很多开发者经常错误使用。他们发现C++缺少垃圾回收系统,还有可移植的安全性、分布程序设计、和多线程功能。最后,他们想要一种易于移植到各种设备上的平台。

根据可用的资金,乔伊决定开发一种集C语言和Mesa语言大成的新语言,在一份报告上,乔伊把它叫做“未来”,他提议Sun公司的工程师应该在C++的基础上,开发一种面向对象的环境。最初,高斯林试图修改和扩展C++的功能,他自己称这种新语言为C++ ++ --,但是后来他放弃了。他将要创造出一种全新的语言,被他命名为“Oak”(橡树),以他的办公室外的橡树命名。

就像很多开发新技术的秘密工程一样,工作小组没日没夜地工作到了1993年的夏天,他们能够演示新平台的一部分了,包括Green操作系统,Oak的程序设计语言,类库及其硬件。最初的尝试是面向一种类PDA设备,被命名为Star7,这种设备有鲜艳的图形界面和被称为“Duke”的智能代理来帮助用户。1992年12月3日,这台设备进行了展示。

同年11月,Green计划被转化成了“FirstPerson有限公司”,一个Sun公司的全资子公司,团队也被重新安排到了帕洛阿尔托。FirstPerson团队对建造一种高度交互的设备感兴趣,当时代华纳发布了一个关于电视机顶盒的征求提议书时(Request for proposal),FirstPerson改变了他们的目标,作为对征求意见书的响应,提出了一个机顶盒平台的提议。但是有线电视业界觉得FirstPerson的平台给予用户过多的控制权,因此FirstPerson的投标败给了SGI。与3DO公司的另外一笔关于机顶盒的交易也没有成功,由于他们的平台不能在电视工业产生任何效益,公司被并回Sun公司。

Java和互联网
1994年6月,在经历了一场历时三天的脑力激荡的讨论后,约翰·盖吉、詹姆斯·高斯林、比尔·乔伊、帕特里克·诺顿、韦恩·罗斯因和埃里克·斯库米,团队决定再一次改变了努力的目标,这次他们决定将该技术应用于万维网。他们认为随着Mosaic浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看到的。作为原型,帕特里克·诺顿写了一个小型万维网浏览器,WebRunner,后来改名为HotJava[12]。

1994年10月,HotJava和Java平台为公司高层进行演示。1994年,Java
1.0a版本已经可以提供下载,但是Java和HotJava浏览器的第一次公开发布却是在1995年3月23日SunWorld大会上进行的。升阳公司的科学指导约翰·盖吉宣告Java技术。这个发布是与网景公司的执行副总裁马克·安德森的惊人发布一起进行的,宣布网景将在其浏览器中包含对Java的支持。1996年1月,升阳公司成立了Java业务集团,专门开发Java技术。

Java和“Java”
由于商标搜索显示,Oak已被一家显示卡制造商注册。于是同年,Oak被改名为Java。当使用十六进制编辑器打开由Java源代码编译出的二进制文件(.class文件)的话,最前面的32位将显示为CA FE BA BE,即词组“CAFE BABE”(咖啡屋宝贝)。

Java近况

一套Java编辑器软件

J2SE环境与CDC的关连

JVM的所在角色

JSPX网页的概念

在流行几年之后,Java在浏览器中的地位被逐步侵蚀。它在简单交互性动画方面的用途已经完全被Adobe公司的Flash排挤,2005年Java倾向只被用于雅虎游戏那样的更为复杂的应用程序。Java同时遭受到来自微软的反对,他们决定在新版本的Internet Explorer和Windows中不再附带Java平台。

与此相反。在万维网的服务器端和手持设备上,Java变得更加流行。很多网站在后端使用JSP和其他的Java技术。

在桌面系统上,独立的Java程序还是相对少见,这是因为Java平台的运行开销较大,而许多人的电脑上没有安装Java,由于网络带宽在以前较小,下载Java曾经是个耗时的事情。但是随着计算机计算能力、网络带宽在10年中获取了很大的进步,同时虚拟机和编译器的质量得到了提高,许多应用程序得到了广泛的使用,包括:

开源软件:

NetBeans和Eclipse等软件开发工具
Android操作系统
JEdit
Azureus BitTorrent客户端。
JNode操作系统
Apache软件基金会的Ant、Derby、Hadoop、Jakarta、POI和Tomcat
JBoss和GlassFish应用服务器

商业软件:

EIOffice(永中Office)
Minecraft
纯Java 3D游戏合金战士Chrome
IBM Websphere、ColdFusion和WebLogic
IntelliJ IDEA

还有许多用Java写的软件,可以在http://www.java.com 找到。在以下网页可以看到非常多用Java写的程序:http://java.sun.com/procts/ 下面有大量用Java Swing开发的桌面Java程序 http://java.sun.com/procts/jfc/tsc/sightings/ 目前Java提供以下三个版本:

Java Platform, Enterprise Edition(Java EE:Java平台企业版)
Java Platform, Standard Edition(Java SE:Java平台标准版)
Java Platform, Micro Edition(Java ME:Java平台微型版)
Java Platform, Card Edition

Java开放源代码项目
2006年SUN在JavaOne公布Java 开放源代码项目,并推出OpenJDK项目。[13]Java虚拟机、Java编译器和Java类库以GNU通用公共许可证公开。

版本历史
主条目:Java版本历史

1995年5月23日,Java语言诞生
1996年1月,第一个JDK-JDK1.0诞生
1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术
1996年9月,约8.3万个网页应用了JAVA技术来制作
1997年2月18日,JDK1.1发布
1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议规模之纪录
1997年9月,JavaDeveloperConnection社区成员超过十万
1998年2月,JDK1.1被下载超过2,000,000次
1998年12月8日,JAVA2企业平台J2EE发布
1999年6月,SUN公司发布Java的三个版本:标准版(J2SE)、企业版(J2EE)和微型版(J2ME)
2000年5月8日,JDK1.3发布
2000年5月29日,JDK1.4发布
2001年6月5日,NOKIA宣布,到2003年将出售1亿部支持Java的手机
2001年9月24日,J2EE1.3发布
2002年2月26日,J2SE1.4发布,自此Java的计算能力有了大幅提升
2004年9月30日18:00PM,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5更名为Java SE 5.0
2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名,以取消其中的数字“2”:J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Java ME
2006年12月,SUN公司发布JRE6.0
2009年12月,SUN公司发布Java EE 6
2010年11月,由于Oracle公司对于Java社区的不友善,因此Apache扬言将退出JCP[14]
2011年7月28日,Oracle公司发布Java SE 7
2014年3月18日,Oracle公司发表Java SE 8

语言特性
Java之所以被开发,是要达到以下五个目的:

应当使用面向对象程序设计方法学
应当允许同一程序在不同的计算机平台执行
应当包括内建的对计算机网络的支持
应当被设计成安全地执行远端代码
应当易于使用,并借鉴以前那些面向对象语言(如C++)的长处。

Java技术主要分成几个部分:Java语言、Java运行环境、类库。一般情况下说Java时并不区分指的是哪个部分。

Java在1.5版本时,做了重大改变,Sun公司并1.5版本重命名为Java 5.0。

面向对象
Java的特点之一就是面向对象,是程序设计方法的一种。“面向对象程序设计语言”的核心之一就是开发者在设计软件的时候可以使用自定义的类型和关联操作。代码和数据的实际集合体叫做“对象”。一个对象可以想象成绑定了很多“行为(代码)”和“状态(数据)”的物体。对于数据结构的改变需要和代码进行通信然后操作,反之亦然。面向对象设计让大型软件工程的计划和设计变得更容易管理,能增强工程的健康度,减少失败工程的数量。

跨平台性
Java语言的第二个特性就是跨平台性,也就是说使用Java语言编写的程序可以在编译后不用经过任何更改,就能在任何硬件设备条件下运行。这个特性经常被称为“一次编译,到处运行”。

执行Java应用程序必须安装爪哇运行环境(Java Runtime Environment,JRE),JRE内部有一个Java虚拟机(Java Virtual Machine,JVM)以及一些标准的类库(Class Library)。通过JVM才能在电脑系统执行Java应用程序(Java Application),这与.Net Framework的情况一样,所以电脑上没有安装JVM,那么这些程序将不能够执行。

实现跨平台性的方法是大多数编译器在进行Java语言程序的编码时候会生成一个用字节码写成的“半成品”,这个“半成品”会在Java虚拟机(解释层)的帮助下运行,虚拟机会把它转换成当前所处硬件平台的原始代码。之后,Java虚拟机会打开标准库,进行数据(图片、线程和网络)的访问工作。主要注意的是,尽管已经存在一个进行代码翻译的解释层,有些时候Java的字节码代码还是会被JIT编译器进行二次编译。

有些编译器,比如GCJ,可以自动生成原始代码而不需要解释层。但是这些编译器所生成的代码只能应用于特定平台。并且GCJ目前只支持部分的Java API。

甲骨文公司对于Java的许可是“全兼容的”,这也导致了微软和升阳关于微软的程序不支持RMI和JNI接口、并且增加特性为己所用的法律争端。升阳最终赢得了官司,获得了大约两千万美元的赔偿,法院强制要求微软执行升阳公司关于Java的许可要求。作为回应,微软不再在Windows系统中捆绑Java,最新的Windows版本,Windows Vista和Internet Explorer 7.0版本也不再提供对于Java应用程序和控件的支持。但是升阳公司和其他使用Java运行时系统的公司在Windows操作系统下对用户提供无偿的第三方插件和程序支持。

Java语言使用解释层最初是为了轻巧性。所以这些程序的运行效率比C语言和C++要低很多,用户也对此颇有微词。很多最近的调查显示Java的程序运行速度比几年前要高出许多,有些同样功能的程序的效率甚至超过了C++和C语言编写的程序[来源请求]。

Java语言在最开始应用的时候是没有解释层的,所有需要编译的代码都直接转换成机器的原始代码。这样做的后果就是获得了最佳的性能,但是程序臃肿异常。从JIT技术开始,Java的程序都经过一次转换之后才变成机器码。很多老牌的第三方虚拟机都使用一种叫做“动态编译”的技术,也就是说虚拟机实时监测和分析程序的运行行为,同时选择性地对程序所需要的部分进行编译和优化。所有这些技术都改善了代码的运行速度,但是又不会让程序的体积变得失常。

程序的轻便性事实上是软件编写很难达到的一个目标,Java虽然成功地实现了“一次编译,到处运行”,但是由于平台和平台之间的差异,所编写的程序在转换代码的时候难免会出现微小的、不可察觉的错误和意外。有些程序员对此非常头疼,他们嘲笑Java的程序不是“一次编译,到处运行”,而是“一次编译,到处调试”。以Java
AWT为例,早期Java
AWT内提供的按钮、文字区等均是以计算机系统所默认的样式而显示。这令Java程序在有些没有提供图案的计算机系统产生错误(在Microsoft
Windows设有窗口管理器,在一些Linux distribution则没有)。后来SUN公司针对Java AWT一些问题而推出Java
Swing。

平台无关性让Java在服务器端软件领域非常成功。很多服务器端软件都使用Java或相关技术建立。

自动垃圾回收(Garbage Collection)
C++语言被用户诟病的原因之一是大多数C++编译器不支持垃圾收集机制。通常使用C++编程的时候,程序员于程序中初始化对象时,会在主机内存堆栈上分配一块内存与地址,当不需要此对象时,进行析构或者删除的时候再释放分配的内存地址。如果对象是在堆栈上分配的,而程序员又忘记进行删除,那么就会造成内存泄漏(Memory

Leak)。长此以往,程序运行的时候可能会生成很多不清除的垃圾,浪费了不必要的内存空间。而且如果同一内存地址被删除两次的话,程序会变得不稳定,甚至崩溃。因此有经验的C++程序员都会在删除之后将指针重置为NULL,然后在删除之前先判断指针是否为NULL。

C++中也可以使用“智能指针”(Smart Pointer)或者使用C++托管扩展编译器的方法来实现自动化内存释放,智能指针可以在标准类库中找到,而C++
(题主你怎么可以问这么沙比的问题!)
托管扩展被微软的Visual

C++
7.0及以上版本所支持。智能指针的优点是不需引入缓慢的垃圾收集机制,而且可以不考虑线程安全的问题,但是缺点是如果不善使用智能指针的话,性能有可能不如垃圾收集机制,而且不断地分配和释放内存可能造成内存碎片,需要手动对堆进行压缩。除此之外,由于智能指针是一个基于模板的功能,所以没有经验的程序员在需要使用多态特性进行自动清理时也可能束手无策。

Java语言则不同,上述的情况被自动垃圾收集功能自动处理。对象的创建和放置都是在内存堆栈上面进行的。当一个对象没有任何引用的时候,Java的自动垃圾收集机制就发挥作用,自动删除这个对象所占用的空间,释放内存以避免内存泄漏。

注意程序员不需要修改finalize方法,自动垃圾收集也会发生作用。但是内存泄漏并不是就此避免了,当程序员疏忽大意地忘记解除一个对象不应该有的引用时,内存泄漏仍然不可避免。

不同厂商、不同版本的JVM中的内存垃圾回收机制并不完全一样,通常越新版本的内存回收机制越快,IBM、BEA、SUN等等开发JVM的公司都曾宣称过自己制造出了世界上最快的JVM[来源请求],JVM性能的世界纪录也在不断的被打破并提高。

IBM有一篇有关Java内存回收机制比不激活垃圾收集机制的C++内存处理快数倍的技术文章[15],而着名的Java技术书籍《Java编程思想》(Thinking in Java)也有一段论述Java内存及性能达到甚至超过C++的章节[16]。

基本语法
编写Java程序前应注意以下几点:

大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的。
类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如MyFirstJavaClass。
方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写,例如myFirstJavaMethod。
源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记Java是大小写敏感的),文件名的后缀为.java。(如果文件名和类名不相同则会导致编译错误)。
主方法入口:所有的Java程序由public static void main(String[] args)方法开始执行。

Java关键字
关键字 下面列出了Java关键字。这些关键字不能用于常量、变量、和任何标识符的名称。

关键字
描述

abstract
抽象方法,抽象类的修饰符

assert
断言条件是否满足

continue
不执行循环体剩余部分

default
switch语句中的默认分支

do-while
循环语句,循环体至少会执行一次

double
64-bit双精度浮点数

else
if条件不成立时执行的分支

enum
枚举类型

extends
表示一个类是另一个类的子类

final
表示定义常量

finally
无论有没有异常发生都执行代码

float
32-bit单精度浮点数

for
for循环语句

goto
用于流程跳转(不可用,意即不可随意跳转)

if
条件语句

implements
表示一个类实现了接口

import
导入类

instanceof
测试一个对象是否是某个类的实例

int
32位整型数

interface
接口,一种抽象的类型,仅有方法和常量的定义

long
64位整型数

native
表示方法用非java代码实现

new
分配新的类实例

package
一系列相关类组成一个包

private
表示私有字段,或者方法等,只能从类内部访问

protected
表示保护类型字段

public
表示共有属性或者方法

return
方法返回值

short
16位数字

static
表示在类级别定义,所有实例共享的

strictfp
浮点数比较使用严格的规则

super
表示基类

switch
选择语句

synchronized
表示同一时间只能由一个线程访问的代码块

this
调用当前实例或者调用另一个构造函数

throw
抛出异常

throws
定义方法可能抛出的异常

transient
修饰不要序列化的字段

try
表示代码块要做异常处理

void
标记方法不返回任何值

volatile
标记字段可能会被多个线程同时访问,而不做同步

while
while循环

注释

注释作用:标识程序是干什么的,以及它是如何构建的。注释帮助程序员进行相互沟通以及理解程序。注释不是程序设计语言,所以编译器编译程序时忽略它们。

接口和类别
Java自带了创建接口的类别,可以这样使用:

public interface Deleteable {
void delete();
}

这段代码的意思是任何实现(implement)Deleteable接口的类别都必须实现delete()方法。每个类别对这个方法的实现可以自行定制。由此概念可以引出很多种使用方法,下面是一个类别的例子:

阅读全文

与android智能指针相关的资料

热点内容
单片机如何实现电气隔离 浏览:790
重生到建国初期卖军火的小说 浏览:48
php微信接入 浏览:274
隐喻pdf 浏览:446
怎么打开cuda编译器 浏览:216
linux命令vmstat 浏览:568
vc编译有错误 浏览:3
串口服务器设置云透传 浏览:215
日本有剧情的电影 浏览:62
主角可以进入自己拍的影视世界小说 浏览:904
程序员那么可爱陆漓签协议 浏览:111
c计划成龙电影 浏览:937
吃了人参到处搞的电影 浏览:883
javadefault编译报错 浏览:136
python子类继承父类意义 浏览:637
男主汽车坏了女主被上了 浏览:535
电子表格app叫什么 浏览:101
有个女人拉着一把柴进城叫什么电影 浏览:480
服务器没应答怎么回事 浏览:793
鬼媾人插曲叫什么名字 浏览:183