第1章Java语言概述本章的主要内容:1.1Java语言的发展里程1.2java的特点 1.3平台无关性1.4Java虚拟机JVM1.5Java与C/C++之关系1.6Java运行平台1.7Java程序开发1.8Java开发工具箱1.9JDK1.5编译器的新规定1.1Java语言的发展里程Java语言前身是Oak语言,于1991年推出,但仅限于SunMicrosystems公司内部使用。1995年Oak语言改名为“Java”,并正式向公众推出,主要贡献者是JamesGosling。1.2版本的Java是Java语言发展过程中一个关键阶段,从此,Sun公司将Java更名为Java2。经过十年的发展,Java语言已经发展到1.6版本。1.2java的特点(1/4)1.语法简单(1)Java的风格类似于C++(2)Java摒弃了C++中容易引发程序错误的地方,如指针和内存管理;(3)Java提供了丰富的类库。2.面向对象面向对象编程是一种先进的编程思想,更加容易解决复杂的问题。面向对象可以说是Java最重要的特性。Java语言的设计完全是面向对象的,1.2java的特点(2/4)3.分布式JAVA从诞生就起就与网络联系在一起,它强调网络特性,内置TCP/IP,HTTP,FTP协议类库,便于开发网上应用系统。4.安全性(1)在Java语言里,象指针和释放内存等C++功能被删除,避免了非法内存操作。(2)当Java用来创建浏览器时,语言功能和一些浏览器本身提供的功能结合起来,使它更安全。Java语言在机器上执行前,要经过很多次的测试。其三级安全检验机制可以有效防止非法代码侵入,阻止对内存的越权访问。51.2java的特点(3/4)5.健壮性Java致力于检查程序在编译和运行时的错误。异常检查可尽早的发现可能存在的错误。类型检查帮助检查出许多开发早期出现的错误。6.解释运行,高效率Java解释器(运行系统)能直接运行目标代码指令。Java程序经编译器编译,生成的字节码经过精心设计,并进行了优化,因此运行速度较快,客服了以往解释性语言运行效率低的缺点。1.2java的特点(4/4)7.与平台无关JAVA编译器将JAVA程序编译成二进制代码,即字节码。字节码有统一的格式,不依赖于具体的硬件环境。8.多线程Java提供的多线程功能使得在一个程序里可同时执行多个小任务。9.动态性Java的动态特性是其面向对象设计方法的发展。它允许程序动态地装入运行过程中所需要的类。1.3平台无关性(1/2)平台无关类型包括源代码级和目标代码级两种类型。C和C++属于源代码级平台无关,意味着用其写的应用程序不用修改只需重新编译就可以在不同平台上运行。Java属于目标代码级平台无关,主要靠Java虚拟机JVM来实现。对高级语言的翻译方式有解释和编译两种解释方式就是一边翻译一边运行而编译方式则是一次性翻译好,生成目标程序。1.3平台无关性(2/2)解决移植性的方法有以下两种方式:方式1:到一台机器上将源程序重新编译成适合该台机器的机器代码。方式2:将高级语言源程序编译成一种与机器无关的中间代码(如Java语言的字节码),该中间代码程序不能**作系统直接执行,需要由解释其来解释和执行。Java语言采用方式2,将由解释程序扩展了的指令系统的机器称为Java虚拟机,简称JVM。1.4Java虚拟机JVM虚拟机是一种对计算机物理硬件计算环境的软件实现。虚拟机是一种抽象机器,内部包含一个解释器(Interpreter),可以将其它高级语言编译为虚拟机的解释器可以执行的代码(称这种代码为中间语言IntermediateLanguage),实现高级语言程序的可移植性平台无关性(SystemIndependence),无论是运行在嵌入式设备还是多个处理器的服务器上,虚拟机都执行相同的指令,所使用的支持库也具有标准的API和完全相同或相似的行为。1.4Java虚拟机JVMJava虚拟机(JavaVirtualMachine,简称JVM)是一种抽象机器,它附着在具体操作系统上,本身具有一套虚拟机器指令,并有自己的栈,寄存器等,运行JAVA程序不可少的机制。编译后的JAVA程序指令并不直接在硬件系统CPU上执行,而是在JVM执行。在JVM上有一个Java解释器用来解释Java编译器编译后的程序。任何一台机器只要配备了解释器,就可以运行这个程序,而不管这种字节码是在何种平台上生成的。图1-1计算机硬件、操作系统、JVM与各种可执行程序之间的关系机器代码硬件操作系统JVM本地可执行文件(.exe,.com文件)Java字节码文件(.class文件)1.4Java虚拟机JVMJVM体系结构图类装载器字节码解释器安全管理器垃圾收集器线程管理图形Java虚拟机操作系统字节码*.class文件图1-2Java虚拟机体系结构示意图1.5Java与C/C++之关系相近之处Java中许多基本语句的语法和C++一样,像常用的循环语句、控制语句等和C++几乎一样Java和C++是两种完全不同的语言1.5Java与C/C++之关系不同之处Java去掉了C++语言的许多功能,Java中没有#include和#define等预处理功能,用import语来句包含其它类和包;Java中没有structure,union及typedef;Java中没有不属于类成员的函数,没有指针和多重继承,Java只支持单重继承;Java中禁用goto,但goto还是保留的关键字;Java中没有操作符重载;Java中没有全局变量,可以在类中定义公用、静态的数据成员实现相同功能。……1.6Java运行平台1.三种平台简介J2SE:Java标准版或Java标准平台。J2SE提供了标准的SDK开发平台(以前称做JDK开发平台)。J2EE:Java企业版或Java企业平台。J2ME:Java微型版或Java小型平台。2.安装J2SE平台——简介JDK版本发布日期版本说明及主要内容JDK1.0a21995.05正式对外发布JDK1.0.21996.01标准的I/O库、网络库、applet、文件I/O以及基本的窗口库等JDK1java语言程序设计基础篇ppt.11997.02内部类、新的事件处理模型、RMI、JavaBean,JDBC、串行化、国际化、日历类以及性能改进等JDK121998.12浮点运算改进、StringGUI库、集合、Java2D图形、可访问性(可视化GUI支持)、引用对象以及性能改进等JDK1.32000.05性能改进、CORBA兼容性、Java音频支持以及JNDI等JDK1.42001.12断言语句、64位地址空间(Solaris),新的I/O库、模式匹配、鼠标滑轮支持、IPv6,XML,WebStart支持、性能改进及命名为Merlin的代码等JDK1.52003.07通用性(代码模块)、允许一些云算符重载以及命名为Tiger的代码等1.6Java运行平台3.环境变量JAVA_HOME为那些需要使用Java命令和JVM的程序提供了通用的路径信息,其值应设置为JDK的安装目录的路径,JAVA_HOME=C:jdk1.5CLASSPATH用于指明字节码文件的位置。CLASSPATH=c:jdk1.5jrelib t.jar;.PATH是操作系统使用的变量,用于搜索在Shell中输入的希望执行的命令。Java编译器源文件编辑器字节码文件由Web浏览器执行文件名.java产生对于Java小应用程序对于Java应用程序由Java解释器执行图1-1Java程序开发过程示意图1.7Java程序开发1.7Java程序开发1.Java应用程序的开发编写源文件 Editplus等文本编辑器生成Hello.java编译源文件生成字节码javacHello.java加载运行字节码javaHello//Hello.javapublicclassHello{publicstaticvoidmain(Stringargs[]){System.out.println("你好,很高兴学习Java");}}C:>javacHello.javaC:>javaHello1.7Java程序开发2.JavaApplet程序的开发编写源文件Editplus等文本编辑器Boy.java编译源文件生成字节码javacBoy.java通过浏览器加载运行字节码Html文件myBoy.html<appletcode=Boy.classheight=100width=300></applet> 或appletviewewmyboy.html//Boy.javaimportjava.applet.*;importjava.awt.*;publicclassBoyextendsApplet{publicvoidpaint(Graphicsg){g.setColor(Color.blue);g.drawString("Java是一门很优秀的语言",12,30);g.setColor(Color.red);g.drawString("我一定认真学习Java",22,56);}}//myBoy.html<appletcode=Boy.classheight=100width=300></applet>C:>javacBoy.javaC:>appletviewewmyboy.html1.8Java开发工具箱Java开发工具箱(JDK-JavaDevelopmentKit)是Sun公司为用户提供的集成和执行applets和应用程序的工具javac编译器:可以用任何文字编辑器创建Java程序java翻译器;用于执行编译过的Java应用程序。appletviewer:可运行applets而不必运行Web浏览器。javap反汇编程序:从字节码文件恢复java原代码。javadoc工具:可以为所编写的源文件生成HTML文档1.9JDK1.5编译器的新规定JDK1.5的编译器javac.exe和以前版本的编译器有了一个很大的不同,不再向下兼容,也就是说,如果在编译源文件时没有特别约定的话,用JDK1.5的编译器生成的字节码只能在安装了JDK1.5或JRE1.5的Java平台环境中运行。第2章Java语言基础2.1Java程序概况2.2基本数据类型2.3运算符和表达式2.4Java语句2.1Java程序概况2.1.1Java程序结构2.1.2Java注释2.1.3Java关键字2.1.4Java标识符2.1.5变量与常量2.1.1Java程序结构Java源程序一般由一个或多个编译单元组成,每个编译单元只能包含以下内容(空格和注释除外):•package包语句•import导入语句•类的声明•接口声明图2-1Java程序中各元素及其关系注释0..npackage0..1import0..n成员变量0..n方法0..n局部变量0..n执行语句0..n类1..nJava程序2.1.1Java程序结构2.1.1Java程序结构一个简单的Java程序示例。/*这是一个简单的Java程序示例程序*/packagemypack;importjava.util.*;publicclassExample{publicstaticvoidmain(Stringargs[]){System.out.println("Java欢迎您!");}}2.1.2Java注释方式1://注释一行例如:num=2;//num是计算器,用于累计选课人数方式2:/*一行或多行注释*/例如:/*本方法用于计算阶乘*/方式3:/文档注释/文档注释一般放在一个变量或函数定义说明之前,表示该段注释应包含在自动生成的任何文档中(即由javadoc生成的HTML文件)。这种注释都是声明条目的描述。2.1.3Java关键字abstractconstfinallyinterfacereturnthrowbooleancontinuefloatlongsafetransientbreakdefaultfornativeshorttruebydogotonewstatictrybytedoubleifnullsupervaluecaseelseimplementspackageswitchvoidcatchextendsimportprivatesynchronizedvolatilecharfalseinstanceofprotectedthiswhileclassfinalintpublicthread
2.1.4Java标识符用来标识类名、变量名、方法名、类型名、数组名、文件名的有效字符序列称为标识符。由字母、下划线、美元符号和数字组成,并且第一个字符不能是数字。标识符中的字母是区分大小写的例子:判断正误(1)3max(2)class(3)room#(4)userName(5)User_name2.1.5变量与常量Java变量是一个由标识符命名的项。变量具有一定类型,例如int型或class型,也具有作用域,其值可被改变。变量声明的语法形式如下:varTypevarName[=value][,varName[=value]…];doublearea,r;在变量声明格式前加上final修饰符,就声明了一个常量。常量一旦被初始化以后就不可改变。常量声明的语法形式如下:finalvarTypevarName[=value][,varName[=value]…];2.2基本数据类型2.2.1基本数据类型概况 1132.2.2基本数据类型转换 1162.2.1基本数据类型概况基本数据类型也称作简单数据类型,Java语言有8种简单数据类型,分别是:boolean、byte、short、int、long、float、double、char。复合数据类型包括数组、类和接口等。图2-2Java语言数据类型数值类型整数类int,byte,short,long浮点类double,float逻辑类boolean字符类char数组type[]类class接口interface数据类型基本数据类型复合数据类型2.2.1基本数据类型概况1.逻辑类型常量:true,false。变量的定义:使用关键字boolean来定义逻辑变量,定义时也可以赋给初值。例如:booleanx;//定义逻辑型变量xbooleanx=false;//定义逻辑型变量x,并赋值为false2.2.1基本数据类型概况2.整数类型常量:123,6000(十进制),077(八进制),0x3ABC(十六进制)。整型变量的定义分为4种类型举例字节长度bytebytex,y=1;1shortshortx,y=2;2intintx,y=3;4longlongx,y=4;82.2.1基本数据类型概况3.字符类型常量:unicode字符表中的字符就是一个字符常量例如‘A’,‘‘?’,‘9’,‘好’,‘き’,等。Java还使用转意字符常量,如:‘ ’为换行转意字符常量。变量的定义:使用关键字char来定义字符变量例如:charx=‘A’,漂亮=‘假’,jiafei;★特别提示:一个unicode字符占2个字节char型变量,内存分配给2个字节,占16位,最高位不是符号位,没有负数的char。char型变量的取值范围是0-65536。2.2.1基本数据类型概况4.浮点类型浮点类型包括float型和double型。浮点型数值缺省为double型,float型在数值之后加f或F例如,float型常量:453.5439f,21379.987F,2e40f,double型常量:21389.5439d(d可以省略),6e-140。float型变量的定义:floatx,y=22.76f;double型变量的定义:doublex,y=12.762.2.2基本数据类型转换含义:一种基本数据类型变量转变成另一种基本类型变量。类型转换方式:窄化和拓宽转换。拓宽(Widening)转换编译时可以自动执行拓宽转换(称为Promotion,提升)。窄化(Narrowing)转换则总是要求显式执行强制转换(称为Cast,转型)。Java语言中不同类型之间不能相互赋值,同种类型低精度值可以赋给高精度变量,反之则需要使用强制类转换,此时可能导致数据精度的损失。2.2.2基本数据类型转换数据精度从“低”到“高”排序:byte→short(char)→int→long→float→double规则1:当把精度低的变量的值赋给精度高的变量时,系统自动完成数据类型的转换,如int型转换成long型规则2:当把精度高的变量的值赋给精度低的变量时,必须使用显示类型转换运算。(类型名)要转换的值;intx=(int)34.89;规则3:char与byte或short之间的赋值必须实行强制转换。2.2.2基本数据类型转换byteb1=18,b2;shortsint1,sint2;charch1,ch2=’A’;ch1=char(b1);b2=(byte)ch2;sint2=(short)ch2;注意事项:强制转换运算可能导致精度的损失。当把一个整数赋值给一个byte、short、int或long型变量时,不可以超出这些变量的取值范围,否则必须进行类型转换运算。【实例2-3】publicclasstransExample{ publicstaticvoidmain(Stringargs[]){ bytea=120;shortb=255;intc=2200;longd=8000;floatf;doubleg=0.45678;b=a;c=(int)d;f=(float)g; System.out.println("a="+a);System.out.println("b="+a);System.out.println("c="+a);System.out.println("d="+a);System.out.println("e="+a);System.out.println("f="+a);System.out.println("g="+a);}}2.2.2基本数据类型转换【实例2-3】运行结果为:a=120b=120c=8000d=8000f=0.g=0..3运算符和表达式2.3.1算术运算符和算术表达式2.3.2关系运算符与关系表达式2.3.3逻辑运算符与逻辑表达式2.3.4赋值运算符与赋值表达式2.3.5位运算符2.3.6条件运算符2.3.7instanceof运算符2.3.8一般表达式2.3.1算术运算符和算术表达式Java算术运算符主要包括一元运算符(如+,-,++,--)和二元运算符(如,+,-,*,/,%),与C/C++基本相同算术表达式是用算术符号和操作元连接起来的符合Java语法规则的式子。例如:(f*b)+(i/c)-(d*s)2.3.1算术运算符和算术表达式java将按运算符两边操作元的最高精度保留结果。操作元的精度从低到高排列顺序是:byte→short→int→long→float→double。•执行任何算术运算或按位运算,“比int小”的数据(char、byte、short)在正式执行运算之前,那些值会自动转换成int•整型、实型、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算,转换从低级到高级。例如:若将一个float值与一个double值相乘,结果就是double;如将一个int值和一个long值相加,则结果为long。2.3.1算术运算符和算术表达式根据上述规则5/2的结果为2,因为运算符“/”左右操作数均为int型,因此结果也为int型;而5.2/2的结果为2.5,因为运算符“/”左操作数为double型,右操作数为int型,因此运算时首先统一为double型,显然结果也为double型。【实例X-5】//程序2-5classautoPromoteExample{publicstaticvoidmain(Stringargs[]){byteb=1;charc='b';shorts=10;inti=100;floatf=1.23f;doubled=6.78,result;result=(f*b)+(i/c)-(d*s);System.out.println("result="+result);}}2.3.2关系运算符与关系表达式运算符表达式返回true的情况>op1>op2op1大于op2>=op1>=op2op1大于或等于op2<op1<op2op1小于op2<=op1<=op2op1小于或等于op2==op1==op2op1与op2相等!=op1!=op2op1与op2不等2.3.3逻辑运算符与逻辑表达式操作数取值表达式运算结果op1op2op1&&op2op1||op2!op1falsefalsefalsefalsetruefalsetruefalsetruetruetruefalsefalsetruefalsetruetruetruetruefalse2.3.4赋值运算符与赋值表达式赋值运算符“=”是双目运算符,左面的操作元必须是变量。级别是14级,结合性从右到左。2.3.5位运算符Java位运算符主要面对基本数据类型,包括byte、short、int、long和char。位运算符包括“按位与”&、“按位或”|、“按位非”~、“按位异或”^、左移<<、右移>>。此外,Java引入一个专门用于逻辑右移运算符>>>,它采用了所谓的零扩展技术,不论原值是正或负,一律在高位补0。例如:inta=-2,b;b=a>>>30;2.3.6条件运算符条件运算符是一个3目运算符,符号是:“?:”。用法如下:op1?op2:op3要求第一个操作元op1的值必须是boolean型数据。运算法则是:当op1的值是true时,运算的结果是op2的值;当op1的值是false时,运算的结果是op3的值。Java要求:op2与op3必须同类型。例如,12>8?100:200的结果是100;12<8?100:200的结果是200。2.3.7instanceof运算符该运算符是双目运算符,左面的操作元是一个对象,右面是一个类。当左面的对象是右面的类创建的对象时,该运算的结果是true,否则是false。2.3.8一般表达式Java的一般表达式就是用运算符及操作元连接起来的符合Java规则的式子,简称表达式。一个Java表达式必须能求值,即按着运算符的计算法则,可以计算出表达式的值。例如,假如intx=1,y=-2,n=10;那么,表达式x+y+(--n)*(x>y&&x>0?(x+1):y)的值是int型数据,结果为17。2.4Java语句2.4.1Java语句概述2.4.2分支语句2.4.3循环语句2.4.4跳转语句2.4.5输入输出语句2.4.1Java语句概述Java语言中的语句可分为以下5类:(1)方法调用语句:例如reader.nextInt();(2)表达式语句:x=23;(3)复合语句:“{”+代码块+“}”,例如,
{ z=23+x; System.out.println("hello");}(4)控制语句:条件分支语句、循环语句和跳转语句。(5)package语句和import语句2.4.2分支语句1.条件分支语句•if-else语句.if(表达式){若干语句} else{若干语句}•多条件if-elseif-else语句if(表达式1){若干语句}elseif(表达式2){若干语句}……elseif(表达式n){若干语句}else{若干语句}if(表达式)的表达式的值必须是boolean型【实例2-6】publicclassmultelseExample{ publicstaticvoidmain(Stringargs[]){ intscore=88; Stringstr="不及格"; if(score>=90&&score<=100) {str="优秀";} elseif(score>=80&&score<=89) {str="良好";} elseif(score>=70&&score<=79) {str="中等";} elseif(score>=60&&score<=69) {str="及格";} System.out.println("成绩为"+str);}}2.4.2分支语句2.switch开关语句--格式switch(表达式){case常量值1:若干个语句break;………case常量值n:若干个语句break;default:若干语句}【实例2-7】输入月份,显示该月份所在季节。publicclassswitchExample{ publicstaticvoidmain(Stringargs[]){ intmonth=1; Stringstr=""; switch(month) { case1: case2: case3: str="春季"; break; case4: case5: case6: str="夏季"; break; case7: case8: case9: str="秋季"; break; default: str="冬季"; } System.out.println("月份"+month+"属于"+str);}}2.4.3循环语句1.while循环while(表达式){若干语句}
2.dowhile循环dowhile{若干语句}(表达式)
3.for循环for(表达式1;表达式2;表达式3){若干语句}“表达式2”必须是一个求值为boolean型数据的表达式(b)dowhile循环循环体True表达式False循环体True表达式False表达式1True表达式2False循环体表达式3(a)while循环(c)for循环图2-3while、dowhile循环和for循环示意图2.4.4跳转语句跳转语句包括break语句和continue语句。•break语句功能:跳出当前的循环体使用形式:break;//不带标签breakLabel;//带标签不带标签的break语句使程序跳出它所在的那一层循环结构带标签的break语句使程序跳出标签所指示的循环结构【实例2-9】break命令应用举例publicclassbreakExample{publicstaticvoidmain(Stringargs[]){ inti,j=0; outer: for(i=0;i<5;i++) for(j=0;j<5;j++){ System.out.println(i+""+j); if(j==1) breakouter; } System.out.println("最终值:"+i+""+j); }}2.4.4跳转语句•continue语句功能:结束本次循环使用形式:continue;//不带标签continueLable;//带标签不带标签的continue语句的作用是终止当前循环结构的本轮循环而直接开始下一轮循环。对for循环,就是忽略循环体中后面的语句,跳到表达式3执行对while或dowhile循环就是直接转去求解逻辑表达式2.4.4跳转语句•continue语句带标签的continue语句的作用就是把程序直接转到标签所指的循环结构的下一次循环,而不管被他嵌套的以及continue语句所在的循环结构运行到了哪那一轮。【实例2-10】continue命令应用举例publicclasscontinueExample{publicstaticvoidmain(Stringargs[]){intsum=0,i,j;for(i=1;i<=10;i++)//该循环计算3+6+9。{if(i%3!=0){continue;}else{}sum=sum+i;}System.out.println("sum="+sum);}}2.4.4跳转语句continue标号语句和break标号语句的比较相同点:•都必须用在循环中,用于流程控制;•执行这两个语句时,若后面还有其他语句,将不再继续执行。不同点:• continue语句的标号必须位于封闭的循环语句的前面•break语句的标号只需位于封闭语句的前面,但不一定是循环语句2.4.5输入输出语句1.数据输出:print(或println)System.out.println(“Hello”)System.out.println(“”+x)2.数据输出:printfSystem.out.printfprintf(格式控制部分,表达式1,表达式2,…表达式n);★JDK1.5版本新增功能3.数据的输入:ScannerScanner是JDK1.5新增的一个类,可以使用该类创建一个对象:第3章类与对象3.1面向对象基础3.2类3.3对象3.4变量3.5方法3.6包3.7import语句3.8访问权限3.9基本类型数据的类包装3.1面向对象基础3.1.1编程语言的几个发展阶段3.1.2面向过程的程序设计3.1.3面向对象的程序设计3.1.4两种程序设计语言的简单比较3.1.1编程语言的几个发展阶段1.机器语言机器语言是由机器指令组成的语言。2.汇编语言汇编语言是符号化了的机器语言,3.高级程序设计语言高级程序设计语言屏蔽了机器的细节,提高了语言的抽象层次,程序中可以采用具有一定含义的数据命名和容易理解的执行语句。4.面向对象的语言面向对象的语言可以直接描述客观事物以及它们之间的联系,将客观事物看作具有属性和方法(行为)的对象,类是由同一类对象的共同属性和方法组成。Java语言属于面向对象的语言。3.1.2面向过程的程序设计分析问题的主要方法是以实现问题或问题域中的处理过程为中心,同时考虑适用于实际问题的数据结构和程序的输入输出,程序是由多个具有输入输出的处理过程组成。程序设计的基本思路是:自顶向下,逐步求精;将程序按功能划分成若干基本模块;模块之间关系尽可能简单,各模块的功能相对独立;每个模块是由顺序结构、选择结构、循环结构构成的子程序。面向过程语言一般提供多种基本数据类型和自定义数据类型。(a)程序结构Main()f1()f2()f3()f2-1()(b)动态调用关系mainf1f2-1f2f3f2-2数据1数据2数据3f2-2()图2-1面向过程的程序设计语言的程序结构及动态调用关系3.1.3面向对象的程序设计面向对象程序设计的基本思路是:首先,将数据及对数据的操作(方法)放在一起,作为一个相互依存不可分割的整体,即对象;其次,对同类对象的共同属性和方法进行抽象形成类;类通过一个简单的外部接口与外界****,对象与对象之间通过消息进行通信。因此,面向对象程序设计通常包含系统分析、系统设计、对象设计和对象实现几个阶段。3.1.3面向对象的程序设计系统分析:理解应用系统的定义及建立应用系统的对象模型,分析和发展对象,定义对象的属性和内部状态变换,定义外部事件和对象之间的联系和约束,最终建立应用系统的对象模型、动态模型及功能模型。系统设计:确立对象模型的实现方法。将系统分解为子系统,确立应用系统固有的并发性、分配处理器的任务,选择数据存储的管理手段、处理全局资源的访问,确立应用系统的边界等等。3.1.3面向对象的程序设计对象设计:将系统分析阶段建立的三种模型转换为类。将应用系统的对象模型转换为类的属性(主要考虑对象关联的实现方法),动态模型转换为类的方法(最好选用事件驱动的运行环境-时间驱动的运行环境难于实现并发处理),功能模型转换为主控模块或子控模块(可以采用时间驱动或事件驱动的方式实现流程控制)。对象实现:用面向对象的程序设计语言实现对象设计阶段定义的类。选择合适的面向对象的程序设计语言及开发环境,定义类的属性及方法,编写主控模块及子控模块,针对具体语言进行性能调整。3.1.3面向对象的程序设计4.面向对象程序设计语言的程序结构面向对象程序设计语言处理保留了3种基本控制结构和函数结构外,新增加了“类”结构。类结构是一种更为高级的程序结构,它综合了数据结构和函数结构,不仅可以包含更复杂的数据属性和数据结构,还包含着对这些数据的操作。是数据和操作高度统一的整体,具有更高的内聚性、安全性、稳定性和可重用性。类和类之间可以建立更为深刻的继承和包含关系,使得程序结构更加复杂、更加合理,同时也更加稳定。类的引入除了改进程序结构外,还可以和现实世界或问题域中的概念或实体对应起来,是现实世界中实体属性和行为的抽象。图2-2面向对象的程序结构示意图表示自包含程序结构函数结构类结构包结构数据结构顺序结构选择结构循环结构图2-3面向对象程序模型及对应的java程序f1()f2()f3()mypackageMyClassAnotherClasspackagemypackage;classMyClass{inta;voidf1(){}voidf2(){}}classAnotherClass{inta;voidf3(){}}对应的java程序3.1.4两种程序设计语言的简单比较方法名称面向过程(结构化)方法面向对象方法软件开发结构化系统分析结构化系统设计结构化系统开发面向对象系统分析面向对象系统设计面向对象系统开发高级语言发展历程ALGOLFortranPascalCSimulaSmalltalkC++Java编程的核心数据结构+算法对象+消息优点技术成熟,已全面标准化并推向实用针对高技术的复杂难题而研制,能更好地实现软件的可靠性和安全性缺点无法处理高技术领域复杂的非规则信息面向对象的系统分析与设计尚未标准化,应用尚不广泛3.2类在面向对象程序设计中,一个对象是客观事物的属性和行为密封成的一个整体。类是某些对象的共同特征(属性和方法)的表示,对象是类的实例。类是组成Java程序的基本要素。类封装了一类对象的状态和方法。类是用来定义对象的模板。可以用类创建对象,当使用一个类创建了一个对象时,就是给出了这个类的一个实例。3.2类1.类的基本构成在语法上,类由两部分构成:类声明和类体。基本格式为:
修饰符class类名[extends父类名]{ 成员变量声明及初始化; 方法声明及方法体;}3.2类2.类声明的详细格式:
[public][abstract|final]classclassName[extendssuperclassName][implementsinterfaceNameList] { 成员变量声明及初始化; 方法声明及方法体; }3.2类public:访问权限修饰词。如果一个类被声明为public,那么与它不在同一个包中的类也可以通过引用它所在的包来使用这个类,否则这个类就只能被同一包中的类使用。abstract:对父类所加的修饰词。抽象类,不能被实例化生成自己的对象,通常只定义了一些变量和方法供继承使用。被声明为abstract的抽象类往往包含有被声明为abstract的抽象方法,这些方法由类的子类完成实现细节。如果一个类中有一个方法是抽象方法,则类必须声明为抽象。3.2类final:对子类所加的修饰词。最终类,不能再派生出新的子类。extends:后跟父类名称implements:列出一个或多个接口3.2类3.类体格式类体中定义了该类中所有的变量和该类所支持的方法。
classclassName{ //成员变量的定义[访问控制修饰符][其他修饰符]类型
变量名称; //成员方法的定义[访问控制修饰符][其他修饰符]返回类型
方法名称(参数列表)[抛出异常]{statements} }//3.2类成员变量访问控制修饰符说明:访问控制修饰符对在该类以外的代码中访问被修饰的属性起控制作用,不影响在该内部对该属性的访问性。public:使用public修饰的属性的可见范围是整个程序,可以在任何一个类的方法代码中访问该属性,访问时需要通过该类的对象实例来对属性进行限定。属性一般使用public修饰,除非该属性允许其他人进行任意访问和修改protected:使用protected修饰的属性的可见范围是同一包内的所有类和该类所有子类(可以不再同一包中),即在同一包内的其他类或不同包中子类的方法可以访问该属性,主要用于属性被子类继承的情况。3.2类成员变量访问控制修饰符说明:private:使用private修饰的属性的可见范围是该属性所属的类,即只有同类中的方 法可以访问该属性,出了这个类的范围,即使同包内的类或子类也不能访问。该访问控制符一般用来封装属性,类外部的代码不能直接访问该属性,必须通过公有的方法接口来对该属性进行操作。缺省:如果属性前面不加访问控制符,即为包可见性,同包内的类都可以访问该属性。3.2类•成员变量其他修饰符说明:final:在简单变量属性前面使用final,表示该属性为常数。如果在对象变量属性前面加上final,则表示该变量不能指向新的对象,但是所指向的对象的属性却可以改变,这和对象变量的值可以修改、但指向的对象不能修改的情况正好相反(后者如字符串变量)。transient:指明变量是临时常量。volatile:指明变量是一个共享变量。3.2类•成员变量其他修饰符说明:static:默认属性为非静态属性(实例属性)。JVM为每个对象实例属性分配不同内存。使用static修饰的属性为静态属性(类属性)。该属性是所属类创建的所有对象实例的公有属性,也就是该类所有对象的公共变量或全局变量,而不是每个对象实例专有的属性。从保存该属性的内存单元来看,其内存的分配是在创建对象之前就进行了,即在JVM加载类时完成的。final修饰的类属性为常量,不可改变。3.2类方法访问控制修饰符的说明[public|protected|private]。意义和修饰属性的情况一样,控制方法的可见范围。方法一般为public,表示对外的接口,但也有私有方法或保护的方法,仅供类本身调用或子类调用。public:一个类中被声明为public的方法(或变量)是“公开的”,意味着只要能使用这个类,就可以直接使用这个方法(或直接存取这个变量的值)。3.2类方法访问控制修饰符的说明protected:一个类中被声明为public的方法(或变量)是“受限的”,意味着他们仅能被与该类处于同一包的类及该类的子类所直接使用或存取。private:一个类中被声明为public的方法(或变量)是“私有的”,除了声明他们的类外,不能被任何其他的类直接使用或存取。缺省friendly:只能被同一包中的类直接使用或存取。3.2类•方法其他修饰符的说明static:默认方法为非静态方法(实例方法)。JVM为每个对象实例属性分配不同内存。使用static修饰的方法为静态方法(类方法)。该方法不适于任何一个对象,而是属于整个类,是该类所有对象实例的公共方法,此方法对整个类来说是唯一的。类方法在该类被加载到内存时,就分配了相应的入口地址,即使该类没有创建对象,也可以直接通过类名调用方法。3.2类•方法其他修饰符的说明final:声明类的方法是最终的,在子类中不能对该方法进行重新实现,即覆盖或者扩展。该修饰符用于控制类方法的继承。abstract:声明方法是抽象的,不可能有具体实现的方法体。native:声明方法是通过调用本地方法来实现功能,如调用C函数。synchronized:声明该方法可实现线程的同步。3.3对象采用Java语言编程时,大多数情况下是对具体的对象进行操作的。也就是说,要求以类作为模板,也可将类理解为对象的制造厂,专门用来创建类的实例(对象)图3-3类是对象的制造厂示意图New方法属性创建对象请求产生新的类实例3.3对象1.创建对象•创建对象语法格式:
类名对象名;//声明对象对象名=new类名();//创建对象•对象的声明的格式为:类名对象名例如:MyDatedate;3.3对象1.创建对象•对象的实例化与初始化:用new操作符创建对象,即实例化一个对象,并按照对象的类型分配内存;用构造方法对它进行初始化。通常new要与构造方法配合使用。例如:newString(“Howareyou!”);就是对系统字符串类String的构造方法的调用,并初始化为“Howareyou!”3.3对象1.创建对象•对象的实例化与初始化:例如:importJava.awt.*;Fontfont;//line1font=newFont(“TimesRoman”,Font.BOLD,36);//line2也可以将line1和line2两行语句合并为如下一行语句:Fontfont=newFont(“TimesRoman”,Font.BOLD,36);3.3对象2.对象的使用对象的使用是通过一个引用类型的变量来实现,包括引用对象的成员变量和方法,通过运算符‘•’可以实现对变量的访问和方法的调用。例如:MyDatedate=newMyDate();定义了一个MyDate类型的对象date,以下是对象的使用。date.day //引用date的成员变量daydate.tomorrow()//调用date的方法tomorrow()3.3对象3.对象的消亡当对象使用完毕后,就应将无用的对象赋空值(null),再由Java的垃圾收集器收集并释放空间。3.4变量1.类中变量分类局部变量是在方法体中定义的变量和方法的参数。成员变量是在类属性定义部分所定义的变量,又可分为实例变量和类变量。类变量就是在声明时加上“static”修饰符的成员变量,故又称静态变量。3.4变量1.类中变量分类//程序3-2classvarExample{intx; staticinty; intfun(intz){ inta; x=a;} } x和y是成员变量,其中x是实例变量,y是类变量。z和a是局部变量,其中z是方法fun的参数,a是方法fun中定义的变量。3.4变量2.变量的内存分配Java语言中数据类型分为基本数据类型和复合类型,相应地Java语言中变量可分为基本变量和复合变量。基本变量在说明时由系统自动分配内存,复合变量则必须使用new来申请内存。下面以类变量(即class变量)为例来说明复合变量的内存分配。首先在说明变量时,在内存中为其建立一个引用,并置初值为null,表示不指向任何内存空间;其次使用new申请内存,内存大小依class的定义而定,并将该段内存的首址赋给引用。3.4变量classBox{floathigh,weight; voidoutputArea(Strings) System.out.println(“Area=”+high*weight);}}classstoreExample{publicstaticvoidmain(Stringargs[]) Boxbox;//line1:声明对象 box=newBox();//line2/*为对象分配内存,使用new和默认构造方法*/ …..}图3-4内存分配示意图0height
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/2103.html