Java程序设计实战案例教程教学课件汇总完整版电子讲义_第1页
Java程序设计实战案例教程教学课件汇总完整版电子讲义_第2页
Java程序设计实战案例教程教学课件汇总完整版电子讲义_第3页
Java程序设计实战案例教程教学课件汇总完整版电子讲义_第4页
Java程序设计实战案例教程教学课件汇总完整版电子讲义_第5页
已阅读5页,还剩487页未读 继续免费阅读

下载本文档

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

文档简介

Java平台安装目录/Contents01020304Java概述JDK的安装Eclipse安装与使用第一个Java程序的编写01Java概述一种高级计算机语言可编写跨平台应用软件完全面向对象由SUN公司(已被Oracle公司收购)于1995年5月推出简单易用、安全可靠应用领域广泛Java概述JavaSE标准版(JavaPlatformStandardEdition)Java的三大技术平台为开发普通桌面和商务应用程序提供的解决方案JavaEE企业版(JavaPlatformEnterpriseEdition)JavaME小型版(JavaPlatformMicroEdition)为开发企业级应用程序提供的解决方案为开发电子消费产品和嵌入式设备提供的解决方案Java的三大技术平台02JDK的安装JavaDevelopmentKit,即Java开发工具包SUN公司提供了一套Java开发环境整个Java的核心包括Java编译器、Java运行环境、Java工具、Java基础类库等JDKJREJavaRuntimeEnvironment,即Java运行环境JRE通常已包含在JDK中若仅用于运行Java程序,而非Java开发,可以直接下载JRE,并在系统中安装即可。JDK-JRE-JVM的概念javavirtualmachine,即Java虚拟机整个java实现跨平台的最核心的部分所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。JVMJDK、JRE及JVM的关系JDK(JavaDevelopmentKit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。JRE(JavaRuntimeEnvironment)是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。JVM(JavaVirtualMachine)是Java虚拟机的缩写,是整个java实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序。JDK的安装Oracle公司提供了多种操作系统的JDK,可以根据自己使用的操作系统,从Oracle官方网站下载相应的JDK安装文件,具体步骤如下:双击从Oracle官网下载的安装文件,进入JDK安装界面单击【下一步】按钮进入JDK的自定义安装界面在自定义安装功能和路径界面选择安装目录,或直接采用默认的安装目录,单击【确定】按钮在对所有的安装选项做出选择后,单击【下一步】按钮开始安装JDK。安装完毕后会进入安装完成界面单击【关闭】按钮,关闭当前窗口,完成JDK安装12345JDK的安装JDK安装完毕后,会在硬盘上生成一个目录,该目录被称为JDK安装目录。如下图所示:03Eclipse的安装与使用112345为了提高程序的开发效率,大部分软件开发人员都是使用集成开发工具(IDE)来进行Java程序开发的。EclipseJava开发工具——Eclipse在实际项目开发过程中,由于使用记事本编写代码速度慢,且不容易排错,所以程序员很少用它来编写代码。在本课程中,将使用一种Java常用的IDE集成开发环境:EclipseEclipse由IBM开发,功能完整且成熟;开源、可扩展Eclipse具有强大的代码编排功能,可以帮助程序开发人员完成语法修正、代码修正、补全文字、信息提示等编码工作Eclipse的安装Eclipse是针对Java编程的集成开发环境(IDE),登录Eclipse官网免费下载。Eclipse安装时只需将下载好的ZIP包解压保存到指定目录下(例如D:\eclipse)就可以使用了。Eclipse的启动非常简单,直接在Eclipse安装文件中运行eclipse.exe文件即可,接下来会出现如下图所示的启动界面。Eclipse的使用Eclipse启动完成后会弹出一个对话框,提示选择工作空间(Workspace),如下图所示:工作空间用于保存Eclipse中创建的项目和相关设置。此处使用Eclipse提供的默认路径为工作空间,也可以单击【Browse】按钮来更改,工作空间设置完成后,单击【OK】按钮即可。

注意:Eclipse每次启动都会出现选择工作空间的对话框,如果不想每次都选择工作空间,可以将此图【Usethisasthedefaultanddonotaskagain】复选框选中,这就相当于为Eclipse工具选择了默认的工作空间,再次启动时将不再出现提示对话框。Eclipse的使用在Eclipse欢迎界面单击关闭欢迎界面窗口,就进入Eclipse工作台界面,Eclipse工作台主要由标题栏、菜单栏、工具栏、透视图四部分组成,如下图所示:03第一个Java程序的编写第一个Java程序的编写通过前面的学习,读者对Eclipse开发工具应该有了一个基本的认识。接下来通过Eclipse创建一个Java程序,并实现在控制台上打印“HelloWorld!”,具体步骤如下:新建Java项目在当前项目中新建一个包在当前包中新建一个Java类在类文件中编写main()方法,并在方法中编写一条输出语句:

System.out.println(“HelloWorld”);01020304运行当前的类文件在控制台查看结果变量与常量目录/Contents0102030405Java代码的基本格式Java中的关键字Java中的常量Java中的变量数据类型及类型转换01Java代码的基本格式Java代码的基本格式Java中的程序代码都必须放在一个类中。类需要使用class关键字定义,在class前面可以有一些修饰符,格式如下:注意:(1)Java中的程序代码可分为结构定义语句和功能执行语句,其中,结构定义语句用于声明一个类或方法,功能执行语句用于实现具体的功能。(2)每条功能执行语句的最后都必须用分号(;)结束。(3)Java语言严格区分大小写。Java中的标识符在编程过程中,经常需要在程序中定义一些符号来标记一些名称,如,包名、类名、方法名、参数名、变量名等,这些符号被称为标识符。标识符可以由任意顺序的大小写字母、数字、下划线(_)和美元符号($)组成,但不能以数字开头,不能是Java中的关键字。定义标识符时还应该遵循以下规则:1、包名所有字母一律小写。例如:cn.itcast.test。2、类名和接口名每个单词的首字母都要大写。如:ArrayList、Iterator。3、常量名所有字母都大写,单词之间用下划线连接。例如:DAY_OF_MONTH。4、变量名和方法名的第一个单词首字母小写,从第二个单词开始每个单词首字母大写。例如:lineNumber、getLineNumber。5、在程序中,应该尽量使用有意义的英文单词来定义标识符,使得程序便于阅读。例如使用userName表示用户名,password表示密码。02Java中的关键字Java中的关键字关键字是编程语言里事先定义好并赋予了特殊含义的单词,也称作保留字。和其它语言一样,Java中保留了许多关键字,例如,class、public等。下面列举的是Java中所有的关键字。03Java中的常量Java中的常量常量就是在程序中固定不变的值,是不能改变的数据。在Java中,常量包括整型常量、浮点数常量、布尔常量、字符常量等。整型常量:整数类型的数据。例:125浮点型常量:就是在数学中用到的小数,分为float单精度浮点数和double双精度浮点数两种类型。例:2.36字符常量:用于表示一个字符,用一对单引号(‘’)引起来,它可以是英文字母、数字、标点符号、以及一些特殊字符。例:’k’字符串常量:用于表示一串连续的字符,一个字符串常量要用一对英文半角格式的双引号(“”)引起来。”king”布尔常量:即布尔型的两个值true和false,用于区分真与假。例:truenull常量:只有一个值null,表示对象的引用为空。04Java中的变量Java中的变量计算机使用内存来存储计算时所使用的数据。程序运行期间,随时可能产生一些临时数据,应用程序会将这些数据保存在一些内存单元中,这些内存单元我们称之为变量。每个内存单元都用一个标识符来标识,也就是变量名;内存单元中存储的数据就是变量的值。数据各式各样,要先根据数据的类型为它申请一块合适的空间Java中的变量房间房间名字房间类型入住的客人变量变量名变量类型变量值对应变量的声明语法1

数据类型变量名;

变量名=值;

举例: intage; age=19;语法2

数据类型变量名=值;

举例: intage=19;变量的赋值左下图第二行代码的作用就是为变量赋值,在执行第二行代码时,程序首先取出变量x的值,与3相加后,将结果赋值给变量y,此时变量x和y在内存中的状态发生了变化,如图所示。05数据类型及类型转换变量的数据类型Java是一门强类型的编程语言,它对变量的数据类型有严格的限定。在定义变量时必须声明变量的类型,在为变量赋值时必须赋予和变量同一种类型的值,否则程序会报错。变量的数据类型1、整数类型变量用来存储整数数值,即没有小数部分的值。整数类型分为4种不同的类型:字节型(byte)、短整型(short)、整型(int)和长整型(long)。占用空间指的是不同类型的变量分别占用的内存大小取值范围是变量存储的值不能超出的范围为一个long类型的变量赋值时需要注意一点,所赋值的后面要加上一个字母“L”(或小写“l”),说明赋值为long类型。变量的数据类型2、浮点数类型变量浮点数类型变量用来存储小数数值。浮点数类型分为两种:单精度浮点数(float)、双精度浮点数(double),double型所表示的浮点数比float型更精确。在取值范围中,E表示以10为底的指数,E后面的“+”号和“-”号代表正指数和负指数,例如1.4E-45表示1.4*10-45。在为一个float类型的变量赋值时需要注意一点,所赋值的后面一定要加上字母“F”(或“f”),而为double类型的变量赋值时,可以在所赋值的后面加上字符“D”(或“d”),也可不加。在程序中也可以为一个浮点数类型变量赋予一个整数数值.变量的数据类型3、字符类型变量用于存储一个单一字符,在Java中用char表示。每个char类型的字符变量都会占用2个字节。赋值时,要用英文半角格式的单引号('')把字符括起来,如'a',也可以赋值为0~65535范围内的整数,计算机会自动将这些整数转化为所对应的字符,如数值97对应的字符为'a'。变量的数据类型4、布尔类型变量布尔类型变量用来存储布尔值,在Java中用boolean表示,该类型的变量只有两个值,即true和false。具体示例如下:数据的类型转换当把一种数据类型的值赋给另一种数据类型的变量时,需要进行数据类型转换。根据转换方式的不同,数据类型转换可分为两种:自动类型转换强制类型转换数据的类型转换1、自动类型转换也叫隐式类型转换,指的是两种数据类型在转换的过程中不需要显式地进行声明。要实现自动类型转换,必须同时满足两个条件,第一是两种数据类型彼此兼容,第二是目标类型的取值范围大于源类型的取值范围。数据的类型转换1、自动类型转换整数类型之间可以实现转换,如byte类型的数据可以赋值给short、int、long类型的变量,short、char类型的数据可以赋值给int、long类型的变量,int类型的数据可以赋值给long类型的变量整数类型转换为float类型,如byte、char、short、int类型的数据可以赋值给float类型的变量。其它类型转换为double类型,如byte、char、short、int、long、float类型的数据可以赋值给double类型的变量。数据的类型转换2、强制类型转换强制类型转换也叫显式类型转换,指的是两种数据类型之间的转换需要进行显式地声明。当两种类型彼此不兼容,或者目标类型取值范围小于源类型时,自动类型转换无法进行,这时就需要进行强制类型转换。强制类型转换的格式如下所示:Java中的运算符目录/Contents0102030405算数运算符赋值运算符比较运算符逻辑运算符运算符的优先级01算术运算符算数运算符算术运算符就是用来处理四则运算的符号,这是最简单、最常用的运算符号。算数运算符(1)在进行自增(++)和自减(--)的运算时,如果运算符放在操作数的前面则是先进行自增或自减运算,再进行其它运算。反之,如果运算符放在操作数的后面则是先进行其它运算再进行自增或自减运算。算术运算符看上去比较简单,也很容易理解,但在实际使用时有很多需要注意的问题,具体如下:(2)在进行除法运算时,当除数和被除数都为整数时,得到的结果也是一个整数。如果除法运算有小数参与,得到的结果会是一个小数。(3)在进行取模(%)运算时,运算结果的正负取决于被模数(%左边的数)的符号,与模数(%右边的数)的符号无关。02赋值运算符赋值运算符赋值运算符的作用就是将常量、变量或表达式的值赋给某一个变量,表中列出了Java中的赋值运算符及用法。赋值运算符在赋值运算符的使用中,需要注意以下几个问题:(1)在Java中可以通过一条赋值语句对多个变量进行赋值。(2)除了“=”,其它的都是特殊的赋值运算符,以“+=”为例,x+=3就相当于x=x+3,首先会进行加法运算x+3,再将运算结果赋值给变量x。-=、*=、/=、%=赋值运算符都可依此类推。03比较运算符比较运算符比较运算符用于对两个数值或变量进行比较,其结果是一个布尔值,即true或false。比较运算符在使用时需要注意一个问题,不能将比较运算符“==”误写成赋值运算符“=”。04逻辑运算符逻辑运算符逻辑运算符用于对布尔型的数据进行操作,其结果仍是一个布尔型。逻辑运算符在使用逻辑运算符的过程中,需要注意以下几个细节:(1)逻辑运算符可以针对结果为布尔值的表达式进行运算。如:x>3&&y!=0。(2)运算符“&”和“&&”都表示与操作,当且仅当运算符两边的操作数都为true时,其结果才为true,否则结果为false。当运算符“&”和“&&”的右边为表达式时,两者在使用上还有一定的区别。在使用“&”进行运算时,不论左边为true或者false,右边的表达式都会进行运算。如果使用“&&”进行运算,当左边为false时,右边的表达式不会进行运算,因此“&&”被称作短路与。(3)运算符“|”和“||”都表示或操作,当运算符两边的操作数任何一边的值为true时,其结果为true,当两边的值都为false时,其结果才为false。同与操作类似,“||”表示短路或,当运算符“||”的左边为true时,右边的表达式不会进行运算。(4)运算符“^”表示异或操作,当运算符两边的布尔值相同时(都为true或都为false),其结果为false。当两边布尔值不相同时,其结果为true。05运算符的优先级运算符的优先级在对一些比较复杂的表达式进行运算时,要明确表达式中所有运算符参与运算的先后顺序,把这种顺序称作运算符的优先级。分支结构-1if语句目录/Contents010203单分支if语句双分支if…else…语句多分支if…elseif……else语句01单分支if语句单分支if语句if语句是指如果满足某种条件,就进行某种处理,其语法格式如下所示:上述语法格式中,判断条件是一个布尔值,当值为true时,才会执行{}中的语句。单分支if语句if语句的执行流程如下图所示。02双分支if…else……语句双分支if…else……语句if…else语句是指如果满足某种条件,就进行某种处理,否则就进行另一种处理,其语法格式如下所示:双分支if…else……语句if…else语句的执行流程如下图所示。双分支if…else……语句在Java中有一种特殊的运算叫做三元运算,它和if-else语句类似,语法如下:三元运算通常用于对某个变量进行赋值,当判断条件成立时,运算结果为表达式1的值,否则结果为表达式2的值。03多分支if…elseif……else语句多分支if…elseif……else语句if…elseif…else语句用于对多个条件进行判断,进行多种不同的处理,其语法格式如下所示:多分支if…elseif……else语句if…elseif…else语句的执行流程如下图所示:分支结构-2switch语句Switch条件语句switch语句也是一种很常见的选择语句。和if条件语句不同,它只能针对某个表达式的值做出判断,从而决定执行哪一段代码。使用switch关键字来描述一个表达式,使用case关键字来描述和表达式结果比较的目标值,当表达式的值和某个目标值匹配时,会执行对应case下的语句,switch语句的基本语法见右图:Switch条件语句例如,在程序中使用数字1~7表示周一到周日如果想根据某个输入的数字输出中文格式的星期值,可以通过右边所示的代码来实现。Switch条件语句switchcase语句有如下规则:switch语句中的变量类型可以是:byte、short、int或者char。从JavaSE7开始,switch支持字符串String类型了,同时case标签必须为字符串常量或字面量。switch语句可以拥有多个case语句。每个case后面跟一个要比较的值和冒号。case语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量。当变量的值与case语句的值相等时,那么case语句之后的语句开始执行,直到break语句出现才会跳出switch语句。当遇到break语句时,switch语句终止。程序跳转到switch语句后面的语句执行。case语句不必须要包含break语句。如果没有break语句出现,程序会继续执行下一条case语句,直到出现break语句。switch语句可以包含一个default分支,该分支一般是switch语句的最后一个分支(可以在任何位置,但建议在最后一个)。default在没有case语句的值和变量值相等的时候执行。default分支不需要break语句。循环结构-1while和do…while…语句目录/Contents0102while循环语句do…while…语句03while与do…while…的区别01while循环语句while循环语句while语句和if条件语句有点类似,都是根据条件判断来决定是否执行后面的代码,区别在于,while循环语句会反复地进行条件判断,只要条件成立,{}内的执行语句就会执行,直到条件不成立,while循环结束。while循环语句的语法结构如下所示:while循环语句while循环语句的执行流程如下图所示。02do…while…语句do…while…循环语句do…while循环语句和while循环语句功能类似先执行一次循环体,然后在判断布尔表达式是不是true,如果是就继续执行循环体,在判断布尔表达式,直到为false就结束循环。while循环语句的语法结构如下所示:do…while…循环语句do…while循环语句的执行流程如下图所示。03while与do…while…的区别while与do…while…的区别while是先判断在执行如果判断不成立,就不会执行;do…while…是先执行再判断,不管判断是否成立都会执行一次inta=8;

while(a<10){

System.out.println(“a的值为:”+a);

}System.out.println(程序结束”);输出结果:程序结束inta=8;

do{

System.out.println(“a的值为:”+a);

}

while(a<10);System.out.println(程序结束”);输出结果:a的值为8

程序结束循环结构-2for语句目录/Contents0102for循环语句循环嵌套语句01for循环语句for循环语句for循环语句是最常用的循环语句,一般用在循环次数已知的情况下,其语法格式如下所示:在上述语法格式中,for后面的()中包括三部分内容,初始化表达式、循环条件和操作表达式,它们之间用“;”分隔,{}中的执行语句为循环体for循环语句如果用①表示初始化表达式、②表示循环条件、③表示操作表达式、④表示循环体,则for循环的执行流程如下所示:02循环嵌套语句循环嵌套语句嵌套循环是指在一个循环语句的循环体中再定义一个循环语句的语法结构。while、do…while、for循环语句都可以进行嵌套,并且它们之间也可以互相嵌套,如最常见的在for循环中嵌套for循环,格式如下:循环结构-3跳转语句目录/Contents0102break语句continue语句02break与continue的区别01break语句break语句跳转语句用于实现循环过程中流程的跳转,Java中的跳转语句有break和continue。break语句:直接跳出当前循环体(while、for、dowhile)或程序块(switch)。其中switch…case…执行时,一定会先进行匹配,匹配成功返回当前case的值,再根据是否有break,判断是否继续输出,或是跳出判断。一旦执行break,整个switch语句立刻结束。用在循环语句中时,一旦执行,整个循环结束。for

(int

i=

0;i<

5;i++){

if

(i==

2){

System.out.println(“跳出for循环");

break;

}

System.out.println(i);}System.out.println(“程序结束”);02continue语句continue语句continue语句:用在循环语句中,它的作用是终止本次循环,执行下一次循环。一旦执行,立刻跳过当前循环剩余内容,马上开始下一次循环。for

(int

i=

0;i<

5;i++){

if

(i==

2){

System.out.println(“跳出本次循环,进行下一次循环");

continue;

}System.out.println(i);

}

System.out.println(“程序结束”);

03break与continue的区别break与continue的区别前面的例子,运行后的结果比较:在break测试中,当i==2,直接跳出了for循环,不再执行之后的循环测试continue时,当i==3,直接跳过了continue之后的输出语句,进入下一次循环。因此,break与continue的区别如下:break是跳出来整个循环,不会再执行接下来的循环。continue至少跳过一次循环,后面的循环如果满足条件,依旧会执行。方法情境引入需求:假设有一个游戏程序,程序在运行过程中,要不断地发射炮弹。发射炮弹的动作需要编写100行的代码,在每次实现发射炮弹的地方都需要重复地编写这100行代码,这样程序会变得很臃肿,可读性也非常差。方法概述情境引入为了解决代码重复编写的问题,可以将发射炮弹的代码提取出来,放在一个{}中,并为这段代码起个名字,这样在每次发射炮弹的地方通过这个名字来调用发射炮弹的代码就可以了。上述过程中,所提取出来的代码可以被看作是程序中定义的一个方法,程序在需要发射炮弹时调用该方法即可。方法概述方法的定义及格式完成特定功能的一段代码方法:修饰符返回值类型方法名(参数类型参数名1,参数类型参数名2…){

方法体; return返回值;}格式:方法格式的解释说明修饰符

publicstatic返回值类型

用于限定返回值的数据类型方法名

一个名称要符合命名规则,用于调用方法参数类型

限定调用方法时传入参数的数据类型方法格式的解释说明参数名

一个变量名,接收调用方法时传入的参数方法体

完成功能的代码return

结束方法以及返回方法指定类型的值

返回值

由return带回的结果,返回给调用者方法案例返回值类型明确功能结果的数据类型参数列表明确有几个参数,以及参数的类型如何写一个方法呢?两个明确案例:求两个整型数据之和有返回值的方法练习练习一:键盘录入两个数据,返回两个数中的较大值练习二:键盘录入两个数据,比较两个数是否相等有返回值的方法调用单独调用,没有意义输出调用,有意义,但不推荐,因为不一定需要把结果输出赋值调用,推荐方式方法注意事项方法不调用不执行方法与方法是平级关系,不能嵌套定义方法定义的时候参数之间用逗号隔开方法调用的时候不用再传递数据类型如果方法有明确的返回值,一定要有return带回一个值没有返回值的方法调用没有返回值的方法就是返回值类型为void的方法只能单独调用返回值为void类型的方法练习练习一:键盘录入行数和列数,输出对应的星形练习二:键盘录入一个数据n(1<=n<=9),输出对应的nn乘法表方法的重载在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。方法重载概述方法重载方法重载方法重载特点与返回值类型无关,只看方法名和参数列表在调用时,虚拟机通过参数列表的不同来区分同名方法方法重载案例比较两个数据是否相等。参数类型分别为两个byte类型,两个short类型,两个int类型,两个long类型,并在main方法中进行测试方法重载数组一维数组情境引入数组概述需求:现在需要统计某班级学生的《Java程序设计》课程成绩情况,例如计算该门课程的平均成绩、找到最高分等。假设该班级有50名学生。intstu1=95;intstu2=89;intstu3=79;intstu4=64;intstu5=76;intstu6=88;……avg=(stu1+stu2+stu3+stu4+stu5…+stu50)/5050个变量50个变量太繁琐数组概述数组概念数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。数组既可以存储基本数据类型,也可以存储引用数据类型。数组概念数组定义格式格式1:数据类型[]数组名;格式2:数据类型数组名[];数组初始化Java中的数组必须先初始化,然后才能使用。所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。数组初始化数组的初始化方式动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。数组初始化数据类型[]数组名=new数据类型[数组长度];格式:创建数组对象int[]arrs=newint[3];解释:定义了一个int类型的数组,数组名称为arrs,这个数组中可以存放3个int类型的值。示例1:动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。数组长度其实就是数组中元素的个数数组元素的获取数组名[索引]索引其实就是每个元素的编号,从0开始,最大索引是数组的长度-1。格式:Java中的内存分配Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。Java中的内存分配栈堆方法区本地方法区寄存器存储局部变量存储new关键字创建的对象面向对象部分讲和系统相关给CPU使用Java中的内存图解数组元素默认值数据类型默认初始化值byte,short,int,long0float,double0.0char‘\u0000’booleanfalse引用类型null数组的赋值定义一个数组,输出该数组元素值。给数组元素赋值,再次输出该数组元素值。示例2:数组元素的赋值数组的赋值定义第一个数组,定义完毕后,给数组元素赋值。赋值完毕后,在输出数组名称和元素。定义第二个数组,定义完毕后,给数组元素赋值。赋值完毕后,在输出数组名称和元素。定义第三个数组,把第一个数组的地址值赋值给它。(注意类型一致),通过第三个数组的名称去把元素重复赋值。最后,再次输出第一个数组数组名称和元素。示例22:数组地址赋值数组初始化数据类型[]数组名=new数据类型[]{元素1,元素2,…};格式:int[]arr=newint[]{1,2,3};解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值,并且值分别是1,2,3。简化的写法int[]arr={1,2,3};示例3:静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。数组操作常见的两个问题数组索引越界常见问题ArrayIndexOutOfBoundsException访问了数组中不存在的索引。空指针异常NullPointerException数组引用没有指向实体,却在操作实体中的元素。示例4:在程序中演示数组的常用操作依次输出数组中的每一个元素数组的遍历根据键盘录入索引,查找对应星期数组查表法获取数组中的最大值最小值数组获取最值查找指定元素在数组中第一次出现的索引数组元素查找数组常用操作数组二维数组情境引入二维数组概述需求:我们计算机软件技术专业每个班有很多个学生,所以,可以用数组来存储,而我们又同时有很多个班。这个也应该用一个数组来存储。如何来表示这样的数据呢?Java就提供了二维数组供我们使用。二维数组其实就是一个元素为一维数组的数组。数据类型[][]变量名=new数据类型[m][n];m表示这个二维数组有多少个一维数组n表示每一个一维数组的元素个数格式1:二维数组定义格式二维数组定义格式举例:int[][]arr=newint[3][2];定义了一个二维数组arr这个二维数组有3个一维数组,名称是arr[0],arr[1],arr[2]每个一维数组有2个元素,可以通过arr[m][n]来获取,表示获取第m+1个一维数组的第n+1个元素int[][]arr=newint[3][];arr[0]=newint[2];arr[1]=newint[3]arr[2]=newint[1];举例:二维数组定义格式数据类型[][]变量名=new数据类型[m][];m表示这个二维数组有多少个一维数组没有直接给出一维数组元素个数,可动态给出格式2:格式3:二维数组定义格式简化版格式:举例:数据类型[][]变量名=new数据类型[][]{{元素…},{元素…},{元素…}};数据类型[][]变量名={{元素…},{元素…},{元素…}};int[][]arr={{1,2,3},{4,5},{6}};公司年销售额求和某公司按照季度和月份统计的数据如下:单位(万元)第一季度:22,66,44第二季度:77,33,88第三季度:25,45,65第四季度:11,66,99二维数组遍历——练习类与对象类与对象关系

我们学习编程语言,就是为了模拟现实世界的事物,实现信息化。比如:去超市买东西的计费系统,去银行办业务的系统。类与对象关系

我们如何表示一个现实世界事物呢?属性就是该事物的描述信息行为就是该事物能够做什么

举例:学生事物类与对象关系一组相关的属性和行为的集合类:该类事物的具体体现对象:类

学生对象学生张三举例:类的定义现实世界的事物属性

人的身高,体重等行为

人可以学习,吃饭等Java中用class描述事物成员变量

就是事物的属性成员方法

就是事物的行为定义类——定义类的成员成员变量成员方法)类与对象案例学生类(讲解):手机类(学生练习)如何定义按照事物到类的过程一步步分析如何使用创建对象:类名对象名=new类名();对象名.成员变量对象名.成员方法对象内存图一个对象的基本初始化过程一个对象的内存图类与对象成员变量、局部变量与构造方法成员变量与局部变量的区别成员变量

类中方法外局部变量

方法内或者方法声明上在类中的位置不同成员变量

随着对象的存在而存在,随着对象的消失而消失局部变量随着方法的调用而存在,随着方法的调用完毕而消失生命周期不同成员变量

堆内存局部变量

栈内存在内存中的位置不同成员变量

有默认的初始化值局部变量

没有默认的初始化值,必须先定义,赋值,才能使用。初始化值不同成员变量和局部变量的区别构造方法给对象的数据进行初始化作用:方法名与类名相同没有返回值类型,连void都没有没有具体的返回值格式:构造方法如果你不提供构造方法,系统会给出默认构造方法如果你提供了构造方法,系统将不再提供构造方法也是可以重载的注意事项:一个基本类的标准代码写法

类成员变量构造方法无参构造方法带参构造方法成员方法getXxx()setXxx()给成员变量赋值的方式无参构造方法+setXxx()带参构造方法一个基本类的标准代码案例标准的学生类(讲解)加入一个方法show(),输出学生对象的成员变量信息。标准的手机类(练习)注意目前的代码是为了练习的一种标准格式给成员变量赋值有两种方式,可以只写一种如果不单独获取数据,可以不写getXxx()方法类的初始化过程Students=newStudent();在内存中做了哪些事情?加载Student.class文件进内存在栈内存为s开辟空间在堆内存为学生对象开辟空间对学生对象的成员变量进行默认初始化对学生对象的成员变量进行显示初始化通过构造方法对学生对象的成员变量赋值学生对象初始化完毕,把对象地址赋值给s变量面向对象练习练习1:定义一个类Demo,其中定义一个求两个数据和的方法,定义一个测试了Test,进行测试。练习2:定义一个长方形类,定义求周长和面积的方法,然后定义一个测试了Test2,进行测试。练习3:定义一个员工类,自己分析出几个成员,然后给出成员变量,构造方法,getXxx()/setXxx()方法,以及一个显示所有成员信息的方法。并测试。练习4:定义一个类MyMath,提供基本的加减乘除功能,然后进行测试。封装封装概述隐藏对象的属性和实现细节,仅对外提供公共访问方式封装:提高代码的复用性。提高程序的安全性。好处:将不需要对外提供的内容都隐藏起来。把属性隐藏,提供公共方法对其访问。原则:private关键字一个权限修饰符。可修饰成员(成员变量和成员方法)被private修饰的成员只在本类中才能访问。private关键字:把成员变量用private修饰提供对应的getXxx()/setXxx()方法private的应用:案例演示this关键字代表所在类的对象引用this:局部变量名称与成员变量名称冲突什么时候使用this呢?static关键字可以修饰成员变量和成员方法static:

随着类的加载而加载优先于对象存在被类的所有对象共享判断是否使用静态关键字的条件可以通过类名调用特点:static关键字

在静态方法中是没有this关键字的静态方法只能访问静态的成员变量和静态的成员方法注意事项:静态的内存图静态的内容存在于方法区的静态区静态变量和成员变量的区别所属不同静态变量属于类,所以也称为为类变量成员变量属于对象,所以也称为实例变量(对象变量)内存中位置不同静态变量存储于方法区的静态区成员变量存储于堆内存内存出现时间不同

静态变量随着类的加载而加载,随着类的消失而消失

成员变量随着对象的创建而存在,随着对象的消失而消失调用不同

静态变量可以通过类名调用,也可以通过对象调用

成员变量只能通过对象名调用代码块局部代码块

声明在方法中;限定变量的作用域;用于提高内存利用率构造代码块

声明在类中方法外;每次调用构造方法前,都会先执行构造代码块。作用:可以把多个构造方法中的共同代码放到一起,对对象进行初始化。静态代码块

声明在类中方法外,并加上static修饰;用于给类进行初始化,在类加载的时候就执行,并且只执行一次。同步代码块代码块:使用{}括起来的代码根据其位置和声明的不同,可以分为代码块——课堂练习先看程序,再写程序的执行结果。classStudent{ static{ System.out.println("Student静态代码块"); }

{ System.out.println("Student构造代码块"); }

publicStudent(){ System.out.println("Student构造方法"); }}代码块——课堂练习先看程序,再写程序的执行结果。classStudentDemo{ static{ System.out.println("我是StudentDemo类中的静态代码块"); }

publicstaticvoidmain(String[]args){ System.out.println("我是main方法");

Students1=newStudent(); Students2=newStudent(); }}第4章面向对象编程继承情境引入我们在做事情的时候,如果在现有一定基础之上再创作新的内容,就会比较轻松一些。

在程序开发中,我们怎样才能提高代码的可重用性,从而达到提高效率的目的呢?生活中的继承生活中,继承的例子随处可见167动物食草动物食肉动物谁是父类?谁是子类?能说出继承的特点吗?继承需要符合的关系:父类更通用、子类更具体生活中的继承子类具有父类的一般特性(包括属性和行为),以及自身特殊的特性168巴士是汽车吗?卡车是汽车吗?出租车是汽车吗?最大载客数量报站引擎数量外观颜色刹车加速汽车最大载重量卸货所属公司最大载客数量打发票属性行为请问:出租车包含哪些属性和行为呢?为什么需要继承?开发教师类,其中教师分为Java教师以及.NET教师,各自的要求如下:Java教师属性:姓名、所属教研室方法:授课(步骤:打开Eclipse、实施理论课授课)、自我介绍.NET教师属性:姓名、所属教研室方法:授课(步骤:打开Visualstudio2005、实施理论课授课)、自我介绍169请问:以下这个解决方案中存在着什么问题?170publicclassDotNetTeacher{privateStringname;//教师姓名privateStringdepartment;//教研室publicDotNetTeacher(StringmyName,StringmyDepat){name=myName;department=myDepart;}publicvoidgiveLession(){System.out.println("启动VisualStudio2005");System.out.println("知识点讲解");System.out.println("总结提问");}publicvoidintroduction(){ System.out.println("大家好!我是" +department+"的"+name+".");}}publicclassJavaTeacher{privateStringname;//教师姓名privateStringdepartment;//教研室publicJavaTeacher(StringmyName,StringmyDepart){name=myName;department=myDepart;}publicvoidgiveLession(){System.out.println("启动

Eclipse");System.out.println("知识点讲解");System.out.println("总结提问");}publicvoidintroduction(){ System.out.println("大家好!我是" +department+"的"+name+".");}}代码存在重复,违背了“writeonce,onlyonce”的原则如何改进?有没有可能建立继承关系,让子类自动继承父类的属性和方法?171Java教师是教师吗?.NET教师是教师吗?publicclassTeacher{privateStringname;//教师姓名privateStringdepartment;//教研室publicTeacher(StringmyName,StringmyDepart){name=myName;department=myDepart;}publicvoidgiveLesson(){System.out.println("知识点讲解");System.out.println("总结提问");}publicvoidintroduction(){ System.out.println("大家好!我是“

+department+"的"+name+"。");}}现在,所有子类中相同的代码都抽取到父类中了属

性行

为姓名教研室授课自我介绍教师Java教师.NET教师为什么需要继承4-4172publicclassJavaTeacher2extendsTeacher{publicJavaTeacher2(StringmyName,StringmyDepart){super(myName,myDepart);}publicvoidgiveLesson(){System.out.println("启动Eclipse");super.giveLesson();}}publicclassDotNetTeacher2extendsTeacher{publicDotNetTeacher2(StringmyName,StringmyDepart){super(myName,myDepart);}publicvoidgiveLesson(){System.out.println("启动VisualStudio.NET");super.giveLesson();}}使用继承,可以有效实现代码复用子类自动继承父类的属性和方法,子类中不再存在重复代码如何实现继承?在Java语言中,用extends关键字来表示一个类继承了另一个类,例如:173publicclassJavaTeacher2

extends

AccpTeacher{//其余代码省略}在父类中只定义一些通用的属性与方法,例如:publicclassTeacher{privateStringname;//教师姓名privateStringdepartment;//所在教研室publicTeacher(StringmyName,StringmyDepart){//初始化属性值}publicvoidgiveLesson(){//授课方法的具体实现}publicvoidintroduction(){//自我介绍方法的具体实现

}}如何实现继承子类自动继承父类的属性和方法,子类中可以定义特定的属性和方法174publicclassTeacher{Stringname;//教师姓名Stringdepartment;//所在教研室publicTeacher(StringmyName,StringmyDepart){//初始化属性值}publicvoidgiveLesson(){ //授课方法的具体实现}publicvoidintroduction(){ //自我介绍方法的具体实现

}}publicclassJavaTeacher2extendsTeacher{publicJavaTeacher2(StringmyName,StringmyDepart){super(myName,myDepart);}publicvoidgiveLesson(){System.out.println("启动Eclipse");super.giveLesson();}}由于giveLesson()方法与父类的实现有所不同,因此重写了该方法方法重写:子类和父类的方法具有相同的名称、参数列表、返回类型父类中的属性和方法可以被子类继承如何实现继承?子类的构造方法中,通过super关键字调用父类的构造方法175publicclassJavaTeacher2extendsTeacher{publicJavaTeacher2(StringmyName,StringmyDepart){super(myName,myDepart);}}方法重写后,通过super关键字调用父类的方法publicclassJavaTeacher2extendsTeacher{publicvoidgiveLesson(){System.out.println("启动Eclipse");super.giveLesson();}}通过调用父类的构造方法,完成对属性值的初始化一切类的“祖先”——Object在Java中,所有的Java类都直接或间接地继承了java.lang.Object类176publicclassMyObject{//…}publicclassMyObectextends

Object{

//…}在Eclipse中调用MyObject对象的成员,会自动弹出继承自Object的所有方法小结1请编码实现动物世界的继承关系:动物(Animal)具有行为:吃(eat)、睡觉(sleep)动物包括:兔子(Rabbit),老虎(Tiger)这些动物吃的行为各不相同(兔子吃草,老虎吃肉);但睡觉的行为是一致的。请通过继承实现以上需求,并编写测试类AnimalTest进行测试。177感谢观看方法重载与方法重写情境引入在生活中,其实我们经常遇到方法重载的情况,例如:同一台打印机,既可以打印黑白照片,也可以打印彩色照片……生活中的方法重载181类方法方法参数方法实现司机轿车巴士火车驾驶启动、行驶、……等待乘客上车、启动、行驶、到站停车、……正点发车、行驶、到站停车、……如果用代码实现,我们需要三个方法,这些方法的方法名称相同,参数类型不同方法重载的代码示例1方法重载并不陌生java.io.PrintStream类的println方法能够打印数据并换行,根据数据类型的不同,有多种实现方式182publicclassTest{publicstaticvoidmain(String[]args){inti=0;charc='z';Stringstr="hello";System.out.println(i);System.out.println(c);System.out.println(str);}}PrintStreamprintln(int)println(char)println(String)……方法名相同,参数类型不同调用不同的println方法方法重载方法重载的代码示例2java.lang.Math类的max()方法能够从两个数字中取出最大值,它有多种实现方式运行时,Java虚拟机先判断给定参数的类型,然后决定到底执行哪个max()方法183Mathmax(inta,intb)max(floata,floatb)max(longa,longb)max(doublea,doubleb)publicclassTest{publicstaticvoidmain(String[]args){Math.max(1,2);Math.max(1.0F,2.F);Math.max(1.0,2);}}方法重载构造方法重载2-1构造方法重载是方法重载的典型示例184publicclassTeacher7{privateStringname;//教师姓名privateStringdepartment=“软件教研室”;//所在教研室PublicTeacher7(Stringname){ =name;//设定教师姓名}publicTeacher7(Stringname,Stringdepartment){=name;//设定教师姓名this.department=department;//设定教师教研室}publicStringintroduction(){ return"大家好!我是"+department

+"的"+name;}}构造方法重载构造方法重载2-2通过调用不同的构造方法来表达对象的多种初始化行为例如:默认情况下,教师来自软件教研室,初始化时,只需提供教师姓名有时,需要提供所在教研室名称及教师姓名185publicclassTeacher7Test{publicstaticvoidmain(String[]args){Teacher7teacher1=newTeacher7("李芳");System.out.println(roduction());Teacher7teacher2=newTeacher7("张欣",

“网络教研室");System.out.println(roduction());}}大家好!我是软件教研室的李芳大家好!我是网络教研室的张欣方法的重载(overload)在同一个类中,一个以上的方法名称相同,参数列表不同,这种定义方法叫做方法的重载。

186例如:

publicintsummn(intm,intn){returnm+n;}publicintsummn(intm,intn,intk){returnm+n+k;}187例如:

publicintsummn(intm,intn){returnm+n;}publicintsummn(intx,inty){returnx+y;}//是重载吗?188不是方法的重写在子类中,声明和父类中完全相同(方法名字、参数类型、个数和顺序、返回值类型)的方法,叫做方法的重写。方法的重载和方法的重写,都是实现类的多态性的重要途径。

189重写隐藏了父类中的同名成员。如果子类中成员m是重写的,则在子类中访问m时,访问的是子类中的,而不是父类中的m。190方法重写示例:

classVehicle{voidrun(){System.out.println("Vehicleisrunning");}}classBikeextendsVehicle{ @override voidrun(){ System.out.println("theBikeofVehicleisrunning"); }publicstaticvoidmain(Stringargs[]){Bikeobj=newBike();obj.run();}}191

输出结果:theBikeofVehicleisrunning访问被重写的方法:

有时,需要在子类中访问父类中被重写的方法,可使用super关键字来实现。

super代表当前类的直接父类。

192//定义Animal类classAnimal{ Stringname="动物";

voidshout(){//定义动物叫的方法 System.out.println("动物发出叫声"); }}classDogextendsAnimal{//定义Dog类继承动物类 Stringname="犬类";

voidshout(){//重写父类的shout()方法

super.shout();//访问父类的成员方法

}193

//定义打印name的方法

voidprintName(){ System.out.println("name="+);//访问父类的成员变量

}}//定义测试类publicclassExample03{ publicstaticvoidmain(String[]args){ Dogdog=newDog();//创建一个Dog对象

dog.shout();//调用dog对象重写的shout()方法

dog.printName();//调用dog对象的的printName()方法

}}194动物发出叫声name=动物使用super关键字访问父类的构造方法:

super([参数1,参数2…])//定义Animal类classAnimal{ //定义Animal类有参的构造方法

publicAnimal(Stringname){ System.out.println("我是一只"+name); }}//定义Dog类继承Animal类classDogextendsAnimal{ publicDog(){ super("沙皮狗");//调用父类有参的构造方法

}}195//定义测试类publicclassExample04{ publicstaticvoidmain(String[]args){ Dogdog=newDog();//实例化子类Dog对象

}}196final关键字final关键字有“无法改变”或者“最终”的含义,因此被final修饰的类、变量和方法将具有以下特性:final修饰的类不能被继承。final修饰的方法不能被子类重写。final修饰的变量(成员变量和局部变量)是常量,只能赋值一次。197final关键字修饰类finalclassAnimal{//使用final关键字修饰Animal类时,子类会报错classAnimal{ //方法体为空}classDogextendsAnimal{//Dog类继承Animal类 //方法体为空}classExample06{//定义测试类 publicstaticvoidmain(String[]args){ Dogdog=newDog();//创建Dog类的实例对象 }}198final关键字修饰变量classAnimal{

//使用final关键字修饰shout()方法后,如果子类重写父类的这个方法,编译会报错

//publicfinalvoidshout(){ publicvoidshout(){ //程序代码}}//定义Dog类继承Animal类classDogextendsAnimal{ //重写Animal类的shout()方法

publicvoidshout(){ //程序代码

}}199//定义测试类classExample07{ publicstaticvoidmain(String[]args){ Dogdog=newDog();//创建Dog类的实例对象

}}感谢观看抽象类情境引入:

当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法的实现方式是无法确定的。例如当我们定义Animal类时,shout()方法用于表示动物的叫声,

温馨提示

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

评论

0/150

提交评论