欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    java入门基础.docx

    • 资源ID:990882       资源大小:670.44KB        全文页数:95页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    java入门基础.docx

    JAVA从入门到精通理想情况下,在阅读本书前,你应该对Java程序语言已经有了相当程度的掌握。但或许你已经很久没有用Java,或者你只是想通学习Java知识来进行手机游戏编程。如果你属于上述情况,那么本教程正是为你准备的。本教程不是要教你Java的所有细节,因为已经有大量的优秀书籍在做这些工作。相反,本教程只是想为你提供开发手机游戏程序所需的核心JaVa知识。1. 1Hello,World!学习一门语言的最好方法是直截r当地去看看一个真正的程序是如何编写的。与传统介绍性的语言实例一样,这里是一个的JaVa版的经典的“Hello,Workr程序。classHelloWorldpublicstaticvoidmain(Stringargs)System.out.printin("Hello,World!");有必要指出的是,这个程序并不是为了在手机上运行而设计的。记住,本教程是一个一般性1.JaVa编程入门,而不是专门针对手机开发的。事实上,本教程所涉及的大部分实例都是在JaVa应用程序的命令行运行的,它们是所有JaVa程序中最简单的。Java编译器(javac)编译HeIloWorId程序后,你可以在Java解释器中运行它了OJaVa编译器生成了一个叫做“Hell。WOrkl.class”的可执行文件。这个命名规则可能看上去有点怪,因为事实上大多数程序语言都是用.exe作为可执行程序的扩展名。JaVa偏偏没有这样。按照JaVa而向对象的特性,所有JaVa程序都存储在JaVa类中,它们在JaVa运行环境中作为对象被生成并执行。在命令行中输入"javaHelloWorld",就可以运行HelloWorld程序。如果已经安装了JaVa软件开发包(SoftWareDeVek)PmenKit,SDK),计算机屏幕上会显示出aHello,World!"。为了彻底理解在HeIk)WorkI中发生的情况,让我们检查程序中的每行代码。首先,必须要明2. Java非常倚重于类。事实上,HeIk)WOrId的第一行语句就揭示了HeIk)WOrkl不仅仅是一个程序,而且是一个类。通过进一步查看类实体中的语句,你可以看到这个类的名称被定义为HelIoWorIdoJaVa编译器用这个名称作为可执行输出类的名字。HeIk)WOrkl类包括一个成员方法。现在,你可以把这个方法看作一个和类关联的标准程序方法。HenoWorld中这个唯一的方法叫做main(),如果你曾经用过C或C+,那么你应该对它很熟悉。类在JaVa解释器中执行时,是从main。方法并始的。main()方法定义为带有一个Void返回类型的“publicstatic"o"public”意味着该方法可以在类内和类外任意地方调用。"sialic”意味着该方法在这个类的所有实例中都是相同的。返回类型“void”意味着main()没有返回值。main()方法只有一个参数Stringargsoargs是一个String对象的数组,表示程序执行时所传递的命令行参数。由于HelloWorld没有使用任何命令行参数,所以可以忽略args参数。在本教程后边,你可以学到更多关于字符串的知识。HelloWorld类执行时会调用main()方法。main。只包含一行语句,用来把消息“Hello,World”作为标准输出流打印到屏琴上,如下所示:System.out.printIn("Hello,World!");由于对象嵌套,这条语句乍看上去有点混乱。为了帮助你把它弄清楚,我们从右向左来分析这句话。首先注意到这条语句的结尾是一个分号,它是从C/C+借用过来的标准的JaVa语法。再左边可以看到一对括号中的字符串“Hell。,WOrkI!”,这表明它是一个方法调用所用到的参数。实际上,这个被调用的方法就是out对象的PrinUn()方法。Println()方法和C中的PrinIf方法很相似,只不过它是在字符串结尾附加一行新的字符(n)。OUt对象是SyStem对象的一个成员变量,用来表示标准输出流。最后,System对象是Java环境中封装系统功能的一个全局对象。这基本上就是HelIoWoHd类的全部内容,它是我们的第一个JaVa程序。如果你对HelloWorld类的说明还不是很明白,那也没什么关系。我们没有对JaVa语言进行说明就开始介绍HeIIoWork1,仅仅是为了让你到实践中去学习Java代码。木教程剩下的部分更多是对Java语言的基本原理进行结构化的讨论。1.2标记当你提交一个Java程序给Java编译器时,编译器解析文本并提取每个单独的标记。标记(oken)是语言中对于编译器有意义的最小元素,它定义了JaVa语言的结构。JaVa包含的所有标记又叫做JaVa标记集(JaVatokenset)。JaVa标记集可以分为5类:标识符、关键字、字而量(literals)运算符以及分隔符。JaVa编译器也可以识别并丢弃注释和空白。Java编译器在标记化一个源文件时丢弃了所有注释和空白。得到的结果标记被编译成与机器无关的JaVa字节码(bytecode),它可以在一个有解释能力的JaVa环境中运行。字节码符合JaVa虚拟机的要求,Java虚拟机把处理器间的差异归结成一个虚拟处理器。记住,一个有解释能力的Java环境可以是JaVa命令行解释器,也可以是JaVa浏览器,还可以是本书大多数示例所用到的支持Java功能的手机。1.2.1 标识符标识符是表示名字的标记。这些名字可以指定给变量、方法和类,使得编译器能够唯一地识别它们。程序员为这些标识符起了一些有含义的名字。HelloWorld是一个标识符,它分配名称HelIoWorld给HelloWorldjava源文件中的类。尽管在Java中你可以为标识符起一些有创意性的名称,但是这里还是有些限制。所有Java标识符都区分大小写,而且必须以字母、下划线J)或者$开头。字母包括大写字母和小写字母。后边的标识符字符可以包括数字。到9。对标识符还有一个限制是,不能使用我们在下一部分列出的Java的关键字。表A.1是一个合法和不合法标识符名称的对比表。表.1合法和不合法的Java标识符合法不合法HeIloWorldHello(UseSaspace)HLMOmHi-Mom!(usesaspaceandpunctuationmark)heyDude33heyDude(bcginswithanumeral)Tallsho11(thisisaJavakeyword)poundage#age(doesnotbeginwithletter)除了上述对JaVa标识符命名的限制外,你还应该遵循以下格式规范从而使你的程序更加简单、更加一致。命名多个单词组成的标识符的时候,除了名字中间的每个单词的首写字母大写外,其他全部用小写,这是JaVa标准的命名规范。例如,变量toughGuy是正确的JaVa格式,而toughguy、TOUghGUy和ToUGHGUY都不合乎这种格式规则。这种规则不是一成不变的,它只是一种应该遵循的良好规则,因为大多数的JaVa代码都遵循这个规则。1.2.2 关键字关键字是Java为了特定的用途而保留的预定义标识符,只能以受限制的、特定的方式使用。下面列出了Java中保留的关键字:abstractdoubleintStrictfpbooleanelseinterfacesuperbreakextendslongswitchbytefinalnativesynchronizedcasefinallynewthiscatchfloatpackagethrowcharforprivatethrowsclassgotoprotectedtransientconstifpubliccontinueimplementsreturnvoiddefaultimportshortvolatiledoinstanceofstaticwhile除了这些关键字外,JaVa还保留了null,true和false这几个词,所以它们也是受限的。1.2.3 字面量以固定不变的方式使用的程序元素,叫做字面量或常量。字面量可以是数字、字符或字符串。数字字面量包括整数、浮点数和布尔量。字符型字面量总是指一个UniCode字符。包括多个字符的字符串也看作是字而量,尽管它们在JaVa中以对象的形式实现。依笈拉Unicode字符集是一个16位的字符集,它取代了ASCII字符集。因为它是16位字符集,所以它有足够的条目来表示其他语言中众多的符号和字符。1 .整数型字面量整数型字面量是JaVa程序中最常用的字面量。整数型字面量主要有三种不同的格式:十进制、十六进制和八进制。这些格式对应字面量所使用的数字系统的基本类型。十进制字面量的表现形式就是普通的数字,没有什么特别注意的地方。十六进制数的表现形式是以Ox或OX开头,表现方法与C/C+中很相似。八进制数的表现形式是在数字前加0。例如十进制数是12的整型字面量在JaVa中用十进制表示是12,用十六进制表示是OXC,用八进制表示是014。整数型字面量缺省存储为int型,它是32位的有符号值。如果你需要一个很大的数,可以在数字末尾加上1或L,把整型字面量强制存储为long型,如79L。Iong型是64位有符号值。2 .浮点型字面量浮点型字面量指的是像3.142这样带小数部分的十进制数。它们可以用标准的或特殊的符号表示,就是说数字563.84也可以写成5684e20同整型字面量不同,浮点型字面量缺省是64位的double型。如果你知道64位没有必要,也可以选择使用小一点的32位的Aoai型。指定为float型需要在数字末尾加上f或F,如5.6384e2f°如果你是个注意细节的人,你也可以明确指明你想为你的字而量选择double型作为存储单元,如3.142d.但由于浮点数缺省存储已经是double型,这个后缀也就没什么必要了。开垓杠不因为本教程是Java编程的入门基础,所以我介绍了浮点数字面量。然而,值得注意的是在MlDP(移动信息设备平台,它是手机所用到的Java设备平台)中不支持浮点数据类型和字面量。换句话说,在Java手机游戏代码中,不支持double型和float型。3 .布尔型字面量如果你使用过C/C+,那么肯定会非常喜欢布尔型字面量。在C中没有boolean型,也没有布尔型字面量,用整数1和0替代布尔型中的真和假。JaVa通过提供b。Iean型解决了这个问题,boolean型有两种状态:真或假。无疑,JaVa语言中的这两种状态用关键字true和false表示。JaVa编程中,布尔型的字面量和整数型字面量一样常用,因为它们几乎出现在每一种类型的控制结构中。当你必须表示有两种可能的值的一个条件或状态的时候,boolean类型总是你所需要的类型。在这部分稍后你将了解到更多有关b。Iean类型的知识。现在,只需要记住两个布尔型字面量:1rue和false04 .字符型字面量字符型字面量表示单个的Unico加字符,是由一对单引号括起来。特殊字符(控制字符和不能被打印的字符)用反斜杠("”)加字符表示。特殊字符的一个典型例子就是n,它在打印输出时强制从新的一行开始。表A.2显示了Java支持的特殊字符。表A.2JaVa支持的特殊字符5三一示方法反斜杠W续行符头退格b回车r换页f水平制表符Vt换行Nn单引号,双引号uddddUnicode字符Vidd八进制数一个UniCode字而量的例子就是u0048,它是字符“H”的十六进制表示。相同字符用八进制表示就是110。开货板示如果想了解更多有关Unicode字符集的信息,可以浏览Unicode的站点http:Www.unicode.Orgo5.字符串字面量字符串字面量表示多个字符,是由一对双引号括起来。不像本教程中介绍的其他字面量,Java中字符串字而量是通过String类来实现的。JaVa中对于字符串字面量,先生成String类的实例,然后用双引号括起来的字符指定它的内容。从实用角度讲,JaVa用对象来实现字符串实际上并不重要。这里要提到它的原因是为了说明JaVa正是面向对象的。1.2.4 操作符操作符表示的是对数据对象或对象执行的特定赋值或计算。这些操作数可以是字面量,变量或者有返回值方法。Java支持以下操作符:+-*/%&I八&&II!<><=>三«»>»=?00-=+=-=*=/=%=&=I=I=«=»=»>=.()()仅仅是看看这些操作符,对我们如何使用它们可能帮助不大。不用担心,在本教程后边会了解到更多关于操作符和它们的使用。1.2.5 分割符JaVa编译器通过分割符来获知如何对代码进行分组。例如,一个列表中的项目用逗号分割,就像一条语句中项目列表一样。JaVa支持以下分割符:;,:1.2.6 注释和空白在本教程前面已经知道Java编译器在标记化一个源文件时丢弃了所有注释和空格。你可能想知道“什么是空白?如何支持注释?"。首先,空白包含空格、制表符和回车。所有空格、制表符和回车都被JaVa编译器当作注释丢弃。注释有3种不同的定义方式,如表A.3所示。表A.3JaVa支持的注释类型使用类型用法/注释*/在建和*/间的所有字符被忽略掉H注释后到行结尾的所有字符被忽略掉产*注释*/和/*/一样,只是javadoc工具能够把注释自动生成文档如果你用C语言编写程序,那么你对第一种类型的注释(/*注释*/)应该很熟悉了。编译器忽略注释分割符/*和*/间的所有字符。如你果使用过C+,那么你第二种类型的注释(注释)也应该很熟悉了。编译器忽略出现在注释分割符后到行结尾的所有字符。这两种注释类型是从C和C+中借鉴的。最后一种注释类型(/*注释*/)和C的注释风格一样,只是它能被JaVa文档生成工具JaVadoC使用,从源码中自动生成文档。下面是使用各类型注释的一些示例:*ThisisaCstylecomment.*/ThisisaC+stylecomment.*Thisisajavadocstylecomment.*/1.3 数据类型数据类型是任何程序语言都具有的基本概念之一。数据类型定义了有解释信息能力的存储方法来解释信息。数据类型与内存中的存储变量紧密关联,因为一个变量的数据类型决定了编译器如何解释内存中的内容。为了在内存中产生一个变量,必须要为这个变量声明一种类型和提供一个唯一标识变量的标识符。JaVa声明变量的语句如下:TypeIdentifier,Identifier;声明语句告诉编译器在内存中为一个名称为"Identifier"类型为“Type”的变量分配空间。中括号中的可选项idemifier表明可以声明多个相同类型的变量,它们彼此间用逗号隔开。最后,在所有JaVa语句中,声明语句用分号结束。Java数据类型可以分为两类:简单型和复合型。简单数据类型是核心类型,不是从其他类型派生而来。整型、浮点型、布尔型和字符型都是简单型。另一方而,复合型是以简单型为基础,包括字符串、数组和通用的接口和类。在本教程后边可以学习到数组相关内容。1.3.1 整数类型整数类型用有符号的整数数字表示。共有4种整数类型:byte、short,int和Iong。每种类型在内存中所占用的空间不同,如表A.4所示。表A.4Java整数类型类型占用空间by(e8bitsshort16bitsint32bitslong64bits用前面讲过的声明语法来声明整数型的变量。以下是一些整数型变量的声明示例:inti;shortrocketFuel;longangle,magnitude;bytered,green,blue;1.3.2 浮点类型浮点数类型用带小数部分的数字表示。这里有两种浮点类型:noai和double。floai类型存储32位单精度数字,double型存储64位双精度数字。浮点型变量的声明和整数型变量的声明非常相似。以下是一些浮点型变量的声明示例:floattemperature;doubleWindSpeed,barOmetricPressure;开放枚不在MIDP中不支持double型和float型,所以在JaVa中开发手机游戏时也不能使用。这并不是太可怕的限制,因为浮点计算效率太差,所以在游戏开发中才不能使用。1.3.3 布尔型布尔型(boolean)用于存储两种状态之一:真或假。你可以把boolean型当作一位的整数(因为1位可以表示两个可能的值:1或0)。然而,不是用1和0表示,而是用JaVa中的关键字IrUe将false表示。用boolean型声明布尔值:booleangamever;1.3.4 字符类型字符数据类型用于存储一个UniCode字符。因为UniCOde字符集是由16位值组成,所以Char类型被存储为16位无符号整数。生成Char类型变量的方法如下所示:charfirstlnitial,lastinitial;请记住Char类型只是用来存储单个字符。如果你有C/C+背景,你可能试图生成一个Char类型数组来构成字符串。JaVa中就没有这个必要了,因为是通过String类来处理字符串的。并不是说你不能生成字符数组,而是说不应该把一个字符数组当作字符串来用。C/C+对字符数组和字符串没有区分,但在Java中则不然。1.4 代码段和作用域Java中源代码用大括号(“”和“”)分成段。在大括号中的内容可以作为一个代码段,或多或少独立于括号外的内容。代码段从逻辑上来讲不重要,但它们是Java语言的语法必要组成部分。如果不用大括号,编译器很难识别一段代码在哪里结束,而另一段代码从哪里开始。从纯粹的美学角度来讲,如果不用大括号,对于你和其他人来说也很难读懂你的代码和明白这些代码要完成的使命。括号用来把有关系的语句组合在一起。你可以把一对括号间的内容当成一条语句来执行。事实上,对于外层的程序段来说,内层的程序段看上去确实像一条语句。可是,程序段是什么?程序段简单来说就是一部分的代码。程序段被组织成层级关系,则意味着代码可以划分成独立的程序段嵌套在其他程序段中。一个程序段可以包含一个或多个子程序段。用缩进来区分不同的程序段是JaVa语言中的标准形式。每次你输入一个新的程序段,就应该用一些空格(两个比较合适)来增加代码的缩进量。当你删除一个程序段,就应该减少代码的缩进量(退两格)。这是许多程序语言已形成的习惯。然而,缩进只是形式上的问题,与语言的技术无关。即使你没有做任何的缩进,编译器还是能够产生正确的输出。缩进只是为了程序员使用,与编译器无关,它只是使代码看上去更加简单易懂。以下就是JaVa中一个正确的缩进程序段。for(inti-0;i<5;i+)if(i<3)(System.out.printin(i);以下是没有缩进的相同代码:for(inti=0;i<5;i+)if(i<3)System.out.printin(i);)第一部分代码通过使用缩进使程序条目很清晰,很显然if语句是嵌套在for循环中的。而第二部分代码对于程序段间的关系没有任何看得见的线索。如果不知道if语句和for循环也不必担心,在本教程后边会学到很多相关知识。作用域的概念和程序段关联的很紧密,在Java中使用变量的时候它也非常重要。作用域指的是一段程序如何影响变量的生命周期。程序中声明的每个变量都和作用域相关,也就是说变量只能在程序的特定部分生效。作用域由程序段决定。为了更好地理解程序段,我们再回过头来看看前边学过的HelIOWOHd.HelloWorld类是由两个程序段组成。外层的程序段是定义HelloWorId类的程序段。classHelloWorld)类程序段在JaVa中非常型要。几乎所有有趣的内容都和类有关或者就属于一个类。例如,定义在类中的方法就属于类本身。从语法和逻辑上讲,JaVa中的每件事情都发生在类中。再回到HelloWorld,内部的程序段定义了main()方法,如下:publicstaticvoidmain(Stringargs)内部程序段被认为是嵌套在外部程序段中的。定义在内部程序段中的所有变量都只属于内部程序段,对于外部程序段是不可见的。变量的作用域定义在内部程序段中。为了更好的理解作用域和程序段,来看一个HowdyWorId类的例子:classHowdyWorld(publicstaticvoidmain(Stringargs()(inti;rintMessage0;)publicstaticvoidprintMessage()intj;System.out.printin("Howdy,World!");)OOHoWdyWorki类包含两个方法:main。和PrinlMeSSage()。通过Helk)World类,我们应该很熟main。方法了。但本例中稍有不同,它定义了一个整数类型i并调用了PrinlMeSSage()方法。PrinlMeSSageo是一个新的方法,它声明了一个整数型变量j并且打印消息“Howdy,World!”到标准输出流,就像HelIoWorld中main()方法所做的一样。你可能已经知道HowdyWorld的输出结果和HelloWorld相同,因为调用PrimMeSSageo方法的结果是现实一行文本信息。你可能没有注意到在每个方法中所定义的整数类型的作用域。定义在main。方法中的整数变量i的作用域限制是在main。方法内。main。方法定义在大括号包含的方法内(方法程序段)。同样,整数变量j的作用域限制是PrintMeSSageo方法内。这两个变量作用域的重要性体现在当变量在各自的作用域以外是不可见的。HowdyWorld类程序段对于这两个整数变量一无所知。而且main。不知道j的任何情况,而PrinIMeSSage()也不知道i的任何情况。在其他程序段代码中嵌套程序段代码时,作用域就变得更加重要。下面的G。OdbyeWOrkl类就是变量嵌套在不同作用域的一个很好的示例:classGoodbyeWorldpublicstaticvoidmain(Stringargs()(inti,j;System.out.printin("GoodbyezWorld!");for(i=0;i<5;i+)intk;System.out.printin("Bye!");整数i和j的作用域都在main。中。可是整数k的作用域限制在for循环中,在这个程序段以外是不可见的。换句话说,i和j在for循环中也是可见的。也就是说作用域的影响是从上到下的,定义在外部作用域的变量在嵌套作用域内也是可见和可用的,而定义在嵌套作用域内的变量被限制在那个作用域里。在声明变量时,注意变量的作用域也很重要,它不仅仅是可见度的问题。决定了变量的可见度,也就决定了变量的生命周期。也就是说当程序执行离开作用域时,变量实际上被释放了。再看一下GOodbyeWOrld这个例子:在程序执行到main。方法中时,为整数变量i和j分配了存储空间。当进入fo循环程序段时,为整数k分配了存储空间。当程序执行完for循环程序段时,k所占用的内存空间被释放掉,变量也被释放掉。当程序执行完main()时,在它作用域内的所有变量(i和j)都被释放掉。在涉及到类时,变量的生命周期和作用域的概念甚至会变得更重要。1.5 数组数组是为了存储相同类型的一列项目所提供的存储结构。数组项目既可以是简单的也可以是复杂的数据类型。数组也可以是多维的。JaVa数组用中括号来声明:。下面就是JaVa中一些数组声明的例子:intnumbers(;charletters;Ionggrid(;如果你熟悉其他语言中的数组,你可能会对方括号中没有数字来指定数组项目的数量而感到困惑。Java不允许在声明一个变量数组时指定这个空数组的大小。通常你必须用new操作符明确设置数组的大小或在生成数组时指定一列项目。你既可以在变量类型后,也可以在标识符后放置中括号。下面是声明变量并设置其大小的两个示例。一个用到了new操作符,一个是在数组声明中指定一列项目。charalphabet-newchar26;intprimes=7,11,13;JaVa中也支持像堆栈和哈希表这样结构更复杂的项目存储列表。与数组不同,JaVa中这些结构像类一样使用。1.6 字符串Java中的字符串是通过调用一个String的特殊类来处理的。甚至字面量字符串也是通过一个实例化的String类管理的。一个类的实例化简单讲就是一个基于这个类所生成的对象。以下是JaVa1. String类的声明:Stringmessage;Stringname=,Mr.Blonde"1.7表达式和操作符在生成了变量后,你通常都会想要用它们去做点事情。操作符使你能完成对数据对象或时象的赋值或计算。操作符使变量和字面量能够构成表达式。一个表达式可以被认为是一个程序等式。更正式地说,一个表达式就是一个或多个数据对象(操作数)和零个或多个操作符产生出一个结果。下面是一个表达式的例子:X=y/3;在这个表达式中,X和y是变量,3是字面量,=和/是操作符。这个表达式讲述的是变量y被4.用除法操作符(/)除,使用赋值操作符(=)将结果存储到x。注意表达式是从右到左描述的。虽然这种从右到左的表达式分析方法在显示赋值操作很有用,但实际上大部分的JaVa表达式都是从左到右运行的。在下一节你会更好的体会这一点。1.7.i运算符的优先级即使JaVa表达式通常是从左到右运算,但没有其他规则的话,这里仍然会多次出现表达式结果不确定的情况。下面这个表达式说明了这种情况:表达式严格按照从左到右赋值的话,乘法运算符2*6首先执行,结果是12。然后执行加法运算符12+16,结果是28。然后执行除法运算符28/4,结果是7。最后执行赋值运算x=7,变量X的值被指定为7。如果你对其他语言的运算符优先级有经验的话,你可能已经对这个表达式的计算产生疑惑,你的理由很充分,因为它错了。问题就是表达式使用简单的从左到右运算可能会产生不确定的结果,因为还有赖于运算符顺序。这个问题的答案和运算符优先级相关,它决定了运算符运算的先后顺序。每个Java运算符都有一个相应的优先级。下面是Java中所有运算符按照优先级从高到低排列的列表。在这个运算符列表中,一个特定行中的所有运算符都有同样的优先级。每行的优先级水平从上到下递减。这就意味着运算符口的优级比运算符*的高,但和运算符O的优先级一样。(>6.«»>»表达式运算仍然是从左到右,只不过前提是在相同优先级的运算符之间。否则,优先级高的运算符要在优先级低的运算符之前计算。知道这一点,再来看同样的表达式。2*6+16在对表达式使用从左到右计算前,先来看看是否有运算符的优先级不同。确实有不同的优先级。乘法(*)和除法(/)都是最高的优先级,而接下来是加法(+),然后是赋值运算符(=)。因为乘法和除法运算符具有相同的优先级,所以从左向右计算。你首先要执行乘法运算2*6结果是12。然后执行除法运算16/4,结果是4。执行完这两步运和后,表达式就像这样:X-12+4;因为加法运算符比赋值运算符有更高的优先级,所以接下来执行加法操作12+4,结果是16o最后,执行赋值运算x=16,结果是数值16被赋给变量X。如你所见,使用操作符优先级在表达式计算中产生不同的结果。为了从另一个角度支持这个观点,我们再来看一个使用括号分组运算的表达式:X=2*(11-7);没有分组的括号的话,应该先执行乘法运算,再执行减法运算。然而,根据优先级列表,()运算符在所有其他运算符前。所以先执行减法11-7,生成4,接下来的表达式为:2*4;表达式剩余部分是很简单地乘法运算和赋值运算,把生成的8赋给变量Xo整数有三种类型的运算符可以执行:一元运算符、二元运第符和关系运算符。一元运算符只能对一个整数起作用,二元运算符要对两个运算符生效。一元运算符和二元运算符通常返回整数结果。关系运算符虽然是对两个运算符起作用,但是返回结果不是整数而是布尔值。一元和二元整数运算符通常返回int类型。对于包括byte、Short和int的所有运算都是int。这个规则只有在一个操作数是long型时才会例外,这种情况下的运算结果是long类型。1.一元整数运算符一元整数运算符只针对单一整数。表A.5列出了一元整数运算符。表A.5一元整数运算符描述运葬符自增+自减-负整数-按位求补一自增和自减运算符(+和-)对整数变量加一和减一。这两种运算符既可以用作前缀形式也可以用作后缀形式。前缀运算符在表达式运算前生效,后缀运算符在表达式运算完成后生效。前缀一元运算符放在变量前,后缀一元运算符紧跟在变量之后。下面是这两种类型的示例:y=+x;Z-X-;第一个例子中X是自增前缀,也就是说在赋给y前X要先自增加。第二个例子中的X是自减后缀,也就说在赋给Z以后X才会自减少。后一个例子中,X在自减少前把值赋给z。一元负整数运算符(一)用来改变整数值的符号。这个操作符正像它的名字一样简单,如下例所示:X=8;y-;这个例子中,X指定的字面量值是8,然后取负,然后赋给y。结果值就是-8。JaVa中最后一个一元整数运算符是按位求补运算符,它执行一个整数的按位取反。按位取反就是说数字中的每一位都被反转。换句话说,就是所有二进制数0变成1,所有二进制数1变成0。看一个与负数运算符非常相似的一个例子:X=8;y=;这个例子中X再一次被指定字面量的值为8,但在赋给y前对它按位取反。这意味着什么?好,如果不考虑整数如何在内存中存储的细节的话,它意味着变量X的所有位全部取反,生成结果是十进制数-9。这个结果和这样一个事实有关:负数在内存中通过一种叫做补码的方式存储(参见下面的开发提示)O五皿二出整数数字以一系列的二进制位存储在内存中,这些二进制位的值是0或1。如果一个数字最高位的值是1,那么这个数被认为是负数。因为按位取补把一个数的所有位求反,包括数字的符号位(也就是最高位)。二元整数运算符对一对整数生效。表A.6列出了二元整数运算符。浅A.6二元整数运算符SS运算符加+减-乘*除;模除%位与&位或I位异或左移«右移>>用零来填充右移后所留下的空位>>>加减乘除(+、-、*和/)做了希望它们做的事情。需要注意的是除法运算,因为你正在处理的是整数,除法运算符返回的是一个整数约数。万一除法结果中有余数,用模除运算符得到余数。数学上用O作除数,结果是一个无限大的值。因为表示无限大的数字对于计算机来说是个大问题,所以用O作除数来进行除法和模除,结果会报错。更具体的说,运行过程中会抛出异常。位与、位或和位异或(&、|、)对一个整数的每一位起作用。在一个整数用来作为一个位域时这些运算符有时会有用。用一个整数来表示一组二进制标记就是这样一个例子。由于一个im类型是32位的,所以一个整数可以表示32个不同的标记。左移、右移和右移补零(<<、>>、»>)运算符对整数中的每一位移动一个指定数量。下面就是使用这些运算符的例子:X«3;y»7;z»>2;第一个例子中,整数变量X的每一位都向左移3位。第二个例子,y的每一位向右移7位。第三个例子显示了z向右移动2位,用O来补充最左边的位置。这几个例子中,你可能想知道右移和右移补零运算符之间的区别。右移运算符用零来填充最左边的位,就和右移补零运算符一样了吗?很好,在处理正数时,两个运算符没什么区别,它们都是用零来填充最高位。在移动负数时就会产生差异。还记得负数的最高位是1吧。右移运算符保留最高位不动,只对剩下的31位右移生效。这种行为产生的结果对于负数和整数非常相似。这样,-8右移一位的结果是4。另一方面,右移补零运算符用零来补充右移留下的空位,包括最高位。当这种移动用在负数时,最高位变成0,结果变成了正数。3.关系整数运算符整数运和符的最后一组是关系运算符,这种运第符的所有操作数是整数但返回类型是布尔型。表A.7列出了关系整数运算符。运算符小于<大于>小于等于<=大于等于>=等于=不等于!=这些运算符在两个整数间使用。1.7.3 浮点运算符和整数型运算符相似,浮点数也有3种类型的运算符:一元运算符、二元运算符和关系运算符。一元运算符只对个浮点数生效,二元运算符对一对浮点数起作用。一元和二元运算符的返回结果都是浮点值。关系运算符对两个浮点数起作用,但返回结果是布尔值。如果操作数是float类型,那么一元和二元浮点运算符返回一个float类型的值。可是如果操作数中至少一个是double类型,那么运算结果就是double类型了。由于MIDP不支持浮点数据类型,我们也就不去探讨关于浮点数学习中所遇到的一些细节问题了。只要记住它们和整数运算符看上去非常相似就足够了。1.7.4 布尔运算符布尔运第符对布尔类型数据有效,返回结果是布尔值。布尔运算符如表A.8所列:表A.8布尔运算符-5S运算符位与&位或I续表描述运算符位异或A逻辑与&&逻辑或Il非I等于二二不等于!=条件?:位运算符(&、I和八)在生成结果前先对表达式两边进行运算。如果不需要进行右边的计算的话,逻辑运算符(&&和ID可以避免右边的运算。为了更好的理解表达式间的不同,我们来看两个例子:booleanresult-isValid&(Count>10);booleanresult=isValid&&(Count>10);第一个表达式使用位运算符(&)做赋值。这个例子中,表达式两边都要计算,无论变量的值是否有效。第二个例子中,用到了逻辑与运算符(&&)。这次先要检查布尔值isValidb如果isValid是假,右边的表达式可以忽略,结论已经得出。这个运算符更有效率,因为表达式左边的false值已经能够确定整个表达式的结果是false0尽管逻辑运算符比位运算符更加高效,但有时候你可能还是需要位运算符来确保整个表达式得到运算。下面的代码示意了位与运算符对于完整地计算表达式是必不可少的:while(+×<10)&(+y<15)System.out.printIn(x);System.out.printIn(y);这个例子中,由于是位与运算符,所以第二个表达式(+y<15)在经过最近

    注意事项

    本文(java入门基础.docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开