Java 基础知识


Java基础知识 青软实训 王希涛 青软实训中心 Page 2 Java的起源 Java来自于Sun公司的一个叫Green的项目,其原先的目的是为家用消费 电子产品开发一个分布式代码系统,这样我们可以把E-mail发给电冰箱、电视机 等家用电器,对它们进行控制,和它们进行信息交流。开始,准备采用C++,但 C++太复杂,安全性差,最后基于C++开发了一种新的语言Oak(Java的前身) ,Oak是一种用于网络的精巧而安全的语言,Sun公司曾以此投标一个交互式电 视项目,但结果被SGI 打败。可怜的Oak 几乎无家可归,恰巧这时Mark Ardreesen开发的Mosaic和Netscape启发了Oak项目组成员,他们用Java编制 了HotJava浏览器,得到了Sun公司首席执行官Scott McNealy的支持,触发了 Java进军Internet。 Java的取名也有一则趣闻,有一天,几 位Java成员组的会 员正在讨论给这个新的语言取什么名字,当时他们正在咖啡馆喝着Java(爪哇)咖 啡,有一个人灵机一动说就叫Java怎 样,得到了其他人的赞赏,于是,Java这 个名字就这样传开了。 Page 3 我们为什么要用Java 因为Java是: ‹ 简单的 ‹ 面向对象的 ‹ 健壮的 ‹ 安全的 ‹ 解释的 ‹ 与平台无关的 ‹ 多线程的 ‹ 动态的语言 Page 4 我们为什么要用Java 简单的 ‹ Java最初是为对家用电器进行集成控制而设计的一种语言,因此它必须简单明了。Java语言的简单 性主要体现在三个方面: ‹ Java的风格类似于C++,因而C++程序员初次接触Java语言,就会感到很熟悉。从某种意义上讲, Java语言是C及C++语言的一个变种,因此,C++程序员可以很快地掌握Java编程技术。 ‹ Java摒弃了C++中容易引发程序错误的一些特性,如指针、结构、枚举以及内存管理等。 ‹ Java提供了丰富的类库,可以帮助我们很方便的开发Java程序。 Page 5 我们为什么要用Java 面向对象的 ‹ 面向对象可以说是Java最重要的特性,所以它支持继承、重载、多态等面向对象的特性。Java语言 的设计是完全面向对象的,它不支持类似C语言那样的面向过程的程序设计技术。 Page 6 我们为什么要用Java 健壮的 ‹ Java致力于检查程序在编译和运行时的错误。Java也是一种强类型的语言,其类型检查比C++还要 严格。类型检查帮助我们检查出许多开发早期出现的错误。Java自己负责内存管理,提供了垃圾 内存回收机制,有效的避免了C++中最头疼的内存泄漏问题。 Page 7 我们为什么要用Java 安全的 ‹ Java的安全性可从两个方面得到保证。一方 面,在Java语言里,删除了指针和释放内存等C++功 能,避免了非法内存操作。另一方面,通过Java的安全体系架构来确保Java代码的安全性。 ‹ 从一开始,Java就被设计成能够防范各种袭击,包括: – 禁止运行时堆栈溢出。例如,蠕虫等病毒常用的袭击手段 – 禁止在自己的处理空间之外破坏内存 – 未经授权禁止读写文件 – 许多安全特性相继不断的被加入Java中。 Page 8 我们为什么要用Java 解释的 ‹ Java代码是解释执行的,我们使用Java编译器将Java代码编译成字节码,这是一种中间代码,然后 由Java解释器解释执行。而C++程序是编译执行的,C++程序代码被编译为本地机器指令,然后执 行。 Page 9 我们为什么要用Java 与平台无关的 ‹ Java作为一种网络语言,其源代码被编译成一种结构中立的中间文件格式。只要有Java运行系统 的机器都能执行这种中间代码。Java源程序被编译成一种与机器无关的字节码格式,在Java虚拟机 上运行。 Page 10 我们为什么要用Java 多线程的 ‹ Java语言的一个重要特性就是在语言级支持多线程的程序设计。多线程就好像我们做一张桌子, 如果你一个人完成这张桌子—就好像单线程,那么你需要先做桌面,做完桌面后,再做4个桌子腿 ,如果现在有5个人来做桌子—在程序中开辟5个线程,其中1个人做桌面,另外4个人分别做4个 桌子腿,那么这两种方式效率的高低,相信大家都能区分出来。 ‹ 并发访问:同时5个人发出请求,若是单线程,则需要在队列中等待,若是多线程,5个请求可以 同时处理。 Page 11 我们为什么要用Java 动态的 ‹ Java的动态特性是其面向对象设计方法的扩展。它允许程序动态地装入运行过程中所需要的类, 这是我们采用C++语言进行面向对象程序设计所无法实现的。 ‹ 在C++程序设计过程中,每当在类中增加一个实例变量或一个成员函数后, 引用该类的所有子类 都必须重新编译,否则将导致程序崩溃。 ‹ Java从以下几个方面采取措施来解决这个问题。 – Java编译器不是将对实例变量和成员函数的引用编译为数值引用,而是将符号引用信息在 字节码中保存下来,传递给解释器,再由解释器在完成动态连接类后,将符号引用信息转 换为数值偏移量。 – 一个在存储器中生成的对象不在编译过程中决定,而是延迟到运行时由解释器确定。这样 ,对类中的变量和方法进行更新时就不至于影响现存的代码。 – 解释执行字节码时,这种符号信息的查找和转换过程仅在一个新的名字出现时才进行一次 ,随后代码便可以全速执行。在运行时确定引用的好处是可以使用已被更新的类,而不必 担心会影响原有的代码。如果程序连接了网络中另一系统中的某一类,该类的所有者也可 以自由地对该类进行更新,而不会使任何引用该类的程序崩溃。 – Java还简化了使用一个升级的或全新协议的方法。如果你的系统运行Java程序时遇到了不知 怎样处理的程序,Java能自动下载你所需要的功能程序。 Page 12 Java跨平台原理 Java的跨平台是通过Java虚拟机(JVM)来实现的。 Java源文件的编译过程 ‹ Java应用程序的开发周期包括编译、下载、解释和执行几个部分。 ‹ Java编译程序将Java源程序翻译为JVM可执行代码—字节码。这一编译过程同C/C++的编译有些 不同。 ‹ 当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的。因此, 在编译过程中,编译程序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证程序运 行。 ‹ Java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局, 而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创建内存布局,然后再通过查 表来确定一个方法所在的地址。这样就有效的保证了Java的可移植性和安全性。 Page 13 Java跨平台原理 Java解释器的执行过程 ‹ 运行JVM字节码的工作是由解释器来完成的。解释执行过程分三步进行:代码的装入、代码的校 验和代码的执行。 ‹ 装入代码的工作由“类装载器”(class loader)完成。 – 类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和 被其调用的类。当类装载器装入一个类时,该类被放在自己的名字空间中。除了通过符号 引用自己名字空间以外的类,类之间没有其他办法可以影响其它类。 – 在本台计算机上的所有类都在同一地址空间内,而所有从外部引进的类,都有一个自己独 立的名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效率,同时又保证 它们与从外部引进的类不会相互影响。 – 当装入了运行程序需要的所有类后,解释器便可确定整个可执行程序的内存布局。解释器 为符号引用同特定的地址空间建立对应关系及查询表。通过在这一阶段确定代码的内存布 局,Java很好地解决了由超类改变而使子类崩溃的问题,同时也防止了代码对地址的非法 访问。 ‹ 随后,被装入的代码由字节码校验器进行检查。校验器可发现操作数栈溢出,非法数据类型转换 等多种错误。 ‹ 通过校验后,代码便开始执行了。 Page 14 Java跨平台原理 Java字节码的两种执行方式 ‹ 即时编译方式:解释器先将字节码编译成机器码,然后再执行该机器码。 ‹ 解释执行方式:解释器通过每次解释并执行一小段代码来完成Java字节码程 序的所有操作。 ‹ 通常采用的是第二种方法。由于JVM规格描述具有足够的灵活性,这使得将字节码翻译为机器代 码的工作具有较高的效率。对于那些对运行速度要求较高的应用程序,解释器可将Java字节码即 时编译为机器码,从而很好地保证了Java代码的可移植性和高性能。 Page 15 Java跨平台原理 JVM规格描述 ‹ JVM的设计目标是提供一个基于抽象规格描述的计算机模型,为解释程序开发人员提供很好的灵 活性,同时也确保Java代码可在符合该规范的任何系统上运行。 ‹ JVM对其实现的某些方面给出了具体的定义,特别是对Java可执行代码,即字节码(Bytecode)的 格式给出了明确的规格。这一规格包括操作码和操作数的语法和数值、标识符的数值表示方式、 以及Java类文件中的Java对象、常量缓冲池在JVM的存储映象。这些定义为JVM解释器开发人员 提供了所需的信息和开发环境。Java的设计者希望给开发人员以随心所欲使用Java的自由。 ‹ JVM是为Java字节码定义的一种独立于具体平台的规格描述,是Java平台独立性的基础。 Page 16 Java跨平台原理 Java程序执行与C/C++程序执行的对比分析 ‹ 如果把Java源程序想象成我们的C++源程序,Java源程序编译后生成的字节码就相当于C++源程 序编译后的80x86的机器码(二进制程序文件),JVM虚拟机相当于80x86计算机系统,Java解释 器相当于80x86CPU。在80x86CPU上运行的是机器码,在Java解释器上运行的是Java字节码。 ‹ Java解释器相当于运行Java字节码的“CPU”,但该“CPU”不是通过硬件实现的,而是用软件实现 的。Java解释器实际上就是特定的平台下的一个应用程序。 ‹ 只要实现了特定平台下的解释器程序,Java字节码就能通过解释器程序在该平台下运行,这是 Java跨平台的根本。当前,并不是在所有的平台下都有相应Java解释器程序,这也是Java并不能 在所有的平台下都能运行的原因,它只能在已实现了Java解释器程序的平台下运行。 Page 17 Java编程基础 JDK目录结构 ‹ bin ‹ docs ‹ demo ‹ lib Page 18 Java编程基础 JDK ‹ JDK常用的工具: ‹ Javac Java语言编译器,输出结果为Java字节码 ‹ Java Java字节码解释器 ‹ Javap Java字节码分解程序,可以查看Java程序的变量以及方 法等信息 ‹ Javah Jni编程工具,用于从Java类调用C++代码。 ‹ AppletViewer 小应用程序浏览工具,并于测试并运行Java小 应用程序 ‹ Jar 打包程序 ‹ HelloWorld 实例 Page 19 Java编程基础 Java源程序的组成 ‹ Java是区分大小写的 ‹ 访问修饰符 ‹ 类的命名:从字母开始,可以使用字母和数字,但是不能使用Java 保留字。如果有多个单词组成,那么每个单词开头字母要大写,比 如MyJavaProgram。 ‹ 文件需要和我们的公有类名一样,而且需要以“.java”为扩展名。 ‹ Java的通用语法是:object.method(parameters) 即:对象.方法(参 数列表) ‹ 标识符是以字母、下划线(_)、美元符($)开头,后面可以是字母、下 划线、美元符、数字;Java中标识符长度不限;不能是关键字。 public class HelloWorld{ /*打印 “hello world” */ public static void main(String[] args){ String s = “Hello”; System.out.println(s + “Java World”); //打印 } } Page 20 Java编程基础 注释语句 ‹ 方法1:使用//在每一行前注释 ‹ 方法2:如果注释为多行,我们一般采用/*……*/包含所有的注释 ‹ 方法3:使用/**……*/作为自动产生文档 /** * Created on 2006-05-13 * * TODO To change the template for this generated file go to window * * Auther:Gordon Yang */ public class HelloWorld{ /*打印 “hello world” */ public static void main(String[] args){ String s = “Hello”; System.out.println(s + “Java World”); //打印 } } Page 21 Java编程基础 打印语句 ‹ 由于System.out.println()这种方法支持多达十几种数据类型的输出, 所以打印控制台的方法作为一种调试手段被十分广泛的应用在Java 的开发中。 public class HelloWorld{ /*打印 “hello world” */ public static void main(String[] args){ String s = “Hello”; char c = ‘c’; int i = 0; double d = 0.57d; float f = 0.11f; System.out.print(“String is :”); System.out.println(s); System.out.print(“char is :”); System.out.println(c); System.out.print(“int is :”); System.out.println(i); System.out.print(“double is :”); System.out.println(d); System.out.print(“float is :”); System.out.println(f); } } Page 22 Java编程基础 基本类型 ‹ Java定义了集中数据类型:整型、字符型、浮点型,总共8种基本类 型。 ‹ 整数:该组包括字节型(byte),短整型(short),整型(int), 长整型(long),它们是有符号整数。 ‹ 浮点型数:该组包括浮点型(float),双精度型(double),它们 代表有小数精度要求的数字。 ‹ 字符:这个组包括字符型(char),它代表字符集的符号,例如字 母和数字。 ‹ 布尔型:这个组包括布尔型(boolean),它是一种特殊的类型,表 示真/假值。 ‹ 简单类型的定义有明确的范围。 Page 23 Java编程基础 字节型(byte) ‹ 最小的整数类型是字节型。它是有符号的8位类型,数的范围是- 128~127。 ‹ 当我们从网络或文件处理数据流的时候,字节类型的变量特别有用 。 ‹ Byte参与运算时会自动转为int类型。 Page 24 Java编程基础 短整型(short) ‹ Short是有符号的2字节的整数,也就是16位类型,数的范围是- 32,768~32,767。 ‹ 它可能是Java当中使用的最少的类型了。这种类型主要使用于16位 计算机,然而这种计算机现在已经非常少了。 ‹ Byte类型可以直接赋给short类型。 Page 25 Java编程基础 整型(int) ‹ 最常用的整数类型是int。它是有符号的32位类型,数的范围是- 2,147,483,648~2,147,483,647。 ‹ Int类型的变量通常被用来控制循环及作数组的下标。 ‹ 任何时候我们的整数表达式包含byte,short,int,在进行计算以前所有 表达式的类型被提升(promoted)到整型。 长整型(long) ‹ Long是有符号的64位类型,它对于那些整型不足以保存所要求的数 值时是有用的。 ‹ 长整型的范围非常的大,比如计算光年。 Page 26 Java编程基础 字符型(char) ‹ Unicode定义的国际化的字符集能表示至今为止人类语言的所有字符 集。它是几十个字符集的统一,例如拉丁文、希腊语、阿拉伯语、 古代斯拉夫语、希伯来语等等,因此它要求16位。 ‹ Java中的char类型是16位,其范围是0~65,536,没有负数的char。 ‹ 我们所熟知的ASCII码的范围仍然是0~127,扩展的8位字符集ISO- Latin-1的范围是0~255。 ‹ 字符存储的时候会转换为相应的代码。 Page 27 Java编程基础 单精度浮点型(float) ‹ 单精度浮点型专指占用32位存储空间的单精度(single-precision) 值。 ‹ 单精度在一些处理器上比双精度更快而且只占用双精度一半的空间 ,但是当值很大或很小的时候,它将变得不精确。当我们需要小数 部分并且对精度的要求不高时,单精度浮点型的变量是有用的。例 如当表示美元和分时,单精度浮点型是有用的。 ‹ Java会默认小数位double型,float必须为0.13f这种格式。 双精度浮点型(double) ‹ 双精度型占用64位的存储空间。 ‹ 在一些现代被优化用来进行高速数学计算的处理器上双精度型实际 上比单精度快。所有超出人类能力的数学函数,如sin(),cos()和 sqrt()均返回双精度的值。 ‹ 当我们需要保持多次反复迭代的计算的精确性时,或在操作值很大 的数字时,双精度型是最好的选择。 Page 28 Java编程基础 布尔型(boolean) ‹ Java中的布尔型用来表示逻辑值,它的值只能是true和 false这两种。 ‹ Java中不能使用1或0来表示逻辑值 ‹ C++中,指针或数值可以代替boolean值。0相当于false,非0相当于true。 Page 29 Java编程基础 变量 ‹ 对于编程语言来说,变量是一个最为基本的概念。是需要改变的东 西,是一个表示某种可变量的符号。而且,在程序运行过程中,变 量的值是可以改变的。 ‹ 在java中,每一个变量属于一种类型(type)。 ‹ 变量名必须是一个以字母开头的字母或数字序列。变量名中可以含 有字母、数字和下划线。 ‹ 不能将变量名命名为Java保留字。 ‹ 可以在一行中声明多个变量。 Class Example2{ public static void main(String args[]){ int num; num = 100; System.out.println(“This is num: “+num); num = num * 3; System.out.print(“The value of num * 3 is :”); System.out.println(num); } } Page 30 Java编程基础 常量 ‹ 常量就是在程序的运行过程中不会发生变化的值。 ‹ 在java中,利用关键字final声明常量。例如: ‹ 关键字final表示这个变量只能被赋值一次,一旦被赋值,就不能够 再更改了。 ‹ 习惯上,常量名使用大写。 Class Example2{ public static void main(String args[]){ final double PI=3.1415926; //…… } } Page 31 Java编程基础 数组 ‹ 数组(array)是相同类型变量的集合,可以使用共同的名字引用它 。数组可以被定义为任何类型,可以是一维或多维。数组中一个特 别要素是通过一个整型下标来访问它。 数组的应用 ‹ 一维数组(one-dimensional array)实质上是相同类型变量列表。 ‹ 通用的一维数组的声明格式是:type var-name[ ]; ‹ 初始化数组的一般格式是:array-var = new type[size]; ‹ 获得一个数组需要2步。第一步,我们必须定义变量所需的类型。第 二步,我们必须使用运算符new来为数组所要存储的数据分配内存 ,并把它们分配给数组变量。这样Java中的数组被动态的分配。 ‹ 对数组变量的声明和对数组本身的分配可以结合起来:int month_days[ ] = new int[12]; ‹ 数组可以在声明时被初始化。数组的初始化就是包括在花括号之内 用逗号分开的表达式列表。Java会自动地分配一个足够大的空间来 保存我们制定的初始化元素的个数,而不必使用运算符new。 ‹ Average.java Page 32 Java编程基础 二维及多维数组 ‹ 多维数组(multidimensional arrays)实际上就是数组的数组。 ‹ 定义多维数组变量要将每个维数放在它们各自的方括号中。例如: int[][] towD = new int [4][5]; – TwoDArray.java ‹ 既然多维数组实际上是数组的数组,每个数组的维数在你的控制之 下。 – TwoDAgain.java ‹ 在声明二维数组时初始化 – TwoDAgain.java Page 33 Java编程基础 运算符和表达式 ‹ 算数运算符用在数学表达式中:+、-、*、/、+=、-= ‹ 模运算符%,去运算结果是整数除法的余数。 ‹ 递增和递减运算,只能用于变量增减,不能用于具体的数值。 – i++和++i ‹ 关系运算符和关系表达式 – ==、!=、>、<、>=、<= – 关系运算符产生的结果是布尔值。 – 关系运算符常常用在if控制语句和各种循环语句的表达式中。 ‹ 逻辑运算符和逻辑表达式 – 布尔运算符“&”、”|”、”^”,对布尔值的运算和它们对整数位的运 算一样。 – 逻辑运算符“!”的结果表示布尔值的相反状态:!true == false ‹ 赋值运算符和赋值表达式:”=“ ‹ 位运算符和位表达式:“>>”、”<<“ Page 34 Java编程基础 数据类型转换 ‹ 把一种类型的值赋给另外类型的一个变量就是所谓的数据类型转换 ,这种操作是非常常见的。如果这两种类型是兼容的,那么Java将 自动地进行转换。例如,把int类型的值赋给long类型的变量。然而 ,不是所有的类型都是兼容的,因此,不是所有的类型转换都可以 隐式实现的。 ‹ 自动转换 – 这两种类型是兼容的。 – 目的类型数的范围比来源类型的大。 – 当以上两个条件满足时,拓宽转换(widening conversion)发 生。对于拓宽转换,数字类型,包括整数和浮点类型都是彼此 兼容的,但是数字类型和字符类型(char)或布尔类型( boolean)是不兼容的。字符类型和布尔类型也是互相不兼容 的。 Int n = 1234; float f = n; char ch = 'c'; f = ch; Page 35 Java编程基础 数据类型转换 ‹ 强制转换 – 为了完成两种不兼容类型之间的转换,我们就必须进行强制类 型转换。所谓强制类型转换只不过是一种显式的类型变换。 – 通用格式如下:(target-type)value float f = 123; Int n =(int)f; char ch = (char)f; Page 36 Java编程基础 选择结构语句 ‹ If语句,是Java中的条件分支语句。它能将程序的执行路径分为两条 – 一般的if语句格式 – 嵌套if语句 – If-else-if阶梯 ‹ switch语句,是Java的多路分支语句。它提供了一种基于一个表达 式的值来使程序执行不同部分的简单方法。 – 表达式expression必须为byte,short,int或char类型。每个 case语句后的值value必须是与表达式类型兼容的特定的一个常 量(它必须为一个常量,而不是变量)。重复的case是不允许 的。 – SampleSwitch.java switch(expression){ case value1: // statement sequence break; case value2: //statement sequence break; ……… default: //default statement sequence } Page 37 Java编程基础 循环结构语句 ‹ while语句,是Java最基本的循环语句。当它的控制表达式是真时, while语句重复执行一个语句或语句块。 – 条件可以为任何布尔表达式 – 循环体可以为空。 ‹ for语句是一个功能强大且形式灵活的结构。 – 控制for循环的变量通常只是用于该循环,而不用在程序的其他 地方。在这种情况下,可以在循环的初始化部分中声明变量。 – FindPrime.java While(it.hasNext()){ ; } for(initialization; condition; iteration){ //body } Page 38 Java编程基础 跳转语句 ‹ break – 我们已经看到在switch语句中它被用来终止一个语句序列。 – 使用break直接强行退出循环,忽略循环体中的任何其他语句和 循环的条件测试。 – 在一系列嵌套循环中使用break语句时,它将仅仅终止最里面的 循环。 for(int i=0;i<100;i++){ if(I == 10) break; System.out.println(“i:” + i); } System.out.println(“Loop complete”); Page 39 Java编程基础 跳转语句 ‹ break – break label; Break.java – 如果一个标签不在包围break的块中定义,我们就不能break到 该标签。 for(int i=0;i<3;i++){ System.out.println(“i:” + i); for(int j=0;j<100;j++){ if(j ==10) break; System.out.print(j + “ “); } System.out.println(); } System.out.println(“Loop complete”); Page 40 Java编程基础 跳转语句 ‹ continue – 有时候我们可能想要继续运行循环,但是要忽略这次重复剩余 的循环体的语句。 – continue也可以指定一个标签来说明继续那个包围的循环。 ‹ return e – Return语句用来明确地从一个方法返回。也就是说return语句使 程序控制返回调用它的方法。
还剩39页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 6 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

sjava

贡献于2013-12-19

下载需要 6 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf