Java面向对象程序设计-课件全套 虞建东 第1-11章 -Java语言概述-JDBC和MySQL数据库_第1页
Java面向对象程序设计-课件全套 虞建东 第1-11章 -Java语言概述-JDBC和MySQL数据库_第2页
Java面向对象程序设计-课件全套 虞建东 第1-11章 -Java语言概述-JDBC和MySQL数据库_第3页
Java面向对象程序设计-课件全套 虞建东 第1-11章 -Java语言概述-JDBC和MySQL数据库_第4页
Java面向对象程序设计-课件全套 虞建东 第1-11章 -Java语言概述-JDBC和MySQL数据库_第5页
已阅读5页,还剩311页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java面向对象程序设计2课程的主要内容1、概述2、Java语言基础3、面向对象技术4、Java实用类库5、输入/输出处理6、异常处理(Exception)7、多线程8、图形用户界面与事件处理9、网络通信10、数据库编程3参考资料Java编程思想Java核心技术,卷I:基础知识/java/4本讲基本内容简介各种相关的编程语言介绍Java语言的特点介绍Java语言的开发环境Java程序规范5Java的历史1991年SunMicrosystem公司的JamesGosling、BillJoe等人开发的面向信息家电的编程软件OakOak->Java:互联网给Java带来新的生机1995年Sun向公众推出Java并引起业界的轰动Java是当今最流行的软件开发语言之一,Sun推出了Java2&J2EE使Java具有更广泛的用途,适用于各种应用开发,尤其是网络应用,网络服务,嵌入式系统6解释型vs.编译型的工作模式源程序Java编译器SPARCpentiumPowerpc中间码PowerpcpentiumSPARC二进制源程序SPARCPowerpcpentiumPowerpcpentiumSPARCJava解释器类、类库装载(库)链接7Java的编译与执行编译,没有绝对地址调入包含、继承所用到的所有类,内存分配确定,变成真正可执行的机器码Java源程序(.java文件)Java编译器JavaBytecode(.class文件)系统执行平台Bytecode解释器Bytecode载入器字节码校验器不存在伪造的指针不违反访问权限不非法访问对象不导致操作栈溢出

8Java虚拟机不同的操作系统有不同的虚拟机。它类似一个小巧而高效的CPU。Bytecode代码是与平台无关的虚拟机的机器指令。Java字节代码运行的两种方式:interpreter(解释方式)Just-in-time(即时编译):由代码生成器将字节代码转换成本机的机器代码,然后可以以较高速度执行.JavainterpreterJust-in-timecompilerRuntimeSystemOperatingSystemHardware9Java开发环境——开发工具javac.exe:Java编译器,用来将java程序编译成Bytecode。java.exe:Java解释器,执行已经转换成Bytecode的Java应用程序。jdb.exe:Java调试器,用来调试Java程序。javap.exe:反编译(将.class文件还原为.java)。javadoc.exe:文档生成器,创建HTML文件。appletviwer.exe:Applet解释器,用来解释已经转换成Bytecode的Java小应用程序。10Java程序——程序结构Java程序结构:package语句:零个或一个,必须放在文件开始import语句:零个或多个,必须放在所有类定义之前publicClassDefinition:零个或一个ClassDefinition:零个或多个InterfaceDefinition:零个或多个类个数:至少一个类,最多只能有一个public类源文件命名:若有public类,源文件必须按该类命名标识符:区分大小写建议:一个类一个.java文件11Java程序——命名规则包、类、变量、方法等命名:要体现各自的含义。包名全部小写,io,awt类名第一个字母要大写,HelloWorldApp变量名第一个字母要小写,userName方法名第一个字母要小写,setName程序书写格式:保证良好的可读性,使程序一目了然。大括号{}的使用与对齐语句段的对齐在语句段之间适当空行程序注释:帮助了解程序的功能。类注释 变量注释 方法注释语句注释 语句段注释13Java语言基础关键字与标识符数据类型数据类型的转换运算符和表达式流程控制数组141.1标识符(Identifier)程序员对程序中的各个元素加以命名时使用的命名记号称为标识符,包括:类名、变量名、方法名……Java语言中,标识符是以字母,下划线(_),货币符($£¥)开始的一个字符序列,后面可以跟字母,下划线,货币符,数字。Java标识符区分大小写字母。标识符中最好不使用货币符($£),因为这些符号常被用于内部处理。合法的标识符:IdentifieruserNameUser_Name_sys_value$changemy$Change非法的标识符:2mailroom#class151.2数据类型(DataType)Javatypesystemprimitivereferencenullcharnumericbooleanclassinterfacearrayintegralfloating-pointbyteshortintlongfloatdouble161.2数据类型(DataType)数据类型

所占位数

数的范围

boolean 1 true/falsechar 16 0~65535byte

8

-27~27-1short 16 -215~215-1 int 32 -231~231-1 long 64 -263~263-1 float0.0f 32 7 -3.4e+38

~3.4e+38double0.0 64 15 -1.7e+308

~1.7e+308171.2数据类型(DataType)所有基本类型所占的位数都是确定的,并不因操作系统的不同而不同。所有基本类型的关键词都是小写的。数据类型转换必须满足如下规则:不能对boolean类型进行类型转换。不能把对象类型转换成不相关类的对象。在把容量大的类型转换为容量小的类型时必须使用强制类型转换。181.2.1布尔类型(boolean)布尔型数据只有两个值true和false它们不对应于任何整数值false为缺省值布尔型数据只能参与逻辑关系运算:&&||==!=!示例:booleanb1;booleanb2=true;b=!b2;booleanb=(b1&&b2)!=false;191.2.2字符类型(char)字符型数据代表16位的Unicode字符字符常量是用单引号括起来的一个字符'a'‘B’‘\n’‘\u0030’字符型数据的取值范围为0~65535或者说\u0000~\uFFFF\u0000为缺省值示例charc1; \\缺省值为0charc2=‘0’; \\赋初值为字符'0'charc3=32; \\用整数赋初值为空格201.2.2字符类型(char)特殊字符的常量表示法:反斜线(Backslash) ‘\\’退格(Backspace) ‘\b’回车(Carriagereturn) ‘\r’进纸符(Formfeed) ‘\f’制表符(Formfeed) ‘\t’换行(Newline) ‘\n’单引号(Singlequote) ‘\’’八进制数(‘\0’~‘\377’

) ‘\DDD’Unicode字符 ‘\uHHHH’211.2.3整数类型(byteshortintlong)整数常量表示法:十进制:

0-243

2147483647八进制以0开头:

010[=8]-0377[=-255]十六进制以0x或0X开头:

0x10[=16]-0XF=[-15]64位长整数以l或L结尾:12l-343L0xfffffffffL1L<<32等于4294967296L1<<32等于1(特别注意非0)没有以l或L结尾的数字,根据其实际值所属范围,可以被用作byte,short,或int型整数以l或L结尾的数字,无论其实际值所属范围怎样,都被用作long型整数221.2.3整数类型(byteshortintlong)示例byteb1; \\缺省值为0byteb2=127; \\赋初值为127shorts1=(short)(b1+b2);\\强制类型转换shorts2=(short)(b1+123)\\强制类型转换intn=b1+b2; \\不需要强制类型转换longl1=2343; \\不需要强制类型转换longl2=4294967296L; \\必须用L或l结尾longl3=65536*63356; \\乘法运算越界,l3为0longl4=65536L*63356; \\l3为4294967296L231.2.4浮点数类型(floatdouble)浮点数(实数)常量的两种表示法十机制小数形式:0.23.18-234.科学计数法形式:0.23e61.23E-432位浮点数形式:0.23f1.23E-4f.18F示例doubled1=127.0; \\赋初值为127doubled2=127; \\赋初值为127floatf1=127.0f; \\必须在数字后加f或Ffloatf2=4.0e38f; \\错误!32位浮点数不能超过 \\3.4028234663852886e38floatf3=(float)d1; \\必须强制类型转换241.2.5类型转换(typecast)基本数据类型在赋值时的自动类型转换规则:byte short,char,int,long,float,doubleshort int,long,float,doublechar int,long,float,doubleint long,float,doublelong float,doublefloat double反向的类型转换必须使用强制类型转换转换过程中可能损失精度(byte)255==-1 (byte)0x5634==0x34浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入(int)23.7==23 (int)-45.89f==-45251.3字符串(String)字符串是Java中最常用的类字符串常量是双引号(“”)引起来的字符序列“astring”“a\nmultiline\nstring\n”多个字符串通过连接运算(+)生成新字符串对象“twostring”+“concatenateintoone”字符串可以和基本类型做连接运算Strings=“0xF=”+0xF;//“0xF=15”字符串可以和任何对象做连接运算Strings=“s=”+anObject;//“s=…”261.3.1基本类型转换为字符串布尔类型(boolean)true->“true” false->“false”整数类型(byteshortintlong)byteshortintlong->整数的十进制表示字符类型(char)’A’->“A” ‘\uHHHH’->“\uHHHH”浮点数类型(floatdoule)相应精度的十进制浮点数(必要时使用科学计数法)float的精度约为7;double的精度约为15271.3.2对象转换为字符串任何一个对象都有toString()方法,这个方法在所有对象的基类Object中有缺省实现在需要将对象自动转换为字符串的地方,对象的toString()方法被调用,用来生成相应的字符串。任何类(class)、接口(interface)、数组(array)的实例都是对象。281.3.3字符串(String)特殊字符在字符串中的表示法反斜线(Backslash) \\退格(Backspace) \b回车(Carriagereturn) \r进纸符(Formfeed) \f制表符(Formfeed) \t换行(Newline) \n双引号(Doublequote) \”八进制数(‘\0’~‘\377’

) \DDDUnicode字符 \uHHHH292.1运算符(Operator)算术运算符:+,―,*,/,%,++,--关系运算符:>,<,>=,<=,==,!=布尔逻辑运算符:!,&&,||位运算符:>>,<<,>>>,&,|,^,~赋值运算符:=,+=,-=,*=,/=三元条件运算符:?:302.1运算符(Operator)其它特殊的运算符包括分量运算符:.下标运算符:[]实例类型判断运算符:instanceof对象示例创建运算符:new,强制类型转换运算符:(类型)方法调用运算符:()312.2表达式表达式是由操作数和运算符按一定的语法形式组成的符号序列。一个常量或一个变量名字是最简单的表达式,其值即该常量或变量的值;表达式的值还可以用作其他运算的操作数,形成更复杂的表达式。示例:X num1+num2 a*(b+c)+d3.14 x<=(y+z) x&&y||z322.3优先级和结合顺序1) .,

[],() 9) &2) ++,--,!,~,instanceof 10) ^

3) +,-,(type),

new 11) |4) *

,/,% 12) &&5) +,- 13) ||6) >>,>>>,<< 14) ?:7) >,<,>=,<= 15) =,+=,-=,*=,/=,%=,^=8) ==,!= 16) &=,|=,<<=,>>=,>>>=注:红色的从右到左,其余的从左到右;用括号改变结合顺序。 蓝色运算符对byte、short、char作运算时,结果为int型整数。332.4语句和代码段一个由分号(;)结尾的单一命令是一条语句(Statement),一条语句一般是一行代码,但也可以占多行代码。inta=1;//变量定义及初始化语句用大括号({……})围起来的多条语句构成一个代码段(Codeblock);同时代码段也大括号前的一些修饰性描述:classAclass{ for(inti=0;i<=1;i++){……

……

} }342.5作用域(Scope)作用域决定了变量可使用的范围全局变量(Globalvariables):变量可以在整个类中被访问;(成员变量,类变量)局部变量(Localvariables):变量只能在定义其的代码段中被访问。作用域规则:在一个代码段中定义的变量只能在该代码段或者该代码段的子代码段中可见。使用局部变量比使用全局变量更安全。352.5作用域(示例)classScoping{intx=0;voidmethod1(){inty;y=x;//OK.method1可以访问y.}voidmethod2(){intz=1;z=y;//Error.y在method2的作用域之外定义

}}363.Java语言的控制分支语句:if-else,switch循环语句:while,do-while,for与程序转移有关的其它语句:break,continue,return例外处理语句:try-catch-finally,throw373.1条件语句if-elseif(boolean-expression1){statements1;}elseif(boolean-expression2){statements2;}……elseif(boolean-expressionN){statementsN;}else{statementsElse;}383.1条件语句if-else布尔表达式boolean-expression是任意一个返回布尔数据类型的表达式,而且必须是(比C或C++要严格)。与C或C++一样,每个单一语句后面都要有分号。为了增强程序的可读性,应将if或else后的语句用{}括起来。else子句是任选的,不能单独作为语句使用,它必须和if语句配对使用,并且总是与离它最近的if配对。if(1<2){System.out.println(“1issmallerthan2”);}else{System.out.println(“CanNOTreachhere!”);}393.1多分支语句switchswitch(expression) {casevalue1:statements1;break;……casevalueN:statementsN;break;[default:defaultStatements;]}403.1多分支语句switch表达式expression的返回值类型必须是这几种类型之一:int、byte、char、short、String。case子句中的值valueI必须是常量,而且所有case子句中的值应是不同的。default子句是任选的。break语句用来在执行完一个case分支后,使程序跳出switch语句,即终止switch语句的执行。如果某个case分支后没有break语句,程序将不再做比较而执行下一个分支。switch语句的功能可以用if-else语句来实现,但某些情况下,使用switch语句更简炼。413.1多分支语句switchinta=100,b=20,c;charoper=‘+’;switch(oper){case‘+’:c=a+b;break;case‘-’:c=a-b;break;default:c=a*b;

[break;]}423.2循环语句while[initialization]//初始化条件while(termination){//循环条件

body; //循环体

[iteration;] //迭代变更循 //环条件}当表达式termination为true时,执行{}中的语句,否则终止循环。tbfalsetrue433.2循环语句do-while[initialization]//初始化条件do{body; //循环体

[iteration;] //迭代变更循 //环条件}while(termination);//循环条件首先执行一遍{}中的语句,当表达式termination为true时,继续执行{}中的语句,否则终止循环。tbfalsetrue443.2循环语句forfor(Init;Termination;Iterat){ body;//循环体}Init//初始化条件Termination//循环条件Iterat//迭代变更循环条件tbodyfalsetrueiterainit453.2循环语句forfor语句执行时,首先执行初始化操作,然后判断终止条件是否满足,如果满足,则执行循环体中的语句,最后执行迭代部分。完成一次循环后,重新判断终止条件。初始化、终止以及迭代部分都可以为空语句(但分号不能省),三者均为空的时候,相当于一个无限循环。在初始化部分和迭代部分可以使用逗号语句,来进行多个操作。逗号语句是用逗号分隔的语句序列。for(inti=0,intj=10;i<j;i++,j--){……}463.2循环语句比较intn=1,sum=0;while(n<=10){sum=sum+n;n++;}intn=10,sum=0;do{sum+=n;n--;}while(n>0);intsum=0;for(inti=1;i<=10;i++){sum+=i;}while循环do-while循环for循环473.3程序转移相关语句break在switch语中,break语句用来终止switch语句的执行,使程序从整个switch语句后的第一条语句开始执行。在循环语句中,break用于终止并跳出循环,从紧跟着循环体代码段后的语句执行。在Java中,可以为每个代码块加一个标号,break语句可用于跳出它所指定的块,并从紧跟该块后的第一条语句处执行。BlockLabel:{codeBlock;breakBlockLabel;}483.3程序转移相关语句breaka:{//标记代码块a…… b:{//标记代码块b……c:{//标记代码块c……breakb;……//这段语句将不执行

}//代码块c结束

……//这段语句也不执行

}//代码块b结束

……//从这段语句开始执行}//代码块a结束493.3程序转移相关语句continuecontinue语句用来结束本次循环,跳过循环体中下面尚未执行的语句,接着进行终止条件的判断,以决定是否继续循环。对于for语句,在进行终止条件的判断前,还要先执行迭代语句。它的格式为:continue;也可以用continue跳转到括号指明的外层循环中,这时的格式为continueouterLable;503.3程序转移相关语句continueouter:for(inti=0;i<10;i++){//外层循环

inner:for(intj=0;j<10;j++){//内层循环

if(i<j){ ……

continueouter; } ……}//内层循环结束

……}//外层循环结束for(inti=0;i<10;i++){if(i==5){continue;}

……}513.3程序转移相关语句returnreturn语句从当前方法中退出,返回到调用该方法的语句处,并从紧跟该语句的下一条语句继续程序的执行。返回语句有两种格式:returnexpression;//当方法需要返回某种类型数据时return;//当方法的返回类型为void时单独一条return语句放在方法中间时,会产生编译错误,因为其后的语句将不会执行到。若真需要退出方法,可以通过将return语句嵌入某些语句(如if-else)来使程序在未执行完方法中所有语句时退出。524

数组和字符串数组是一组同类型的变量或对象的集合数组的类型可以是基本类型,或类和接口数组中每个元素的类型相同引用数组元素通过数组名[下标]数组下标(数组的索引)从0开始数组是一种特殊的对象(Object)定义类型(声明)创建数组(分配内存空间):new释放(Java虚拟机完成)一维数组、多维数组534.1一维数组一维数组的元素只有一个下标变量例:A[1],c[3]一维数组的声明方法1:类型数组名[];Stringargs[];inta[];doubleamount[];charc[];方法2:类型[]数组名;String[]args;int[]a;double[]amount;char[]c;注意类型是数组中元素的数据类型(基本和构造类型)数组名是一个标识符数组声明后不能被访问,因未为数组元素分配内存空间variabledmightnothavebeeninitializedSystem.out.println(d[0]);^1errordouble[]d;System.out.println(d[0]);54数组的创建用new来创建数组为数组元素分配内存空间,并对数组元素进行初始化格式:数组名=new类型[数组长度]例:a=newint[3];声明和创建的联用:int[]a=newint[3];默认赋初值整型初值为0int[]i=newint[3];实型初值为0.0float[]f=newfloat[3];布尔型初值为falseboolean[]b=newboolean[3];字符型初值为\u0000(不可见)char[]c=newchar[3];55classTest{ publicstaticvoidmain(Stringargs[]){ int[]i=newint[3]; float[]f=newfloat[3]; boolean[]b=newboolean[3]; char[]c=newchar[3]; for(intj=0;j<i.length;j++) System.out.println(i[j]); for(intj=0;j<f.length;j++) System.out.println(f[j]); for(intj=0;j<b.length;j++) System.out.println(b[j]); for(intj=0;j<c.length;j++) System.out.println(c[j]); }}C:\>javaTest0000.00.00.0falsefalsefalseC:\T56一维数组的初始化为数组元素指定初始值方式一:声明和创建数组后对数组初始化classTest{ publicstaticvoidmain(Stringargs[]){ inta[]=newint[5]; System.out.println(“\t输出一维数组a:”); for(inti=0;i<5;i++){ a[i]=i+1; System.out.println(“\ta[”+i+“]=”+a[i]); }}}a.length57一维数组的初始化方式二:在声明数组的同时对数组初始化格式:类型数组名[]={元素1[,元素2……]};inta[]={1,2,3,4,5};classTest{ publicstaticvoidmain(Stringargs[]){ inta[]={1,2,3,4,5}; System.out.println(“\t输出一维数组a:”); for(inti=0;i<5;i++) System.out.println(“\ta[”+i+“]=”+a[i]); }}58数组的赋值数组的整体赋值用java.lang.System类的方法进行数组复制59数组整体赋值classTest{ publicstaticvoidmain(Stringargs[]){ inta[]={2,4,6,8}; intb[];int[]c={1,3,5,7}; b=a;c=a; for(intj=0;j<a.length;j++) System.out.print(a[j]+““); System.out.println(); for(intj=0;j<b.length;j++) System.out.print(b[j]+““); System.out.println(); for(intj=0;j<c.length;j++) System.out.print(c[j]); }}C:\>javaTest246824682468C:\>T60一维数组的数组复制java.lang.System类的方法publicstaticvoidarraycopy(Objectsrc, intsrcIndex, Objectdest, intdestIndex, intlength)61classTest{publicstaticvoidmain(Stringargs[]){int[]a={2,4,6,8}; int[]b; int[]c={1,3,5,7,9}; b=a; System.arraycopy(a,1,c,0,3); System.out.print(“数组a:”); for(inti=0;i<a.length;i++) System.out.print(a[i]+“”); System.out.println(); System.out.print(“数组b:”); for(inti=0;i<b.length;i++) System.out.print(b[i]+“”); System.out.println();一维数组的数组复制System.out.print(“数组c:”);for(inti=0;i<c.length;i++) System.out.print(c[i]+“”);System.out.println();}}数组a:2468数组b:2468数组c:46879T62小结类型相同、数量确定的存储结构用下标访问数组中任一个元素,数组名[下标]声明、创建(new)、初始化/赋值int[]d;System.out.println(d[0]);System.out.println(d.length);variabledmightnothavebeeninitializedSystem.out.println(d[0]); ^System.out.println(d.length);^634.2多维数组数组的数组ArraysofArrays例:表格(行和列)以二维数组为例期中考试期末考试姓名总分6870学生A698085学生B847590学生C8664二维数组的声明类型数组名[][],例inta[][];数组声明后不能被访问,因未为数组元素分配内存空间二维数组的创建方法一:直接分配空间(new)例inta[][]=newint[2][3];

a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]两个一维数组,每个数组包含3个元素65二维数组的创建方法二:从最高维开始,为每一维分配空间例int[][]c=newint[2][];c[0]=newint[4];c[1]=newint[3];c[0][0]c[0][1]c[0][2]c[0][3]c[1][0]c[1][1]c[1][2]注:为数组分配空间需指定维数大小,至少最高维(最左边)大小错误:intb[][]=newint[][];66二维数组的初始化对每个元素单独进行赋值声明数组的同时初始化对数组元素的引用数组名[下标1][下标2]下标为非负的整型常数0~67二维数组的初始化每个元素单独进行赋值classTest{ publicstaticvoidmain(Stringargs[]){ int[][]a=newint[3][3]; a[0][0]=1;a[1][1]=1;a[2][2]=1; System.out.println(“数组a:”); for(inti=0;i<a.length;i++){ for(intj=0;j<a[i].length;j++) System.out.print(a[i][j]+“”); System.out.println(); } }}最高维数组长度10001000168二维数组的初始化声明数组的同时初始化例int[][]a={{1,2,3},{3,4,5}};a[0][0]=1a[0][1]=2a[0][2]=3a[1][0]=3a[1][1]=4a[1][2]=5

例String[][]cartoons={{"Flint","Fred","Wim","Pebbles","Dino"},{"Rub","Barn","Bet","Bam"},{"Jet","Geo","Jane","Elroy","Judy","Rosie","Astro"},{"Sco","Sco","Shag","Velma","Fred","Dap"}};inti=cartoons.length694.3数组的界限起点和终点数组的长度:数组名.length起点:数组名[0]终点:数组名[length-1]inti={4,56,78,9,34};i.length5i[0]

4i[length-1]=i[4]34i[a]若a>4则???703类和对象-1程序语言的发展面向机器(机器语言、汇编语言)可读性、可维护、移植性差;效率高。面向过程核心:算法+数据结构缺陷:随着应用程序的规模扩大,操作与数据分离所带来的维护工作量越来越大不适用于GUI界面、事件驱动编程面向对象面向对象设计思想的要点认为客观世界由各种对象组成,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合而成。把所有对象都划分成各种对象类,每个对象类都定义了一组数据和一组方法。按照子类与父类的关系,把若干个对象类组成一个层次结构的系统。对象彼此之间仅能通过传递消息互相联系

抽象性 封装性 继承性多态性面向对象程序设计的优点开发时间短,效率高,可靠性高,所开发的程序更强壮。由于面向对象编程的可重用性,可以在应用程序中大量采用成熟的类库,从而缩短了开发时间。应用程序更易于维护、更新和升级。继承和封装使得应用程序的修改带来的影响更加局部化。可重用性 可扩展性 可管理性741.面向对象的概念现实世界 :人、狗、书计算机模型:类是对象的模板,对象是类的实例

classPerson{}

Personp=newPerson();intx=9;int[]a=newint[]{1,2,3};Strings=newString(“qaz”);75现实生活中的对象对象在程序中是通过一种抽象数据类型来描述的,这种抽象数据类型称为类(class)。classCar{intcolorNo;intdoorNumber;

intspeed;

voidbrake(){…}voidspeedUp(){…}voidslowDown(){…}}

抽象数据类型76……Carcar1;Carcar2;…

…CarcarN;方法构造方法是一种特殊方法,它的名字必须与它所在的类的名字完全相同,而且没有类型,构造方法也可以重载。方法重载:一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是某个参数的类型不同。实例方法和类方法classA{inta;floatmax(floatx,floaty){//实例方法

…}

staticfloatjerry(){//类方法

…}

staticvoidspeak(Strings){//类方法

…}}实例方法既能对类变量操作也能对实例变量操作,而类方法只能对类变量进行操作。实例方法可以调用该类中的实例或类方法;类方法只能调用该类的类方法,不能调用实例方法。静态的是属于类的,实例的属于对象实例。成员变量、类变量、局部变量对象的内存模型(引用、指针\堆和栈)创建一个对象包括对象的声明和为对象分配classPoint{intx,y;Point(inta,intb){x=a;y=b;}}Pointp1=newPoint(5,15);Pointp2=newPoint(8,18);p1=p2;参数的传递this关键字包是Java语言中有效地管理类的一个机制包名的目的是有效的区分名字相同的类,不同Java源文件中两个类名字相同时,它们可以通过隶属不同的包来相互区分com.sun.java.Hello.class包和import84访问权限当类可以被访问时,对类的成员变量和成员方法而言,其应用范围可以通过施以一定的访问权限来限定。 类内 包内 子类 任意 公共的(public) ★ ★ ★ ★ 保护的(protected)★ ★ ★ 包访问(缺省) ★ ★ 私有的(private) ★基本类型的类包装

提供了基本数据类型相关的类,这些类在java.lang包中,分别是:Byte、Integer、Short、Long、Float、Double和Character类.自动装箱就是允许把一个基本数据类型的值直接赋值给基本数据类型相对应的类的实例,例如:

Integernumber=100;或

intm=100;Integernumber=m;上述语句的装箱过程是:Integernumber=newInteger(m);自动拆箱就是允许把基本数据类型的类的实例当作相应的基本数据类型来使用,例如:number是一个Integer对象,那么允许:

intx=number+number;上述语句的拆箱过程是:intx=Value()+Value();4.11基本类型的类包装

4.11.1Double和Float类4.11.2Byte、Short、Integer、Long类4.11.3Character类4.11.4自动装箱与拆箱自动装箱就是允许把一个基本数据类型的值直接赋值给基本数据类型相对应的类的实例,例如:

Integernumber=100;或

intm=100;Integernumber=m;上述语句的装箱过程是:Integernumber=newInteger(m);自动拆箱就是允许把基本数据类型的类的实例当作相应的基本数据类型来使用,例如:number是一个Integer对象,那么允许:

intx=number+number;上述语句的拆箱过程是:intx=Value()+Value();87子类子类是作为另一个类的扩充或修正而定义的一个类。bicycle(superclass)MountainbikesRacingbikesTandembikessubclass88继承继承使得子类可以利用父类中定义的方法和变量,就像它们属于子类本身一样。classEmployee{Stringname;publicvoidshowInfo(){System.out.println(name);}}

classManagerextendsEmployee{Stringdepartment;publicvoidshowInfo(){System.out.println(name);System.out.println(“Managerof”+department);}}

89方法override和成员变量的隐藏覆盖使得在子类中可以重新定义父类中已有的方法,从而是子类具有自己的行为。classEmployee{Stringname;publicvoidshowInfo(){System.out.println(name);}}

classManagerextendsEmployee{Stringdepartment;

Stringname;publicvoidshowInfo(){System.out.println(name);System.out.println(“Managerof”+department);}}

90继承的例子ShapePointCircleCylinder何时选择继承?一个很好的经验:“B是一个A吗?”如果是则让B做A的子类.在更多的时候,组成关系比继承更能使系统具有高度的灵活性,可维护行,并且提高系统的可重用性。ShapePointCircleCylinder91方法覆盖时应遵循的原则:覆盖后的方法不能比被覆盖的方法有更严格的访问前提条件。覆盖后的方法不能比被覆盖的方法产生更多的例外,也不能有更松的事后条件。super1、子类如果想明确使用父类的构造方法,必须在子类的构造方法中使用关键字super来调用父类的构造方法,而且super必须是子类构造方法中的头一条语句。3、在父类中定义构造方法时,应尽量写一个不带参数的构造方法,以防子类省略super时出现错误。2、在子类的构造方法中,没有明显地写出super关键字来调用父类的某个构造方法,那么默认地有:super();即调用父类的不带参数的构造方法。2、final类不能被继承,即不能有子类。1、final关键字可以修饰类、成员变量和方法中的局部变量。3、修饰方法,则不允许子类重写父类的final方法。4、成员变量或局部变量被修饰为final的,就是常量。常量在声明时没有默认值,所以在声明常量时必须指定该常量的值,而且不能再发生变化。final对象的上转型1.上转型对象不能操作子类新增的成员变量(失掉了这部分属性);不能调用子类新增的方法(失掉了一些功能)。2.上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类的重写方法。上转型对象操作子类继承的方法或子类重写的方法,其作用等价于子类对象去调用这些方法。因此,如果子类重写了父类的某个方法后,当对象的上转型对象调用这个方法时一定是调用了子类重写的方法。多态多态:不同的对象收到同一个消息可产生完全不同的效果

或同一个行为具有多个不同表现形式或形态的能力多态的效果:用户发送一个通用的消息,而实现的细节则由接收对象自行决定。多态的作用:增强了操作的透明性、可理解性和可扩展性。增强了软件的灵活性和重用性。多态存在的三个必要条件继承重写父类引用指向子类对象9596抽象类抽象类:用abstract关键字来修饰一个类时,该类叫做抽象类;抽象类必须被继承。抽象类不能被直接实例化。它只能作为其它类的超类,这一点与最终类(final类)正好相反。抽象方法:用abstract来修饰一个方法时,该方法叫做抽象方法。抽象方法必须被重写抽象方法只有声明,不能有实现。定义了抽象方法的类必须是抽象类。abstract类的理解

1、抽象类可以抽象出重要的行为标准,该行为标准用抽象方法来表示。即抽象类封装了子类必需要有的行为标准。2、抽象类声明的对象可以成为其子类的对象的上转型对象,调用子类重写的方法,即体现子类根据抽象类里的行为标准给出的具体行为。3、多态核心技术之一是使用上转型对象,即将abstract类声明对象作为其子类的上转型对象,那么这个上转型对象就可以调用子类重写的方法。4、利用多态设计程序的好处是,可以体现程序设计的所谓开-闭原则。开-闭原则强调一个程序应当对扩展开放,对修改关闭,增强代码的可维护性。98接口(interface)JDK8版本之前,接口体中只有抽象方法.所有的static常量的访问权限一定都是public(允许省略public、final和static修饰符,接口中不会有变量)interfacePrintable{

publicstaticfinalintMAX=100;//等价写法:intMAX=100;

publicabstractvoidadd();

//等价写法:voidadd();}publicinterfacePrintable{publicstaticfinalintMAX=100;//等价写法:intMAX=100;publicabstractvoidon();//等价写法:voidon();publicdefaultintmax(inta,intb){//default方法returna>b?a:b;}

publicstaticvoidf(){System.out.println("注意是从JavaSE8开始的");}}classAimplementsPrintable,Addable{}一个类实现了某个接口,那么这个类就自然拥有了接口中的常量,default方法(去掉了default关键字),该类也可以重写接口中的default方法(注意,重写时需要去掉default关键字)。如果一个非abstract类实现了某个接口,那么这个类必须重写该接口的所有abstract方法,即去掉abstract修饰给出方法体。特别注意的是,类实现某接口,但类不拥有接口的static方法。接口中的方法的访问权限都是public的,重写时不可省略public(否则就降低了访问权限,这是不允许的)。接口回调可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类重写的接口方法以及接口中的default方法接口回调即上转型对象调用子类的重写方法,即当接口变量调用被类重写的接口方法或接口中的default方法时,就是通知相应的对象调用这个方法。接口回调可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类重写的接口方法以及接口中的default方法接口回调即上转型对象调用子类的重写方法,即当接口变量调用被类重写的接口方法或接口中的default方法时,就是通知相应的对象调用这个方法。

Lambda表达式Lambda表达式主要目的是在使用单接口(只含有一个方法的接口)匿名类时让代码更加简洁。Lambda表达式就是一个匿名方法(函数).Class类得到一个类的实例的最常用的方式就是使用new运算符和类的构造方法。但是,Java通过使用Class也可以得到一个类的实例。为了使用Class得到一个类的实例,可以先得到一个和该类相关的Class对象(相当于得到类型)。

异常(Exception)处理105本讲内容异常机制简介try代码段抛出异常(throw语句)捕获异常(catch代码段)再抛异常(throw)finally代码段throws语句JDK中的异常自己定义的异常1061.异常机制简介在进行程序设计时,错误的产生是不可避免的,如何处理错误?把错误交给谁去处理?程序又该如何从错误中恢复?这是任何程序设计语言都要解决的问题。所谓错误,是在程序运行过程中发生的异常事件,比如除0溢出、数组越界、文件找不到等,这些事件的发生将阻碍程序的正常运行。为了增加程序的强壮性,程序设计时,必须考虑到可能发生的异常情况并做出相应的处理。1071.异常机制简介普通的错误处理方法通过被调用函数的返回值感知在被调用函数中产生的错误;通过使用if语句来判断是否出现了错误并进行处理。这种错误处理机制会导致不少问题函数的返回值一般有程序意义,需要定义用于错误处理的无效的返回值;为知道错误产生的内部细节,常用全局变量(如Errno)来存储错误的类型,这容易导致误用,因为变量的值有可能还未被处理就被另外的错误覆盖掉。108没有错误处理的程序{openTheFile;determineitssize;allocatethatmuchmemory;read-file……closeTheFile;}109以常规方法处理错误openFiles;if(theFilesOpen){

determinethelengthofthefile;if(gotTheFileLength){

allocatethatmuchmemory;if(gotEnoughMemory){

readthefileintomemory;if(readFailed)errorCode=-1;}elseerrorCode=-2;}elseerrorCode=-3;}elseerrorCode=-4;……110以常规方法处理错误存在的困难和问题写程序难大部分精力花在出错处理上了只把能够想到的错误考虑到对以外的情况无法处理程序可读性差大量的错误处理代码混杂在程序中出错返回的信息量太少无法更确切的了解错误状况或原因111

用异常机制处理错误try{openTheFile;determineitssize;allocatethatmuchmemory;read-File;closeTheFile;}catch(fileopenFailed){dosomething;}catch(sizeDetermineFailed){dosomething;}catch(memoryAllocateFailed){dosomething;}catch(readFailed){dosomething;}catch(fileCloseFailed){dosomething;}finally{dosomething;}1122.Java异常机制try{…}定义可能产生异常的代码段throwe;用于抛出一个异常catch(Etypee){…}用于捕获一个异常finally{…}用于做统一的事后处理,如释放资源throwsEtype1,Etype2……用于声明方法可能抛出的异常类型try-catch-finally1133.try代码段try代码段包含可能产生异常的代码try代码段后跟有一个或多个catch代码段每个catch代码段声明其能处理的一种特定类型的异常每个catch代码段都是一段异常处理代码try{

可能产生异常的语句}//不能有其它语句分隔catch(Etypee){

处理异常的语句}……finally{

事后处理语句}1144.抛出异常(throw语句)任何从Throwable派生的类都可以用throw语句抛出,抛出异常用来表明程序遇到的错误无法正常执行而需要异常处理thrownewMyException(“someinfomation”);异常可以由try代码段中的语句抛出也可以从被try代码段中调用的方法中抛出异常还可能产生于数组下标越界以及Java虚拟机内部错误等Exception和Error是Throwable的直接派生类Exception程序应该处理的异常情形Error代表系统严重错误,一般程序不处理这类错误异常抛出点后的代码在抛出异常后不再执行也可以说异常的抛出终止了代码段的执行1155.捕获异常(catch代码段)catch代码段声明其能捕获的异常类型,并包含处理该类型异常的代码异常总是由距离产生异常最近的匹配catch代码段处理catch(Exceptione)捕获所有Exceptioncatch(Throwablet)捕获Exception和Errortry{

可能产生异常的语句}//不能有其它语句分隔catch(Etypee){

处理异常的语句}……finally{

事后处理语句}1165.捕获异常(续1)如果没有相应的异常处理,则异常被交给上一层try代码段进行处理异常处理的查找依据类型匹配原则顺序进行第一个匹配的异常处理被执行,当异常处理执行完毕,程序接着最后一个catch代码段后的语句执行异常处理的顺序影响到异常的处理子类异常可被父类异常处理捕获不要先捕获父类异常,再捕获子类异常如果找不到相应的异常处理非GUI程序结束程序执行;Applet或GUI程序回复到事件处理状态1176.finally代码段用于及时释放系统资源例如关闭文件删除临时文件总被执行产生异常时,异常处理完毕后执行无异常产生时,try代码段执行完毕后执行

break,return,continuetry{

可能产生异常的语句}//不能有其它语句分隔catch(Etypee){

处理异常的语句}……finally{

事后处理语句}1187.throws语句用于方法定义中,表示一个方法可能抛出的异常publicintread()throwsIOException

1198.异常的分类Error:系统的严重错误,一般由Java虚拟机监测生成并抛出,它们包括动态链接失败、虚拟机错误、线程死锁等,Java程序对它们一般不做处理。Exception:一般性程序故障,一般由用户代码或类库生成并抛出,Java程序需要对它们进行处理。RuntimeException:运行时程序故障,例如被零除、数组下标越界等。这些错误可能在任何方法中产生,并且良好的程序应该可以避免这些错误。1209.Throwable类的方法Throwable()Throwable(Stringmessage)StringtoString()“classname”:“getMessage()”

StringgetMessage()StringgetLocalizedMessage()voidprintStackTrace()voidprintStackTrace(PrintStream

s)voidprintStackTrace(PrintWriters)ThrowablefillInStackTrace()ThrowableErrorExceptionRuntimeException12177:publicstaticvoidmain(String[]args){78:try{79:testThrowable();80:}81:catch(Throwablet){82:System.err.println(t.toString());83:System.err.println(t.getMessage());84:System.err.println(t.getLocalizedMessage());85:t.printStackTrace();86:}87:}…136:staticvoidtestThrowable()throwsThrowable{137:thrownewThrowable("测试Throwable的用法。");138:}java.lang.Throwable:测试Throwable的用法。测试Throwable的用法。测试Throwable的用法。java.lang.Throwable:测试Throwable

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论