版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java语言简介主要内容:Java是什么?Java的特点、Java开发环境Java是什么?Java是面向对象的程序设计语言。Java跨平台,适合于网络计算环境。是网络上的世界语。Java是一种编程环境。Java是一种操作环境。Java语言在Java虚拟机(Javavirtualmachine)上运行,通过JVM,Java可以在不同的机器上运行,而不用重新编译。*.java*.classJVMhostmachineJava与c++Java语言的基础是c++,但除去了c++中容易出错的部分。(全局变量、goto语句、指针、内存管理、对数据类型的支持……)成功的原因:1象用户熟悉的其他一些语言C,C++,Smlltalk2Web,网络编程语言,出现的恰到好处3免费获得Java的特点简单性面向对象分布性编译和解释性鲁棒性安全性中性的体系结构可移植性高性能多线程性动态性Java开发环境JDK(JavaDevelopersKit,Java开发工具)1996年1月,Sun公司推出JDK1.0,它是命令行工具,包括:(1)javac:Java编译器,其作用是生成包含字节码的.class文件。(2)java:Java解释器/虚拟机/字节码解释器/Java运行环境。(3)jdb:Java调试器。(4)javadoc:API文档生成器,将Java源程序转换成HTML文档。(5)appletviewer:Applet小程序浏览器。(6)javah:头文件生成器。(7)javap:Java反汇编器/Java字节码反汇编器。JavaWorkShop它是基于Web的Java快速开发环境,可开发和发布Javaapplets和应用程序。它是由一套Java语言编写的集成开发工具组成的。VisualCafe它是美国Symantec公司推出的可视化Java语言集成开发环境。可在该环境中完成Java语言程序的建立、调试、修改和运行等全过程,大大提高了Java语言程序的开发效率,缩短了开发周期。VisualJ++。它是Microsoft公司推出可视化Java语言集成开发环境。继承了微软公司集成开发环境(IDE)的一贯传统。一个Java应用程序的例子例1.1:该程序的作用是输出HelloWorld!//一个应用程序(application)publicclassHelloWorldApp{publicstaticvoidmain(Stringargs[]){System.out.println("HelloWorld!");}}运行该程序。首先把它放到一个名为HelloWorldApp.java的文件中,这里,文件名应和类名相同,然后对它进行编译。具体操作如下:C>javacHelloWorldApp.java//编译结果是生成字节码文件HelloWorldApp.class。C>javaHelloWorldApp//用Java解释器来运行该字节码文件例1.2importjava.awt.*;importjava.applet.*;//一个Applet(小应用程序)publicclassHelloWorldAppletextendsApplet{publicvoidpaint(Graphicsg){g.drawString("HelloWorld!",20,20);}}运行该程序,首先把它放在文件HelloWorldApplet.java中,然后对它进行编译:C>javacHelloWorldApplet.java编译的结果是得到字节码文件HelloWorldApplet.class。它的HTML文件如下:<HTML><HEAD><TITLE>AnApplet</TITLE></HEAD><BODY><appletcode="HelloWorldApplet.class"width=200height=40></applet></BODY></HTML>把这个HTML文件存入Example.html,然后运行:C>appleviewerExample.html这时屏幕上弹出一个窗口,其中显示HelloWorld!第二章数据类型主要内容:Java语言标识符、关键字、注释、数据类型Java语言标识符标识符是一个唯一标识一个变量,方法和类的名字。Unicode编码字符集Java语言使用Unicode字符集,共包含65535个字符。每个字符用2个字节,即16位来表示。Unicode只用在Java平台内部。标识符的命名以字母、下划线或美元符“$”开始的,并包含这些字符和数字的字符序列。标识符是大小写相关的,且可以任意长,但长度要合适。关键字不能作标识符。避免用下划线或美元符“$”开头。否则,在向程序中导入C语言程序库时可能会造成名字冲突和混乱。为使标识符具有较好的可读性,应遵守一定的命名规范:标识符类型常规示例类每个单词的首字母都大写Mammal,SeaMammal函数第一个字母小写,其它单词的首字母大写getAge变量第一个字母小写,其它单词的首字母大写brainSize常量所有字母大小,单词之间使用下划线分开MAX_HEIGHTJava语言关键字关键字是预定义的标识符,它对于Java语言编译器有特殊意义,不能重新定义。Java语言的关键字abstractbooleanbreakbytecasecatchcharclasscontinuedefaultdodoubleelseextendsfalsefinalfinallyfloatforifimplementsimportinstanceofintinterfacelongnativenewnullpackageprivateprotectedpublicreturnshortstaticsuperswitchsynchronizedthisthrowstransienttruetryvoidvolatilewhile分类数据声明关键字(boolean,float,int)循环关键字(continue,while,for)条件关键字(if,else,switch)异常关键字(try,throws,catch)结构关键字(class,extends,implements)修饰符和访问关键字(private,public,transient)其它关键字(true,null,super)注释语句(1)Java语言中的三种注释方式://用于单行注释。注释从∥开始,终止于行尾。/*…*/用于多行注释。这种注释不能互相嵌套。/**…*/是Java语言所特有的doc注释。通常用在创建web页面的HTML文件中。主要是为支持JDK工具Javadoc而采用的。(2)程序段数据类型(1)整型数据byte、short、int、long整型常量①十进制整数。例如123,-456,0②八进制整数,以0开头。③十六进制整数,以0x或0X开头。例如:0123表示十进制数83,-011表示十进制数-9,0x123表示十进制数291,-0X12表示十进制数-18。对于long型值,则要在数字后加L或l,如123L表示一个长整数。整型变量数据长度整数类型表示范围8位byte-27——27-116位short-215——215-132位int-231——231-164位long-263——263-1整型变量的声明,例如:byteb;//声明变量b为byte型(2)浮点型(实型)数据float、doubledouble比float具有更高的精度和更大表示范围,常常使用。实型常量①十进制数形式:由数字和小数点组成,且必须有小数点。如0.123,.123,123.,123.0②科学计数法形式:如:123e3或123E3,其中e或E之前必须有数,且e或E后面的指数必须为整数。实型变量数据长度整数类型表示范围32float3.4e-038~3.4e+03864double1.7e-308~1.7e+308(3)字符型数据char、String字符常量用单引号括起来的一个字符。Java也提供转义字符,以\开头,将其后的字符转变为另外的含义。Java语言中的字符型数据是16位无符号型数据,它表示Unicode集,而不仅仅是ASCII集。Java语言中的转义字符:\'\\\r\n\f\t\b\ddd\uxxxx例如:\071是ASCII码为八进制数71(十进制数57)的字符。\u0041是Unicode码为十六进制数41(十进制数65)的字符。字符型变量类型为char,在机器中占16位,其范围为0~65535。与C++不同,Java语言中的字符型数据不能用作整数。如:Intthree=3;charone='1';charfour=(char)(three+one);//four='4'字符串常量用双引号(“”)括起来的一串字符。Java语言中的字符串常量是作为String类的一个对象来处理,而不是一个数据。(4)布尔型数据布尔型数据只有两个值,true和false,且它们不对应于任何整数值。在流程控制中常用到它。没有初始化的布尔型变量自动设定为false。常量和变量与C、C++不同,Java语言中不能通过#define命令把一个标识符定义为常量,而是用关键字final来实现,如:finaldoublePI=3.14159。Java语言中的变量必须遵循“先定义,后使用”的原则,即变量必须先声名,再使用。Java语言程序中常常需要对一些变量预先设置初值。Java语言规定,可以在定义变量的同时对变量进行初始化。除了基本的数据类型外,Java语言变量的数据类型也可以是一个内置或用户自定义的类,还可以是一个数组。一些Java语言数据类型的示例:floatx;//float是一个基本数据类型Floatx;//Float是一个内置类Marqueex;//Marquee是一个用户自定义的类String[]x;//String[]是一个String数组例2.1publicclassSimpleTypes{publicstaticvoidmain(Stringargs[]){byteb=0x55;shorts=0x55ff;inti=1000000;longl=0xfffL;charc='c';floatf=0.23F;doubled=0.7E-3;booleanbool=true;System.out.println("b="+b);System.out.println("s="+s);System.out.println("i="+i);System.out.println("l="+l);System.out.println("c="+c);System.out.println("f="+f);System.out.println("d="+d);System.out.println("bool="+bool);}}编译并运行该程序,输出结果为:C>javaSimpleTypesb=85s=22015i=1000000l=4095c=cf=0.23d=0.0007bool=true各类数值型数据间的混合运算(1)自动类型转换整型、实型、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。转换从低级到高级,转换规则如下:(byte或short)opint→int(byte或short或int)oplong→long(byte或short或int或long)opfloat→float(byte或short或int或long或float)opdouble→doublecharopint→int例2.2publicclassPromotion{publicstaticvoidmain(Stringargs[]){byteb=10;charc='a';inti=90;longl=555L;floatf=3.5f;doubled=1.234;floatf1=f*b;//float*byte——>floatinti1=c+i;//char+int——>intlongl1=l+i1;//long+int——>longdoubled1=f1/i1-d;//float/int——>float//float-double——>double}}(2)强制类型转换高级数据要转换成低级数据,需用到强制类型转换,如:inti;byteb=(byte)i;//把int型变量i强制转换为byte型intk;floaty=5.5;k=(int)y;第三章运算符主要内容:算术运算符、关系运算符、布尔逻辑运算符、位运算符、赋值运算符及条件运算符运算符和优先级按操作数的数目来分,分为一元,二元和三元运算符。按照运算符功能来分,基本的运算符有下面几类:(1)算术运算符(+,-,*,/,%,++,--)(2)关系运算符(>,<,>=,<=,==,!=)(3)布尔逻辑运算符(!,&&,||)(4)位运算符(>>,<<,>>>,&,|,^,~)(5)赋值运算符(=,及其扩展赋值运算符,例如+=)(6)条件运算符(?:)(7)其它(包括分量运算符·、下标运算符[]、实例运算符instanceof、内存分配运算符new、强制类型转换运算符(类型)、方法调用运算符()等。)优先级算术运算符算术运算符作用于整型或浮点型数据,用于完成算术运算。(1)一元算术运算符++op//正值--op//负值++++op,op++//加1----op,op--//减1(2)二元算术运算符[注]op1,op2分别表示两个操作数(整型或浮点型数据)。+op1+op2加-op1-op2减*op1*op2乘/op1/op2除%op1%op2取模(求余)例3.1说明算术运算符的使用publicclassArithmaticOp{publicstaticvoidmain(Stringargs[]){inta=5+4;//a=9intb=a*2;//b=18intc=b/4;//c=4intd=b-c;//d=14inte=-d;//e=-14intf=e%4;//f=-2doubleg=18.4;doubleh=g%4;//h=2.4inti=3;intj=i++;//i=4,j=3intk=++i;//i=5,k=5System.out.println("a="+a);……System.out.println("k="+k);}}其结果为:C>javaArithmaticOpa=9,b=18,c=4,d=14,e=-14,f=-2,g=18.4,h=2.4,i=5,j=3,k=5关系运算符(二元运算符)用来比较两个值,返回的值是布尔类型true或false。关系运算符及返回true的情况:>op1>op2//op1大于op2>=op1>=op2//op1大于或等于op2<op1<op2//op1小于op2<=op1<=op2//op1小于或等于op2==op1==op2//op1与op2相等!=op1!=op2//op1与op2不等Java语言中,任何数据类型的数据都可以通过==或!=来比较是否相等。关系运算符(==)可以比较两个相同类型的变量。如果是对象,就只有在两个变量指向同一个对象时,比较的结果才会是真。举例m1=newMammal();m2=newMammal();booleanb1=m1==m2;//b1=falsem1=m2;booleanb2=m1==m2;//b2=true大多数时候,可以使用equals()方法来比较对象。这个方法是在Object中定义的,但是必须要在Object的子类中实现,才能用来比较对象。布尔逻辑运算符布尔逻辑运算符有一元(!)和二元运算符(&&、||)。布尔逻辑运算如下所示:op1op2op1&&op2op1||op2!op1falsefalsefalsefalsetruefalsetruefalsetruetruetruefalsefalsetruefalsetruetruetruetruefalse对于布尔逻辑运算,一般是先求出运算符左边的表达式的值,对或运算,如果为true,则整个表达式的结果为true,不必对运算符右边的表达式再进行运算;同样,对与运算,如果左边表达式的值为false,则不必对右边的表达式求值,整个表达式的结果为false。位运算符位运算符用来对二进制位进行操作,位运算的操作数只能是整型和字符型数据。Java语言中提供了如下位运算符:~//非(位求补)<<,>>//左移,右移>>>//无符号右移(C,C++无)&//位与^//位异或|//位或例如:shorti=13;//i=0000000000001101i=i<<2;//i=0000000000110100i=i>>3;//i=0000000000000110赋值运算符赋值运算符就是一个等号,用来为变量赋值。其左边必须是一个变量,不能是其它内容。例如:a=5;或a=b+c*5;扩展赋值运算符,即先进行某种运算,然后再用运算的结果进行赋值。具体包括:+=,-=,*=,%=,&=,|=,^=,<<=,>>=,>>>=。条件运算符(?:)?:是三元运算符,其语法是:expression1?expression2:expression3;例如:intx=5,y=4,max;max=(x>y)?x:y;其它操作符“()”用于实现强制类型转换,其功能是将一表达式的类型强制转换为某一指定类型。它的一般格式为:(type)express例如:Floatx;(double)x/100;Java语言规定,强制类型转换只能在数字型数据间进行。操作符“[]”是数组运算符,用它来指定数组的下标,引用数组元素。例如S[3]表示数组S的下标为3的元素。操作符“”是引用对象成员。例如://引用对象的变量,即要访问对象的某个变量objectReference.variable//调用对象的方法,即要调用对象的某个方法objectReference.MethodName([paramlist)操作符“instanceof”是比较对象的类型。第四章控制流主要内容:顺序语句分支语句(if-else,break,switch,return)、循环语句(while,do-while,for,continue)分支语句分支语句提供了一种控制机制,使程序的执行跳过某些语句不执行,而转去执行特定的语句。条件语句if-else格式1:if(expression)statement1;[elsestatement2;]格式2:if(expression1){statement1;}elseif(expression2){statement2;}……elseif(expressionM){statementM;}else{statementN;}说明:逻辑表达式的值必须是布尔类型。每个单一的语句后都必须有分号。当statementi为复合语句时,要用大括号{}括起。建议对单一的语句也用{}括起,这样可增强程序的可读性,且利于程序的扩充。{}外面不加分号。(2)多分支语句switchswitch根据表达式的值来执行多个操作中的一个。格式如下:switch(expression){casevalue1:statement1;break;casevalue2:statement2;break;…………casevalueN:statementN;break;[default:defaultStatement;]}说明:expression的值只能是整型或字符型。case子句中的值valuei必须是常量,具有和expression相同的数据类型,且所有case子句中的值是不同的。break用来在执行完一个case后,使程序跳出switch语句。case分支中包括多个执行语句时,可以不用{}括起。switch的功能可用if-else实现。在某些情况下,switch更简炼,可读性强,且程序的执行效率高。例如:switch(month){case1:System.out.println("January");break;case2:System.out.println("February");break;……case12:System.out.println("December");break;}用if语句来实现如下所示:if(month==1)System.out.println("January");elseif(month==2)System.out.println("February");……elseif(month==12)System.out.println("December");在特殊情况下,多个不同的case值要执行一组相同的操作,这时可不用break。例如计算每月有多少天的例子。intdaysNumswitch(month){case1:case3:case5:case7:case8:case10:case12:daysNum=31;break;case4:case6:case9:case11:daysNum=30;break;case2:if((year%4)==0&&(year%100)!=0)daysNum=29;elsedaysNum=28;break;}循环语句一个循环一般应包括四部分内容:初始化部分(initialization)循环体部分(body)迭代部分(iteration)终止部分(termination)(1)while语句while语句实现“当型”循环,它的一般格式为:[initialization]while(termination){body;[iteration;]}(2)do-while语句实现“直到型”循环。一般格式为:[initialization]do{body;[iteration;]}while(termination);说明:首先执行循环体,然后计算终止条件,若结果为true,则循环执行大括号中的语句,直到布尔表达式的结果为false。与while语句不同的,do-while语句的循环体至少执行一次。例:用do-while语句求阶乘i=1;sum=1;do{sum=sum*i;i++;}while(i<=100);system.out.println(sum);(3)for语句for语句也用来实现“当型”循环,它的一般格式为:for(initialization;termination;iteration){body;}说明:可在for语句的初始化部分声明一个变量,它的作用域为整个for语句。for语句常用来循环次数确定的情况(如对数组元素操作)。在初始化部分和迭代部分可用逗号语句进行多个操作。逗号语句是用逗号分隔的语句序列。例如:for(i=0,j=10;i<j;i++,j--){……}初始化、终止以及迭代部分都可以为空语句(但分号不能丢),三者均为空时,相当于一个无限循环。和其它循环相比,for循环是唯一能够减少代码行数,提高循环效率的途径。例:intx=1,z=0;while(x<=20){z+=x;x++;}相应的for循环是:intz=0;for(intx=1;x<=20;x++){z+=x;}break、return、continue语句break语句break语句总是和switch、for、while、do-while语句一起使用。break的作用是直接中断当前正执行的语句,跳出switch或循环语句。在switch语句中,break用来终止switch的执行,使程序从switch语句后的第一个语句开始执行。在循环中,break语句用来终止当前循环体语句的执行,使程序转移到下一个语句。例如:intx=0;while(x<10){System.out.println("Loopingx="+x);x++;if(x==5)break;else//dosomethingelse}在多重循环中,不带标号的break语句将只退出它所在的内循环。例:for(inti=0;i<200;i++){for(intj=0;j<10;j++){j+=2;if(i<20)break;}system.out.println(i);}对于带标号的break语句,其格式为:breakBlockLabel;例如:
i=5;outer:whilei>0{for(intj=0;j<10;j++){if(j>i)breakouter;}}……Java语言用break来实现goto语句所特有的一些优点。如果break语句后所指定的标号是一个语句的标号,这时break完全实现goto功能。return语句从当前方法中退出,返回到调用该方法的语句处,继续程序的执行。return语句有两种格式:格式1:returnexpression//返回一个值给调用该方法的语句,返回值的数据类型,必须与方法声明中的返回值类型一致。可使用强制类型转换。格式2:return//当方法说明用void声明时,返回类型为空,该格式不返回任何值。一般通过把return语句嵌入某些语句中(如if-else),来使程序在未执行完方法中的所有语句时退出,例如:intmethod(intnum){if(num>0)returnnum;……∥mayormaynotbeexecuted∥dependingonthevalueofnum}continue语句该语句用来结束本次循环,跳过循环体中下面尚未执行的语句,接着进行终止条件的判断,以决定是否继续循环。对于for语句,在进行终止条件判断前,还要先执行迭代语句。有两种格式:格式1:continue;格式2:continueouterLable;例:outer:for(inti=0;i<10;i++){for(intj=0;j<20;j++){if(j>i){……continueouter;}……}……}异常处理语句try、catch、finally以及throw语句
第五章数组主要内容:一维数组和多维数组的有关概念和使用方法5.1数组1.数组是相同类型的元素按顺序组成的一种复合数据类型。2.数组作为一种特殊的数据类型,具有以下特点:数组中的所有元素是同一类型数组中的元素是有顺序的数组中的元素通过数组名和下标来确定tempvijkperson3.Java中,只有定义数组并建立数组后,数组才能被访问。4.在建立数组时,Java会使每个数组元素初始化为默认值0。5.若不希望数组的初值为默认值,则要将数组初始化。6.Java并不支持多维数组。对多维数组的定义是通过对一维数组的嵌套式定义来实现的。7.在Java中,所有数组的起始下标都是0。5.2一维数组1.定义一维数组(声名)格式:typearrayName[];说明:type为Java中任意的数据类型(简单类型或组合类型)arrayName为一个合法的标识符;[]指明是一数组类型变量。例如:intintArray[];堆栈内存区堆内存区nullnullintArrayintArray|
2.建立一维数组格式:arrayName=newtype[arraySize];说明:arraySize指明数组的长度。例如:intArray=newint[3];//为一个整型数组分配3个int型整数所占据的内存空间。堆栈内存区堆内存区intArrayintArray.lengthintArrayintArray.lengthintArray[0]intArray[1]intArray[2]33通常,可以将数组的定义和建立合在一起,格式如下:typearrayName=newtype[arraySize];例如:intintArray=newint[3];等价于下面的语句,intintArray[];intArray=newint[3];3.初始化一维数组方法1:在定义数组的同时对数组初始化。例:intintArray[]={2,4,6}//系统自动为数组元素分配内存空间方法2:在定义数组并建立数组后,对数组初始化。例:intArray[0]=2;intArray[1]=4;intArray[2]=6;3.数组元素的引用格式:arrayName[index]说明:index可以是整型常数或表达式。如a[3],c[6*i](i为整型)。下标从0开始,一直到数组的长度减1。如果下标index超出了数组大小的范围,会产生ArrayIndexOutOfBoundException异常。与C、C++中不同,Java语言对数组元素要进行越界检查以保证安全性。同时,对于每个数组都有一个属性length指明它的长度,例如:intArray.length指明数组intArray的长度。例5.1:对数组中的每个元素赋值,然后按逆序输出。publicclassArrayTest{publicstaticvoidmain(Stringargs[]){inti;inta[]=newint[5];for(i=0;i<5;i++)a[i]=i;for(i=a.length-1;i>=0;i--)System.out.println("a["+i+"]="+a[i]);}}4.数组间的复制Java语言的数组是作为对象来看待,通过引用来操作的。将数组传递到方法中时,只传递数组的引用,而不是这个数组元素。一个数组变量只是生成了一个存放数组的存储位置,而未分配数组元素占用的实际内存空间。由于数组是对象,将一个数据变量赋值给另一个数组变量时,只是复制数组的引用。例:intinta[]=intArray;执行完该语句后,内存空间为:堆栈内存区堆内存区intArrayintArrayintaintArray.lengthintArray[0]intArray[1]intArray[2]3246(5)数组拷贝的另一种方法是采用java.lang.System类中的arraycopy()方法。格式:viodarraycopy(ObjectsourceArray,intsourceArray,ObjectdestinationArray,intdestinationArrayStartPosition,intnumberOfElementsToCopied);说明:从源数组的给定位置,拷贝一定长度的子串到目标数组的给定位置。若拷贝过程中涉及了数组边界之外的数据,则抛出异常ArrayIndexOutOfBoundsException;若源数组数据由于类型不匹配而无法拷贝到目标数组,则抛出异常ArrayStoreException。在调用arraycopy方法之前,必须先分配目标数组所用的存储空间。例:intintArray[]={2,4,6};inta[]={1,2,3,4,5};System.arraycopy(intArray,0,a,0,intArray.length);堆栈内存区堆内存区intArrayintArrayintArray.lengthintArray[0]intArray[1]intArray[2]aa.lengtha[0]a[1]a[2]a[3]a[4]3246524645|5.3多维数组与C、C++一样,Java语言中多维数组被看作数组的数组。例如二维数组是一个特殊的一维数组,其每个元素又是一个一维数组。1.二维数组的定义格式:typearrayName[][];例:intintArray[][];2.分配内存空间方法1:直接为每一维分配空间例:inta[][]=newint[2][3];方法2:从最高维开始,分别为每一维分配空间例:inta[][]=newint[2][];a[0]=newint[3];a[1]=newint[3];说明:与C、C++不同,Java在定义和建立多维数组时,不一定要指明每一维的长度。建立数组时,数组最前面的1维或n维必须指定元素个数,只有后面的方括号中可以不指定元素个数。例:inta[][][]=newint[8][][];堆栈内存区堆内存区aalengtha[0]a[1]lengtha[0][0]a[0][1]a[0][2]lengtha[1][0]a[1][1]a[1][2]2233|333.二维数组元素的引用格式:arrayName[index1][index2]其中index1、index2可为整型常数或表达式。4.二维数组的初始化方法1:直接对每个元素进行赋值。方法2:在定义数组的同时进行初始化。例:inta[][]={{2,3,5},{1,3,4}};该句定义了一个2×3的数组,并对每个元素赋值。Java字符数组的定义和使用方法与上述内容完全一样。例:两个矩阵Am×n、Bn×l相乘得到Cm×l,每个元素Cij=aik*bkjpublicclassMatrixMultiply{publicstaticvoidmain(Stringargs[]){inti,j,k;inta[][]=newint[2][3];intb[][]={{1,5,2,8},{5,9,10,-3},{2,7,-5,-18}};intc[][]=newint[2][4];for(i=0;i<2;i++)for(j=0;j<3;j++)a[i][j]=(i+1)*(j+2);for(i=0;i<2;i++){for(j=0;j<4;j++){c[i][j]=0;for(k=0;k<3;k++)c[i][j]+=a[i][k]*b[k][j];}}第六章面向对象程序设计主要内容:面向对象程序设计的基本概念、Java语言中的类、对象、包、接口和修饰符。6.1面向对象程序设计的发展Simula67并发Pascal、Ada和Modula-2Smalltalk-72、Smalltalk80C++、ObjectPasal、Delphi、Java它与传统的、结构化的程序设计的主要区别:它将数据和对数据的操作放到了一个数据结构中。后者则将数据和对数据的操作分开,需要向过程和函数传递数据结构以便操作它们。它是按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反应来完成一定的任务。6.2面向对象方法的主要概念1.对象对象是对现实世界中事物的一个抽象表示。一个对象就是变量和相关方法的集合,其中变量表明对象的状态,方法表明对象所具有的行为。具有静态特征和动态特征。即:属性(成员变量):描述对象静态特征的一个数据项。方法(服务、成员函数):描述对象动态特征(行为)的一个操作序列。对象的属性域可以是简单类型数据,也可以是另一个对象。所有对象属性可以是简单类型的数据,也可以是对象引用。2.类类是抽象思想的运用。其内部包括属性和方法两个主要部分。类的作用是定义对象,类称为对象的模板(template)。一个对象又称作类的一个实例(instance)。类与对象的关系,类似于非面向对象语言中类型(type)和变量(varible)。类型用于定义数据,类用于定义对象。类是一个类型定义,对象是一个变量声明。一旦建立了类,就可以基于类创建对象。实例化对象/创建类实例(由类创建对象)。通过类的定义可以实现代码的复用。3封装封装是指把对象的属性和方法结合成一个独立的系统单位,尽可能隐蔽对象的内部细节,只保留有限的对外接口使之与外部发生联系。其思想是将对象内部的信息屏蔽,人们只能通过对象界面上的允许操作对对象进行动作,改变对象的属性及状态。通过对对象的封装,实现了模块化和信息隐藏,有利于程序的可移植性和安全性,同时也利于对复杂对象的管理。4继承继承本身就是软件复用。也是可复用性、可扩充性的体现。特殊类的对象拥有其一般类的全部属性与方法,这称作特殊类对一般类的继承。通过父类和子类,实现了类的的层次,可以从最一般的类开始,逐步特殊化,定义一系列的子类。一个类可以是多个一般类的特殊类,它可从多个一般类中继承属性和方法,这种继承模式叫作多重继承。Java语言只支持单一继承,大大降低了复杂度。在Java语言中通过接口可以实现多重继承。接口不仅限于继承,它可以使多个不相关的类具有相同的方法。5.消息在面向对象的系统中,对象间的相互作用是通过消息传送进行。消息就是向对象发出的服务请求,含有下述信息:提供服务的对象标识、服务标识、输入信息和回答信息。一个消息包含三个方面的内容:(1)消息的接收者。(2)接收对象应采用的方法。(3)方法所需要的参数。6.多态性特殊类继承一般类中定义的属性或方法后,可以具有不同的数据类型或表现出不同的行为。即,对父类的方法重写或重新定义实现多态。使用同名方法所在类的类名来区分。例:父类Bank中定义方法setRate(),调用时使用Bank.setRate();子类BankAccount中定义了方法setRate(),调用时使用BankAccount.setRate();在同一类中定义多个同名的不同方法。这种多态称“重载”。例:同一类Bank中定义了方法:voidsetRate();和voidsetRate(floatrate);则调用时会有两种情况:(1)Bank.setRate();(2)Bank.setRate(0.225);总结:(1)对象作为事物的抽象表示。(2)事物的静态特征用对象的属性表示,即用一些数据来表达的特征。动态特征用方法表示。(3)封装性,把对象的属性和方法结合成一个独立的系统单位。(4)分类,具有相同属性和方法的对象归为一类。(5)抽象原则,忽略部分差异,得到类、子类,即继承。(6)消息,对象之间通过消息进行通信。6.3Java的类类是组成Java语言程序的基本要素。它封装了一类对象的属性和方法,是这一类对象的原型。一个类的实现包含两部分的内容:类的说明{类体}1.类声明(1)一个最简单的类声明如下:classclassName{……}(2)类声明的格式:[modifiers]classClassName[extendsSuperClassName][implementsInterfaceList]其中:modifiers指类的特性。public\private\abstract\finalextends指明此类的父类,SuperClassName是父类名。implements指出本类调用的接口,InterfaceList是一个由逗号隔开的接口名字的表。(3)类体类体是类的主体内容。定义了该类所有的变量和该类所支持的方法。类体包括两部分内容:变量说明和方法。类的成员变量须在类体中定义,但不能包含在某个方法中。通常变量在方法前定义,Java中没有独立的函数和过程,所有的子程序都是作为类方法定义的。如下所示:classclassName{memberVariableDeclarationsmethodDeclarations}例6.1.定义了一个Point类,且声明了它的两个变量x、y同时实现init()方法对x、y赋初值。classPonit{intx,y;voidinit(intix,intiy){x=ix;y=iy;}}类中所定义的变量和方法都是类的成员。对类的成员能以一定访问权限,来限定其它对象对它的访问。访问权限有以下几种:private,protected,public,friendly。同时,对类的成员来说,又可以分为实例成员和类成员两种。(4)成员变量成员变量的格式:[variableModifier]typevariableName;例:finaldoublePI=3.1415927;staticStringBufferrecentName;//静态的成员变量Stringn-name;//非静态的成员变量成员变量的类型可以是Java语言中的任意数据类型,包括简单类型、数组、类和接口。在一个类中,成员变量应该是唯一的,但是成员变量的名字可以和类中某个方法的名字相同。类的成员变量和在方法中所声明的局部变量是不同的,成员变量的作用域是整个类,而局部变量的作用域只是方法内部。对一个成员变量,可以限定它的访问权限(见6.8节);可以用static限定它为类变量(见6.5节);可以用修饰符来限定。例如修饰符final。Java的类、变量和方法均可带有final修饰符。(2)方法方法的结构[modifiers]typemethodName(para1,para2,…){methodBody}其中,modifiers表示访问权限。Public,private,protected,privateprotected。若方法是默认型方法,则它可以被同一包中的类访问。type是返回参数类型。若无返回参数,则写成void。入口参数的个数和类型在圆括号中表示出来。方法的调用调用格式:Object.methodName(para1,para2,…);有关方法的几点说明:调用方法的入口参数的个数和类型必须与方法中定义的参数的个数和类型相同。在一个类中,允许几个方法用同一个名字。但要求:这些方法的返回值必须是相同的数据类型,且它们的参数必须不同。this和super在方法中的作用两者用在方法体中作为特殊的变量前缀和方法前缀。this用来指明当前对象的成员变量或方法,以区别同名的局部变量和其他同名的方法。super用于指出父类的变量和方法。在子类中,当需要调用父类的同名方法或使用父类的同名变量时,可用关键字super作前缀指明父类的成员变量和方法。例1:classThreeColor{inth,s,b;ThreeColor(inth,ints,intb){this.h=h;this.s=h;this.b=b;}}例2:classSuperCa{intx;SuperCa(){X=5;System.out.println(“SuperCax=”+x);}voiddoCa(){System.out.println(“SuperCa.doCa()”);}}classSubCaextendsSuperCa{intx;SubCa(){Super();//调用父类的构造方法X=8;System.out.println(“SubCax=”+x);}voiddoCa(){super.doCa();//调用父类的方法System.out.println(“inSubCa.doCa()”);System.out.println(“super.x=”+super.x);}}(3)多态Java语言通过方法重写和方法重载来实现多态。方法重载,在Java类中可创建名字相同,但参数和返回值不同的几个方法。Java系统通过参数和返回值来分辨具体是哪一个方法。方法重写,子类可以重新实现父类的某些方法,使其具有自己的特征。(4)构造方法每个类都包括一个特殊用途的方法,即构造方法(constructor)。它和类名永远相同,且无返回值。用new建立对象就是在调用构造函数。建完之后,类的成员变量和方法就可以用“.”来访问。Java中的每个类都有构造方法,用来初始化该类的一个新的对象。即,为对象分配资源,并返回对象的一个实例。在构造方法的实现中,可进行方法重写。Java语言支持方法重载,所以类可有多个共享同一个名字的构造方法,可以通过参数的类型和数目区分。构造方法使用它的参数初始化新对象的状态,当创建对象时,应该选择其参数最能反映所初始化的新对象的构造方法。例6.4classpoint{intx,y;point(){x=0;y=0;}point(intx,inty){this.x=x;this.y=y;}}用构造方法进行初始化,可避免在生成对象后,每次都要调用对象的初始化方法。若无实现类的构造方法,Java运行时系统会自动提供缺省的构造方法,它没有任何参数。例在构造方法中用this和super调用其他构造方法classBeeextendsQueen{inta;Bee(inta){this.a=a}Bee(){this(25);}}classBeeextendsQueen{intb;Bee(intb){super(16);this.b=b;}调用构造方法遵循的规则:从一个类创建对象,可以调用此类的父类的构造方法.一个构造方法用this语句调用本类的另一个构造方法时,若被调用的构造方法又是调用父类的构造方法而没用super语句,则编译器自动认为它含有super()语句.若某个类的构造方法第一个语句是:用this来调用本类的另一个构造方法,则Java系统,就不再默认该构造方法调用的是父类的构造方法。若某个类的构造方法第一个语句没有用super,来调用其父类的构造方法,则编译器也默认为在构造方法中,用super()语句调用父类的不带参数的构造方法。例:publicclassFirst{inta;publicFirst(){a=12;}}publicclassSecondextendsFirst{intx,y;publicSecond(intx,inty){this.x=x;this.y=y;}publicSecond(){this(2,6);……}……}(5)方法finalize()用来释放构造函数分配的资源。有时在类不再有用之后,有些无用单元收集机制不能处理的资源需要特殊清理。方法finalize()在类java.lang.Object中实现。不能将时间相关的代码加入finalize。(6)方法main()Java的每个应用程序一定包含main()。Java解释器运行字节码文件时,首先寻找main(),以此作为程序的入口开始运行。当main()结束时(语句块的结束或用System.exit语句),程序也运行结束。main()没有返回参数,其入口参数就是应用程序运行时命令行给出的参数。6.4继承预先定义一个包含公用变量和公用方法的类作为父类,在此基础上创建具有专用变量和专用方法的子类。子类将自动继承父类的所有特性(成员变量)和行为(方法)。此外,子类可以增加父类中没有的变量和方法,也可以再定义父类中已有的变量和方法。父类中除专用型变量/方法不能被子类调用外,其他均可由子类调用。继承只能是增加行为和属性,子类不可能比父类具有更少的行为和属性。变量隐藏。子类继承父类中,若子类的成员变量与父类的同名,称子类隐藏了父类的成员变量。此时,子类使用的是它自己的变量。若要调用父类的变量,必须用关键字super。方法置换Java的继承机制使用extends使用this和super(super()、this()、)例:MammalClass具有DogClass和ManClass的共同特性。packageOOP1;publicclassMammalClass{Stringname,eyeColor;intage;publicMammalClass(){name="TheName";eyeColor="Black";age=0;}}例:重写DogClass和ManClass,来说明利用继承的好处:packageOOP1;publicclassDogClassextendsMammalClass{booleanhasTail;publicDogClass(){name="Chase";eyeColor="Black";age=2;hasTail=true;}packageOOP1;publicclassManClassextendsMamalClass{booleanisMarried;publicManClass(){Name="Casey";eyeColor="Blue";age=1;isMarried=true;}}例:publicclassA{intx;voidboy(){System.out.printin(“100”);}}publicclassBextendsA{intx;voidboy(){super.boy();System.out.printin(“200”);}voidtype(){x=super.x–2;//也可写成this.x=super.x–2;System.out.printin(“inClassA,x=”+super.x);System.out.printin(“inClassB,x=”+this.x);}}6.5Java的对象1.对象的生成(创建)包括声明、建立和初始化三方面的内容。(1)对象的声明(定义)格式:typeobjectName,说明:type为类名,指出对象所属的类例如:PointmyObject;(2)对象的建立(将类进行实例化)通过new调用对应类的构造方法,来完成内存分配,返回对该对象的一个引用(即该对象所在的内存地址)。myObject=newPoint(6,2)myObject=newPoint();(3)对象的初始化执行构造方法,进行初始化。由于构造方法可重写,所以通过给出不同个数或类型的参数会分别调用不同的构造方法。上述三步也可用一步完成:PointmyObject=newPoint();PointmyObject=newPoint(6,2);PointmyObject=newPoint(4,8,5);PointmyObject=newPoint(2.5,3.5,7.5,8.5);例classPoint{intx,y;Stringname="apoint";Point(){x=0;y=0;}Point(intx,inty,Stringname){this.x=x;this.y=y;=name;}intgetX(){returnx;}intgetY(){returny;}voidmove(intnewX,intnewY){x=newX;y=newY;}PointnewPoint(Stringname){PointnewP=newPoint(-x,-y,name);ReturnnewP;}booleanequal(intx,inty){if(this.x==x&&this.y==y)returntrue;elsereturnfalse;}voidprint(){System.out.println(name+":x="+x+"y="+y);}}publicclassUsingObject{publicstaticvoidmain(Stringargs[]){Pointp=newPoint();p.print();//callmethodofanobjectp.move(50,50);System.out.println("**aftermoving**");System.out.println("Getxandydirectly");//accessvariablesofanobjectSystem.out.println("x="+p.x+"y="+p.y);System.out.println("orGetxandybycallingmethod");System.out.println("x="+p.getX()+"y="+p.getY());if(p.equal(50,50))System.out.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 26年战略效果评估手册
- 医学26年:酒精性脂肪肝诊疗 查房课件
- 敦煌壁画文化衍生品设计开发策略
- 教师教育信息技术应用体系构建
- 播音主持系统课件
- 广东省广州市番禺区2024-2025学年八年级上学期期末地理试卷(含答案)
- 2026中医护理课件解读
- 完整施工流程标准化实施纲要
- 2026下肢深静脉血栓形成介入治疗护理解读
- 教育项目综合体
- 人教版五年级语文上册第八单元:《青山处处埋忠骨》教案:通过情境朗读家国情怀引导学生理解担当落实革命文化启蒙培育责任意识与表达素养
- 民法典与医疗法律法规
- 养老社区2025年定位手环协议
- 2026年医学微生物学复习押题宝典通关考试题库附答案详解【突破训练】
- 2026云南楚雄州武定县事业单位选调37人备考题库及答案详解(真题汇编)
- 医疗机构防灾减灾课件
- 《化工企业设备检修作业安全规范》AQ 3026-2026解读-应急部2026.4.10
- 高中政治必修+选必核心答题术语(简化版)
- 经典酒店设计案例分析
- (2026春新版)北师大版二年级数学下册全册教学设计
- 2026年高中历史学业水平考试知识点归纳总结(复习必背)
评论
0/150
提交评论