我的Java故事

  我的Java故事

     Java是个纯美的语言,让人对它有着难抑的情感,我也是。

     我喜欢神秘的东西,学过很多的语言,可要是你问我:“你学的第一门计算机语言是什么”,我回答:“是Java”。

     记得是刚进大学没几天,学校的社团就开始了招新。当时,我心里就想象过很多次大学的社团。那是一个思想、激情碰撞的地方,有人会站在讲台上给你讲马克思共产主义理想,众人会为一个观点的分歧而争论得面红耳赤……大家都在寻找着心中的真理。

     在没有准备的情况下,几个人推开了我们寝室门,让我们入会。其实,一听是科技协会,真的觉得就是它。那天晚上,社团新会员大会,我和同寝室的同学一起去的。当时,带上了笔记本的,因为感觉社团的干部定会有很重要的讲话需要记下来。我们两个没敢坐前面,在中间的位置坐下。周围的人都不认识,心里只觉得这小子肯定很厉害。我们来得太早了,似乎早了半个多小时。看着台上走来走去的人,好像是干部,他们一定更厉害。总之,我感觉自己真的很崇拜这些人。他们在会上说的很多,我太有记得了,但是最重要的是他们要招新一届社团干部,并且希望大家自荐。说实话,当时大家可能都不太明白形势,好像没有人吱声。所以,就改在会后交自荐书。我和同学都写了自荐书,我没有写什么,无非就写自己高中的时候做过班委、学习还算努力、做事比较认真,也不晓得对不对。最后要走的时候,我们有点好奇或者迷糊,索性就去问那些干部,问问他们需要什么样子的人吧。

     他问:“会汇编语言吗?”。

     我说:“不会,信息技术课里听过。”。

     又问:“那你会Java语言吗?”。

     我说:“不会,没听过。是什么?”

     他讲了一些我听不懂的话……,我很白痴

     他问:“会Basic吗?”。

     我说:“在我初三时买的小霸王的多媒体机上学习过QBASIC,那时没看懂。高一的时候,信息技术课上也学了点,会写循环程序。后来,偶也会在同学文曲星上玩。”。              

     他问:“那你还会点计算机方面其他什么的?”

     我说:“在初2的时候,在通途建站家园上用过自助建站,接触了点网站建设,知道用别人写的网页代码。还有就是小学六年级就开始玩电脑游戏,初2开始喜欢玩星际争霸,高中由于学习,很少玩游戏。现在喜欢CS”。

     他告诉我们,回去以后等待他们筛选自荐材料,我们便走了。在回去的路上,我们俩说了一路,我心里却一个劲的冒着一字“Java”。

     不知道为什么,后来这人打电话给我,问我愿不愿意协会活动部部长了。那段时间,我兴奋了很几个晚上,想着“一级社团”、“部长”。感觉天上掉馅儿饼,我什么都不会嘛,怎么在做干部呢。那天晚上,我去了学校里的一个小书店,转着转着,老板问我:“同学你找什么书?我可以给你推荐。”。

     当时,脑子里很蒙,这里这么多书,那本适合我?可是,人家问我,我随口就说:“Java”,心想:管它呢,说不定不是什么神秘的东西,只是但愿自己没有出丑,如果他要是再问我些什么,我可就答不出来了。

     老板给我指向我旁边的一个书架的一层,说:“这里面有基本书还不错,你可以看看。”。

     我走到那书架面前,我第一次见到了书上写着的“Java”单词。

     原来,他念Java

     我抽出了书名叫《Java简明教程》的一本书,咖啡色的封皮,封面上一杯咖啡的图画,很优美。后来,我买了它,Java也就成了我学的第一门语言。     后来的事。我花了2个月看几乎每段话都要琢磨的书,因为我真的是第一次学习一门程序语言。因为太难速度太慢,为了能学快一点,我有的时候熄灯了还要继续看下去,不少时候看得打瞌睡,可能是高三的后遗症。即便今天再回想,真的很佩服自己那么执著。书上很多笔记,几乎是在记录自己的思考,有点笨的方法。

     今天,我再看了一次这本咖啡色书,又入了迷,我回忆起了关于我和Java的故事。

 

我把一些笔记抄到这里。

 

 

语法基础:

·变量的赋值与初始化,都是用赋值运算符“=”给变量赋值。对于整型变量来说,赋值可以用两种方式起同样效果。

     赋初值的形式。用两条语句完成。先定义,在赋初值。

     初始化形式。用一条语句完成。在定义的同时,赋给变量以个初始值。在定义时,也可以初始化多个变量,用逗号隔开。但也不是所有变量在定义时都需要初始化,也可以其中某些变量值定义不初始话

     注意:上面两种方法在定义常量或定义一个对象时,两者的差别很大。

·可以在一个语句里建立多个同一类型的变量,方法是在其后加上多个变量名,中间用逗号隔开。但不能以个语句中定义不同类型的变量。

·变量名与字符变量(char)不同。变量名只是指变量的名称;而字符变量是一种数据,也有变量名。如

Int a=18

Char a='a'

a是字符型变量,它同时也可以说是一个变量名。指定了其为字符变量类型,赋与了字符型常量。

·关键字final表示可以对变量赋值一次,且它的值一旦设定,便不再变化,即定义了一个常量。在Java中通常还是希望一个常量在某个类中的多个方法都是可用的,这种常量称为类常量。

·注意类常量定义在main方法的外部,则此常量也可以被这个类的其他方法使用。此外,如果同时被声明为public,那么其它类中的方法也可以使用这常量。

·Java中整型的范围与运行Java代码的机器无关。能在所有的机器上都有相同的运行结果,也正因此不同类型的范围是固定的。(这由于CC++

·注意在Java中没有无符号类型。

·C/C++不同,Java中没有long double长双精度型。

·使用float类型的原因是,某些极少数的情况下,需要稍微快速单精度数据或者需要大量存储这样的数据。

·所有的浮点计算都符合IEEE754规范。此外,有三种特殊的浮点值(常量):

正无穷大(Double.POSITIVE_INFINITY

负无穷打(Double.NEGATIVE_INFINITY

非数字(Double.NaN)——所有的“非数字”都是独特的,无法检测仪个特定值与其是否相等。

If(x==Double.NaN) //始终不会为True 

但是可以用If(Double.isNaN(x)) 方式来检测一个数是否是“非数字”

·转义字符:意思是将“/”后面的字符转变成另外的意思。有些是控制字符,有些是表示字符的字符,有的还可以表示操作符。转义字符后面的数字是Unicode字符集,而不是ASCII,这与C/C++不同。

·Unicode字符集:Unicode被设计用来处理世界上所有书面语言中的字符,它占2个字节。因此,可允许使用65536个字符。目前,大约有35000个字符被使用。而ASCII码只占1个字节,可允许128个字符。而普遍使用的ISO8859-1扩展的ASCII码集,也只能允许256个字符,它是Unicode的子集,更确切地说,它是Unicode编码表中的前256个字符。

·C++/C中可以依据ASCII码,使字符与整型数据相互赋值。而在Java中,只能给字符型数据赋与字符型常量。

·布尔类型数据不能被强制转换。

·强制类型转换又称显示转换,其语法是在一个数值或变量前加上带括号的类型名,但转换一定要超出目标类型的范围。

·自动类型转换又称隐式类型转换:转换总是转换总是向着表达数据类型更强的方向,并且在运算中转换总是逐个运算符进行的。

·遵守自动类型转换的原则。两个操作数:

只要有一个doble型,另一个转换成double型;

否则,只要一个是float型,另一个转换成float型;

否则,只要一个是long型,另一个转换成long型;

否则,两个操作数转换成int型。

自动转换的方向表:   char   short    int      long    

                                                                                    double

                                                                   float     

     转换从表达能力低的类型表达能力强的类型不会有信息损失,但反之,则会损失一些精度。

·布尔逻辑运算的规则是:从左至右运算,先求出运算符左边的表达式的值。||(或)运算中,如果为true,则整个表达式的结果为true,不必再对||运算符右边的表达式运算;同样,在&&(与)运算中,如果左边表达式的值为false,则不必对右边的表达式求职,整个表达式的结果为false。所以,可以利用此特点,产生高效的代码。

     由于&&||比关系运算符优先级低,所以一般情况下,先作关系运算再作逻辑运算。若先进行逻辑运算,则需要用括号改变运算顺序。   

·!”为逻辑非运算符,改变表达式的真假值,即逻辑运算的“非”。它的优先级比“==”和“=”都低。

·while循环体应用花括号括起来,特别是在有一个以上的语句时。否则,while的范围只到while后面第一条语句。这也说明如果只有一条语句,则可省略花括号。

·循环最先做的应该是循环变量初始化。

·数学表达式和常量。

     Math类包含了不同的数学函数静态方法:

          计算一个数的平方更,使用sqrt()方法。如y=Math.sqrt(x)

Xa次方的求方算法,如doble y= Math.pow(x,a)

Math类提供了常用的三角函数方法:

     Math.sin     Math.cos     Math.tan     Math.atan     Math.atan2

Math类的求指函数和它的反函数——自然对数的方法:

     Math.exp     Math.log

此外,还有两个常量:Math.PIMath.E

     Math类里的函数利用计算机浮点单元的例程来达到最快的性能。如果得到安全可测的结果比最快的性能更重要的花,应该使用StaticMath方法,它从“自由分别数学库”中实现其运算方则,保证了所有平台都可以得到相同的结果。

 

类:

·Java要求每个类都有父类。

·在同一个源程序文件中不能出现两个以上的public类,否则编译器会提示错误,叫你将第二个public类方在另一个文件中。

·接口是消息传递的通道。通过接口,消息才能传递到处理方法中进行处理。一个类实现多个接口,用逗号分开。

·abstract说明的抽象类,只能被继承,不能用它实例化一个对象。

·Java中自定义类实际是继承JavaObject类的子类。

·protected修饰的变量和方法,只有在同一个包中的子类才能访问,不同包的子类不能访问。

 

包:

·包是体现Java面向对象编程特性中的封装机制。同一个包中的类在默认情况下可以相互访问。在默认情况下,系统会为每一个.java源文件创建一个无名包,所有.java文件中定义的所有类都隶属于这个无名包,之间可以相互引用非private的域或方法,但这个无名包中的类不能被其他包中的类所引用和复用。

·一个类引用其他的类,无非是继承这个类或创建这个类的对象并使用它的域、调用它的方法。同一个包中的其他类,使用时在属性或方法前加上类名作为前缀;对于其他包中的类,则需要在类名前缀的前面加上包名前缀或用impor语句先将整个包加载到当前。

·当以个程序找不到它所需要使用的其他类的.class文件时,系统会自动到ClASSPATH环境变量所指明的路径去寻找,可以DOS下使用SET CLASSPATH命令。对Java Application程序,还可以通过为Java解释器设置参数来指定类文件路径。

接口:

·Java的接口与包类似,也是用来组织程序中各个类并调节它们之间的相互关系的一种结构。更准确地说,接口是用来实现多重继承功能的结构。因为JavaC++不同,只支持但以继承机制,所以引入接口概念。

·Java的接口中属性都是常量;方法都是没有方法体的抽象方法,没有定义具体具体操作,而需要在“继承”这个接口的各个类中完成。因而,接口定义仅仅是实现某一特功能的一组功能的对外规范。在Java中通常把接口功能的“继承”称为“实现”。interface是声明接口的关键字,implements是实现接口的关键字。

·接口只有public一个访问控制修饰符。使用public的是公共接口,而没有使用public的是接口只能被捅一个包中的类和接口使用。

·接口也有继承性,可以从其他接口extends方式继承而来,一个接口可以有多个父接口。

·接口中的属性都是publicfinalstatic属性的,方法都是publicabstract属性的,所以都可以省略,效果一样。接口中的方法只能给出方法名,返回值和参数列表。

·Java接口中的方法可以由Java语言书写,也可以由其他语言书写。后一种方法可以由native修饰符修饰。

·非抽象类中不能存在抽象方法。因此,非抽象的类都必须实现所继承接口中的所有方法。如果是抽象类,则不必实现该接口的所有方法,但该抽象类若有子类是非抽象的,则该子类必须要有抽象父类所实现接口中的所有抽象方法实现的方法体。如果实现某接口抽象方法的时,方法头不完全相同,则只会是重载了一个新方法,而不是实现。

·由于接口中的抽象方法的访问限制符被指定为public,所以类在实现必须显示使用public修饰符,不能再省略。否则,回被警告为缩小了接口中定义的方法的访问控制范围。

异常:

·异常定义:异常是一个在程序执行期间发生的事件,它中断正在执行的程序的正常的指令流。有许多种异常,如程序错误、空指针、数组溢出等。

·Java使用异常为方法异常中止和错误处理提供一个清晰接口。

·Java用面向对象的方法处理异常。每一种特定的运行错误都对应一种异常类,每一个异常事件由一个异常类的对象来代表。所有Java异常类都是系统类库Exception的子类。

·异常在Java语言中是以类的实例的形式出现。当一个方法发生错误时,这个方法创建一个异常对象,并把它传递给运行时系统即抛出异常。异常对象包含了有关错误的信息,这些信息包括错误的类型、在程序发生错误时的状态。

·Throwablejava.lang包中的一个类。它派生了两个子类ErrorException

     Error由系统保留,如动态链接错误(LinkageError)、虚拟机错误等,由Java虚拟机生成并抛出,通常java虚拟机不对这类异常处理。而只有Exception类的后代才可以被抛出,供应用程序使用。

     Exception类的子类有三个主要层次:

          Exception类直接派生而来的异常类,如AWTException类、ClassNotFoundException类等。

          I/O异常类。

          运行时异常类。

 

        

                         1.1 异常类的继承结构图

 

·非运行时异常是在Java运行时系统外的代码中发生的异常,必须在程序中进行处理,否则编译程序会指出错误。而运行时异常(也被称为被检查的异常),在程序中可以不处理,尽管它可以被捕获,而直接由运行时系统来处理。

·如果一个方法抛出异常且回避处理,这个异常将在调用堆栈中向下传递,直到被异常处理器处理。如果找不到这个异常处理方法,那么方法unCaughtException()方法会被当前进程的父进程ThreadGroup调用。

·异常类的构造函数的两种形式:public Exception()public Exception(String s)。第二个构造函数接受一个字符串参数,一般表示该异常对应的错误描述。

·通过异常处理的常用方法,可获取异常的信息。异常常用的3个方法:

     public void printStackTrace()或void printStackTrace(PrintStream):指出异常的类型、性质、栈层次及出现在程序中的位置。

     public getMessage():输出错误的性质。

     public toString():给出异常的类型与性质。

     其他方法:我们还可以从Object(所有对象的基类)获得一些方法,如getClass()获得者个对象的类,及其getName()toString()查询类的名字。

·通过catch语句捕获类型匹配的异常,类型匹配指的是异常类型与生成的常常对象完全一致或是它的父类。catch语句的排列顺序应该从特殊到一般,否则放在后面的catch语句块将永远执行不到。一个catch语句也可以处理多个异常类型,这时它的异常参数应该是这个多个异常类型的父类。

·try-catch-finally语句中,finally为程序提供了一个统一的出口。通常在finally语句块中进行资源的清除,如关闭打开的文件等。

·如果一个被调用的方法的在其定义中,未用try-catch-finally语句来对它产生的非运行时异常进行处理,则需要用throws声明它可能抛出的异常类型,以使异常可以被调用它的方法处理。否则,编译程序会指出错误。

·有时候会在catch语句里或其它地方,对得到异常对象重新抛出,抛给更高一级环境的异常捕获处理模块,如“throw e”。这时抛出的异常的有关信息仍为异常起源地的信息。如果要将当前堆栈的信息来填充原来的异常对象中的旧信息,则可调用fillInStackTrace()方法,如“throw e.fillInStackTrace()”,它丢失了起源地有关的信息。fillInStackTrace()返回的是一个Throwable对象,因此可能会使原来设计特别用来捕捉Throwable某个子类异常对象的句柄失去目标,而不被执行。

·如果在try块中产生异常,而未用catch块捕捉,且在finally块中有返回语句,则会造成程序正常返回而丢失异常。

·用try-finally处理异常时,如果try块出现的异常,在被上一级的catch块处理异常前,finally块中的代码又出现异常,那么try块的异常将不被处理,转而处理finally块中出现的异常,造成try块中的异常丢失。

 

参考:

学勤:《Java简明教程》,清华大学出版色20027月版

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章