版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JavaSE核心编程课程整体目标掌握Java语言根底知识理解面向对象的编程思想运用Java编写命令行程序运用JDBC编写数据库访问程序运用Swing组件编写图形用户界面程序运用Swing组件和JDBC实现C/S结构的应用程序本章目标了解Java语言了解Java程序的类型理解Java虚拟机〔JVM〕掌握Java程序运行环境的配置编写第一个基于Java的程序Java简介掌握Java程序运行环境的配置编写第一个基于Java的程序Java释义“Java”一词的本意是地名——“爪哇”;爪哇岛位于南太平洋,是印度尼西亚的一局部。爪哇岛关于爪哇全世界三大咖啡产地:巴西印尼爪哇岛中国海南岛由此可见,Java的原意是指一个咖啡的产地,也可以说是一种咖啡的品牌。Java语言简介Java是一种程序设计语言,由SunMicrosystem公司于1995年推出;早在1991年,Sun公司的JamesGosling等人开始开发名为Oak的程序设计语言,希望用来控制嵌入在有线电视机顶盒和PDA等设备中的微处理器;1994年,Oak语言正式更名为Java;Java语言凭借其独有的平安性、可移植性和平台无关性,迅速走红。Java与InternetInternet使Java成为网络上最流行的编程语言;同时,Java对Internet的影响也意义深远;在Java出现以前,几乎没有工具可以在Internet上执行动态交互程序;使用Java语言编写的Applet程序可以对用户的输入和操作作出响应。Java程序的类型-AppletApplet是用Java编写,在Internet上运行的程序,可以在任何客户端系统上下载,在浏览器中运行Java程序的类型-ApplicationApplication是指在计算机操作系统支持下运行的程序,它既可以基于图形界面,又可以基于控制台Java的平台无关性Java是一种既面向对象又可以跨平台的语言,即:编写一次,随处运行;Java不仅适用于单机应用程序和基于网络的程序,也可用于创立消费类设备的附件程序,如移动、掌上设备等。Java源程序代码WindowsLinuxSolarisJVMJava虚拟机Java字节码(可跨平台)编译运行Java虚拟机Java虚拟机〔JavaVirtualMachine〕是可运行Java字节码的虚拟计算机系统;使用Java语言编写的程序,实际上是运行在JVM之上,而不是运行在操作系统上;它有一个解释器组件,可以实现Java字节码和计算机操作系统之间的通信。用户USER字节码程序JVM〔Java虚拟机〕操作系统硬件Java虚拟机的运行过程网络JIT代码生成器.java源代码文件.class字节码文件编译时运行时硬件类加载器字节码校验器解释器Java开发工具包开发和运行Java程序,必须依赖和使用由Sun公司提供的Java开发工具包〔JavaDevelopmentKit〕操作系统Java虚拟机Java基础类库客户端编译器浏览器插件开发工具集成开发环境JavaPlatform2JDK〔Java开发工具包〕从1.3版本以后,Sun公司将其正式更名为JavaPlatform2;为适应不同的用途,又将其细分为三个版本:J2SE〔StandardEdition〕:标准版,适用于普通应用程序的开发;J2EE〔EnterpriseEdition〕:企业版,适用于大型企业级应用程序的开发;J2ME〔MicroEdition〕:微型版,适用于移动设备或嵌入式设备的程序开发。下载安装JDK翻开浏览器,在地址栏键入:,登录到SUN官方网站,免费下载JDK软件和文档下载完毕,即可安装JDK;bin目录:存放可执行文件;lib目录:存放Java的类库文件;demo目录:存放演示程序;jre目录:存放Java运行环境文件。配置环境变量安装JDK后,还要配置环境变量才能开发和调试Java程序,右击[我的电脑][属性][高级][环境变量]编辑Path变量新建classpath变量开发Java程序的步骤创立Java源程序Java源程序可以使用任何文本编辑器创立与编辑,一般用.java作为扩展名,其实就是一个使用Java语言编写的文本文件;编译源程序Java编译器读取Java源程序并翻译成Java虚拟机能够明白的指令集合,并以字节码的形式保存在文件中,通常,字节码文件以.class作为扩展名;运行class〔字节码〕文件Java解释器读取字节码文件,取出指令并翻译成计算机能够执行的机器代码,完成运行过程。编写第一个Java程序翻开记事本,新建一个文本文件,将文件名改为Hello.java,在文件中键入如下内容并保存:classHello{publicstaticvoidmain(String[]args){System.out.println("Helloworld!");}}Java源程序扩展名为.java的源文件使用记事本进行编辑使用javac编译器编译源文件接下来需要将源程序进行编译;进入命令提示行,切换到源文件所在的目录,执行javac命令,使用javac编译器编译源文件;javac命令的格式是:javac完整的源文件名切换到源文件所在的目录切换到源文件所在的目录切换到源文件所在的目录class〔字节码〕文件顺利通过编译后将生成一个扩展名为.class的字节码文件〔类描述文件〕。通过编译后生成的扩展名为.class的字节码文件扩展名为.java的源文件使用java解释器运行字节码文件进入命令提示行,在字节码文件所在的目录下,执行java命令,使用java解释器运行字节码文件java命令的格式是:java类名称这里只需要类名称,而不是带扩展名的文件名执行java命令运行字节码文件程序运行效果分析程序3-1关键字class用来定义一个类,Hello是类的名称;在Java程序中,所有的语句都必须放在某个类中;整个类及其所有成员都包含在一对花括号中〔即{和}之间〕,它们标志着类定义块的开始和结束。定义类的一般语法: class类名 { …… }分析程序3-2程序必须从main函数开始执行;关键字public是访问修饰符,用来控制类成员的可见范围及作用域;关键字static允许在不创立类的实例的情况下,调用main函数;关键字void用来说明main函数是没有返回值的;args是字符串数组,用来从命令行接收参数;main函数的一般形式如下: publicstaticvoidmain(String[]args){ …… }分析程序3-3String[]是字符串类型的数组;在Java中,类名称一般首字母大写;使用System.out.println()将信息输出到控制台上,即打印出来。JavaAPI文档JavaAPI文档描述了Java的许多内置功能,以及提供各种类的帮助说明,它是程序员经常查阅的资料可登录Sun公司的官方网站免费下载Java文件中的注释与其它编程语言一样,也可以在Java文件添加注释,Java文件中的注释有三种:单行注释:以//开始,在行尾结束多行注释:以/*开始,以*/结束,可以有多行文档注释:以/**开始,以*/结束,可以有多行可以使用javadoc命令,将文档注释从源代码中提取出来,生成HTML文件,形成类似于JavaAPI文档的帮助说明文件。使用javadoc命令生成API文档javadoc命令的格式是:javadoc完整的源文件名执行javadoc命令提取文档注释的内容生成的文档Java语言的特点2-1简单去掉了C和C++中许多复杂功能,如指针、运算符重载等,没有goto语句,没有struct和union等面向对象Java是完全面向对象的编程语言,比C++更彻底,纯度更高健壮性没有指针,防止对指针的误操作造成程序崩溃程序员分配的内存空间,无需释放,由Java虚拟机的垃圾回收机制来统一完成此项工作,防止了内存泄漏Java语言的特点2-2平安性由于Java取消了指针运算,有效地提高了程序的平安性Java程序运行在Java虚拟机上,虚拟机可以有效地过滤掉恶意代码,防止程序员有意编写的病毒程序分布性Java程序可以跨平台,跨操作系统,完全支持网络应用程序的设计多线程Java程序使用一个称为“多线程”的进程同时处理多项任务使用Eclipse来开发总结Java是面向对象的、跨平台的程序设计语言;Java程序是运行在Java虚拟机之上的;要下载安装JDK,才可以开发和运行Java程序;JDK提供一系列的工具,这些工具位于JDK安装路径的bin目录下,常用的有:javac:编译java:运行javadoc:提取文档可以使用任何文本编辑器编写Java源程序;作业熟悉JDK目录,以及JDK环境变量使用记事本编写HelloWorld程序使用记事本编写九九乘法表使用记事本编写空心菱形Java语言根底Java是面向对象并且可以跨平台的编程语言Java程序是运行在JVM〔Java虚拟机〕之上的要运行和开发Java程序,必须下载和安装由Sun公司提供的JDK〔Java开发工具包〕配置环境变量:Path和classpath三个常用的JDK工具:javac、java和javadoc本章相关词汇〔蓝色为关键字〕单词说明byte数据类型,字节型boolean数据类型,布尔型true真,布尔型的字面值false假,布尔型的字面值null空本章目标Java中的变量和数据类型Java中变量的作用域规那么数据类型转换Java中的输出语句Java中的运算符和表达式Java语言根底Java中的变量和数据类型变量变量是内存中的一块存储区域,是存储数据的根本单元;声明变量的语法: 数据类型标识符[=值];如: intnum; floatmoney=123.45f; charch1,ch2=‘A’;数据类型数据类型用来确定要存储在内存单元中的数据的类型;在Java中,数据类型被区分成两个种类:原始数据类型引用数据类型原始数据类型原始数据类型是最简单的数据形式,与C的根本数据类型很相似:数据类型大小位取值范围说明boolean
布尔型1true/false用于存储真值/假值byte
字节型8-128~127数据存储在内存中的最原始形态char
字符型16‘\u0000’~‘\uFFFF’用于存储字符,以Unicode编码方式short短整型16-32768~32767略(参见P20表2.1)int
整型32-231~231-1
略(参见P20表2.1)long长整型64-263~263-1
略(参见P20表2.1)float浮点型32略略(参见P20表2.1)double双精度64略略(参见P20表2.1)引用数据类型在Java中,除了上述8种原始数据类型的变量以外,其余的全都属于引用数据类型,其中包括:数组对象存储在引用类型变量中的值是该变量表示的值的地址;可以借用C语言中指针的概念来理解引用数据类型。回忆C语言中的内存分配C语言中内存分配的两种形式:栈内存:特点:和作用域同生命周期,自动申请,自动释放。申请方式:局部变量,形式参数。栈内存中的空间一般都有名称,通过变量名访问其存储的数据。堆内存〔即动态内存分配〕:特点:手工申请,手工释放,生命周期由程序员决定。申请方式:由malloc函数或calloc函数申请,realloc函数进行调整,free函数负责释放。堆内存中的空间一般没有名称,只能通过指针访问。Java中的内存分配Java中的原始数据类型与C语言中的根本数据类型一样,其变量都是在栈中分配空间;而除了8种原始数据类型以外,其它的任何数据都不可以在栈中分配,只能到堆中开辟空间,而在堆中分配的空间又只能通过指针访问;通过指针访问堆内存的方式,在Java中被称作引用数据类型;可以认为,Java中的引用就类似于C语言中的指针,只是对指针进行了一定程度上的包装,防止了因直接操作指针而造成的数据意外损坏,从而导致程序错误的情况。标识符命名规那么变量、函数、数组、对象、类和接口等等都需要命名,这些名称统称为标识符;Java中对于标识符的命名规那么作了如下限制:只能由英文字母、数字、下划线“_”和“$”符号组成;必须以英文字母、“_”或“$”开头,即不能以数字开头;除“_”和“$”以外,不能包含其它任何特殊字符;不能与关键字冲突;严格区分大小写。变量的作用域和生命周期变量的作用域指变量起作用的范围,说明变量在什么局部可以被访问;变量的生命周期是指变量在内存中存在的周期,即什么时候分配空间,什么时候销毁。CJava变量声明程序中所有使用到的变量应该在程序开始部分预先进行声明。可以在程序的任何部分声明,即:何处使用,何处声明。作用域规则变量的作用域属于声明它的函数范围之内,变量的最小作用域是函数。变量的作用域属于声明它的代码块,变量的最小作用域是包含它的一对{}之间。/*有1,2,3,4四个数字,能组成多少个不相同且无重复的三位数?*/public
classScopeVariable{
public
static
voidmain(String[]args){
intcount=0;
for(inti=1;i<=4;i++)//在需要使用变量时声明
{
for(intj=1;j<=4;j++){
for(intk=1;k<=4;k++){
if(i!=j&&i!=k&&j!=k){
inttemp=i*100+j*10+k;System.out.print(temp+"\t");count++;}}}}/*思考:在此处可以访问到变量k吗?*/
System.out.println("\n有:"+count+"个符合要求的数");}}作用域例如数据类型转换程序中经常会遇到要将数据类型进行转换的情况〔如:在一个表达式中存在不同类型的操作数时〕,Java的数据类型转换比C控制得更为严格;数据类型转换有两种情况:自动类型转换强制类型转换自动类型转换自动类型转换也称作隐式类型转换;将一种类型的变量赋值给另一种类型的变量时,只要满足以下条件,就会发生自动类型转换:两种类型之间相互兼容;目标类型大于源类型〔即类型提升〕;如: charch='A'; intnum=ch; floatf=num; doubled=f; //类型转换自动发生,无需显式说明强制类型转换强制类型转换也称作显式类型转换;如果被转换的值的数据类型大于其目标类型,将会丧失局部信息;如: intx=65; charch=x;这样的语句将报错,因为char类型小于int类型,编译器无法将其自动转换,只能进行强制转换: intx=65; charch=(char)x;类型提升规那么不难看出,在有类型提升的情况下,编译器将自动进行类型转换,否那么就要进行强制类型转换;类型提升应遵循如下规那么:两种类型必须兼容,且目标类型大于源类型,例如: byte、char和short类型都可以提升为int型。对于表达式而言,其最终结果将会与表达式中最高的数据类型相同。输出语句如果要将某些信息打印到屏幕上,就必须使用输出语句;使用System.out.println()实现换行输出效果;使用System.out.print()实现输出但不换行效果;无论输出什么类型的数据,只需将数据作为参数传递给它们即可,而无需像C语言中那样,使用%s、%d之类的控制字符,如:
inta=10;
floatf=3.14f; System.out.println(a); System.out.print(f); System.out.println('X');使用转义字符控制输出格式有些时候,我们可能会需要对输出格式进行控制,这就使用到了转义字符;以下是一些常用的转义字符:转义字符说明\n换行符,将光标移到下一行\r回车符,将光标移到当前行的开头\t制表符,将光标移到下一制表位\\输出反斜线\'输出单引号\"输出双引号运算符和表达式运算符是通过一定的运算规那么操作一个或多个操作数,并生成结果的特定符号;运算符和操作数的有效组合称为表达式;Java提供了一系列丰富的运算符,包括:算术运算符关系运算符逻辑运算符条件运算符赋值运算符
算术运算符
算术运算符主要用于数学计算,一般使用数值作为操作数:
运算符说明一元-一元减,即取负++自增,如:++a等价于a=a+1--自减,如:--a等价于a=a–1二元+加法,返回两个操作数的和-减法,返回两个操作数的差*乘法,返回两个操作数的积/除法,返回两个操作数的商%取模,返回两个操作数整除后的余数
关系运算符
关系运算符可以测试两个操作数之间的关系〔但不会改变操作数的值〕,关系表达式的结果为boolean型true/false:运算符说明==等于,检查两个操作数是否相等!=不等于,检查两个操作数是否不相等>大于,检查左操作数是否大于右操作数>=大于等于,检查左操作数是否大于或等于右操作数<小于,检查左操作数是否小于右操作数<=小于等于,检查左操作数是否小于或等于右操作数逻辑运算符逻辑运算符与boolean型操作数一起使用:运算符说明JavaC一元!逻辑非(NOT)逻辑取非(NOT)二元&逻辑与(AND)与C语言中的&&相同按位与|逻辑或(OR)与C语言中的||相同按位或&&短路与如左操作数为false,则不运算右操作数逻辑与(AND)||短路或如左操作数为ture,则不运算右操作数逻辑或(OR)位运算符常见的位运算符有:&、|、^、~参见例如:BitwiseOperatorTest还有移位运算符<<、>>、>>>参见例如:ShiftTest短路与和短路或Java提供了两个在其它计算机语言中没有的逻辑运算符,这就是逻辑与和逻辑或的短路版本;对于短路与〔&&〕,如果其左侧为false,那么不再计算其右侧,整个表达式的结果为false,只有左侧为true时才计算右侧;对于短路或〔||〕,如果其左侧为true,那么不再计算其右侧,整个表达式的结果为true,只有左侧为false时,才计算右侧。inta=10;intb=20;if(++a==12&++b==22){……}System.out.println(a);System.out.println(b);/*这里使用的是逻辑与,试分析最后的输出结果*/inta=10;intb=20;if(++a==12&&++b==22){……}System.out.println(a);System.out.println(b);/*这里使用的是短路与,试分析最后的输出结果*/11211120短路与例如赋值运算符赋值运算符的运算顺序是从右至左的:运算符说明=赋值,将右侧的值赋给左侧的变量+=相加并赋值,如:a+=b等价于a=a+b-=相减并赋值,如:a-=b等价于a=a–b*=相乘并赋值,如:a*=b等价于a=a*b/=相除并赋值,如:a/=b等价于a=a/b%=取模并赋值,如:a%=b等价于a=a%b条件运算符?:条件运算符是三元运算符;它的一般形式是: 表达式1?表达式2:表达式3根据表达式1的结果来判断执行表达式2还是表达式3,如果表达式1的结果为true,那么执行表达式2,否那么执行表达式3;条件运算符在某些情况下能够替代小型的if…else语句。运算符的优先级很多情况下,一个表达式由多个运算符组成,优先级决定运算符的计算顺序:优先级运算符1括号:()和[]2一元运算符:-、++(前置)、--(前置)、!3算术运算符:*、/、%、+和-4关系运算符:>、>=、<、<=、==和!=5逻辑运算符:&、|、&&和||6条件运算符:?:7赋值运算符:=、*=、/=、%=、+=和-=总结Java中的变量和数据类型Java中变量的作用域规那么数据类型转换Java中的输出语句Java中的运算符和表达式流程控制与数组Java中的数组new关键字控制流语句一般情况下,程序是从上往下依次顺序执行的;但很多时候,我们需要改变程序执行的流程,这就使用到了控制流语句;控制流语句包括:判断语句循环语句跳转语句判断语句判断语句也称作条件语句或分支语句;判断语句主要用来控制程序在何种情况下执行某一局部;判断语句包括:if语句if…else语句if…elseif语句switch…case语句循环语句循环语句也称作迭代语句;循环语句可用于重复执行相同的操作;循环语句包括:while语句do…while语句for语句跳转语句跳转语句允许以非线性的方式执行程序,可以将控制权转到程序的其它局部;跳转语句包括:break语句continue语句Java抛弃了C语言中的goto语句。数组数组用于将相同类型的数据存储在连续的存储单元中;可以通过指定数组的名称和长度来声明数组;一旦声明数组的大小,就不能再修改;数组元素通过数组名和索引来访问,索引从0开始;数组可以是一维,也可以是多维。回忆C语言中的数组在C语言中,从存储方式上讲,声明数组有两种情况;在栈内存中分配空间,如:
intary[10];//声明有10个整型元素的数组在堆内存中分配空间,如:
int*p=NULL;//声明整型指针
//指针指向堆空间
p=(int*)malloc(10*sizeof(int));C语言允许有栈数组,也允许有堆数组。
new关键字在Java中,不允许将数组分配在栈内存中,只能分配在堆内存中;Java中没有类似于malloc、calloc、realloc和free等函数,取而代之的是new关键字;new是Java中内置的操作符;new操作符用来从堆中分配指定类型的内存空间,并返回相应类型的引用,其作用类似于malloc函数。声明数组例如public
classArrayDemo{
public
static
voidmain(String[]args){
//声明整型数组的引用,类似于C中的int*p;
int[]ary;
//为数组引用在堆内存中分配实际的内存空间
//类似于C中的p=(int*)malloc(10*sizeof(int));ary=new
int[10];
//使用循环为数组元素赋值
for(inti=0;i<ary.length;i++){ary[i]=i;
}
//使用循环将数组元素逐个输出到控制台
for(inti=0;i<ary.length;i++){System.out.println(ary[i]);}}}Java中声明数组的几种方式在Java中声明数组有如下方式://仅声明数组的引用,但没有分配内存空间float[]fAry;//声明数组的同时,根据指定的长度分配内存,但数组中没有值char[]chAry=new
char[10];//声明数组并分配内存,同时将其初始化int[]ary1=new
int[]{1,2,3,4,5};//与前一种方式相同,仅仅只是语法相对简略int[]ary2={1,2,3,4,5};数组之间赋值在C语言中,不可以将数组直接赋值给另一个数组;在Java中,语法上允许这样做,但实际得到的效果是两个数组引用指向同一块内存。
int[]ary1={2,4,6,8,10};
int[]ary2; ary2=ary1;//允许这样赋值108642堆栈ary1ary2数组赋值例如public
classArrayDemo{
public
static
voidmain(String[]args){
int[]ary1={2,4,6,8,10};//声明并初始化数组1
int[]ary2;//声明数组2ary2=ary1;//将数组1赋值给数组2
ary2[3]=1024;//通过数组2修改其中一个元素的值
//打印出数组1中的元素
System.out.println("数组1中的元素:");
for(inti=0;i<ary1.length;i++){System.out.println(ary1[i]);}
//打印出数组2中的元素
System.out.println("数组2中的元素:");
for(inti=0;i<ary2.length;i++){System.out.println(ary2[i]);}}}关于数组长度在Java中,程序员可以不再关注数组的长度,数组自带的length属性将负责保管数组的长度;C语言不检查数组的边界,数组索引完全由程序员掌握;
Java对数组下标越界情况强加约束;如果试图访问不在有效索引以内的元素,将会引发运行错误。Java中的垃圾回收机制在C语言中,被malloc或calloc函数分配的堆内存在使用完毕以后,必须使用free函数进行释放,否那么将会造成内存泄漏;同样的,在Java中由new分配的内存也将存在内存泄漏的可能;但释放内存的任务是由Java虚拟机来完成的,程序员可以不再关心此项工作;如果某块内存空间没有任何引用指向它,那么虚拟机就将其认定为垃圾;虚拟机并不是随时随地地立即回收垃圾,而是在系统比较空闲的时候,才会执行回收任务。命令行参数在命令行使用java命令执行程序时,可以将一些参数传递给main函数;main函数携带的String[]〔字符串数组〕类型的形参args正是为了接收这些来自命令行的参数;可以从命令行传递任意多个字符串给main函数,其间使用空格隔开,也可以不传递任何参数;这些传递进来的多个字符串最后以字符串数组的形式,供main函数中加以使用。命令行参数例如publicclassArgumentDemo{publicstaticvoidmain(String[]args){intlen=args.length;//获得命令行参数的个数if(len>0)//判断是否有命令行参数{//如果有,将其逐一打印到控制台System.out.println(len+"个命令行参数,具体如下:");for(inti=0;i<args.length;i++){System.out.println(args[i]);}}else{//否那么给出提示信息System.out.println("您没有传递任何命令行参数。");}}}总结Java中数组是引用数据类型,只能存放在堆内存中;数组必须由new关键字为其分配内存;释放内存的工作由Java虚拟机的垃圾回收机制来完成;可以利用命令行参数接收来自用户的输入。作业利用命令行参数输入一个整数,并判断该数字是否为奇数,如果是奇数,那么用其作行数打印空心菱形PS:将字符串转换为数字的方法intnum=Integer.parseInt(Stringnumber);利用命令行参数输入三个整数,并对三个数字进行降序排列。PS:将字符串转换为数字的方法intnum=Integer.parseInt(Stringnumber);利用命令行参数输入多个参数,并赋值给一数组,同时判断该数组是否为回文数组PS:例如数组{“123”,”222”,”333”,”222”,”123”}就是回文数组,即元素倒置过后与原元素一样逻辑趣味思考题有两个桶,一个容量为5升,一个容量为3升,现在用桶子来乘水,请您用这两个桶准确的乘出4升水来。有10堆鱼,每堆鱼10条,正常情况下每条鱼10斤,但是现在这10堆鱼中有1堆鱼全是每条9斤,现在给你一把秤〔假设这把秤可以称很重很重的东西〕,请问您能通过一次称量就找出这堆缺斤少量的鱼吗?回忆Java中的数据类型分为:原始数据类型和引用数据类型;在数据类型转换中,由低类型转至高类型,将会自动〔隐式〕类型转换,而从高类型转至低类型,那么必须强制〔显式〕类型转换;Java中的数组是引用数据类型,必须由new关键字在堆中分配内存;Java虚拟机的垃圾回收机制将自动释放不再使用的内存;使用命令行参数接收来自用户的输入。相关词汇单
词说
明Class类,种类public公共的,公有的private私有的,私人的object对象,物体encapsulation封装,包装attribute属性,特征method方法member成员constructor构造方法,构造器类和对象I了解什么是面向对象面向对象的根本概念类对象封装继承多态如何定义类,如何创立对象成员运算符访问控制权限:public和private构造方法类和对象I了解什么是面向对象面向对象的根本概念类对象封装继承多态如何定义类,如何创立对象成员运算符访问控制权限:public和private构造方法什么是面向对象?ObjectOriendtedProgramming对象以…为导向的程序设计面向对象编程就是使用对象进行程序设计,简写成OOP。面向对象的编程语言如今,面向对象的编程思想已经成为主流;面向对象的编程语言正大行其道,最具代表性的有:C++JavaC#连数据库也开始面向对象了,如Oracle。面向对象的编程思想OOP旨在计算机程序中模拟现实世界中的概念在计算机程序中用相似的实体模拟现实世界中的实体在OOP中,现实世界的所有事物全都被视为对象设计和实现软件系统的方法C语言的编程方式C语言是结构化的编程语言〔StructuredProgramming,简作SP〕;强调精巧的数据结构和优越的算法,关注程序的运行效率;不适合于大规模的程序开发;程序模块之间协调性差,程序的重用性、平安性、健壮性和可维护性都存在较大的缺陷。SP和OOP比照SPOOP设计思路自顶向下、层次化、分解自底向上、对象化、综合程序单元函数模块对象设计方法程序=算法+数据结构程序=对象=数据+方法优点相互独立,代码共享接近人的思维方式模拟客观世界缺点数据与程序不一致维护困难客观世界的无序性概念不成熟面向对象的三大原那么封装继承多态对象对象是面向对象编程的核心局部,是实际存在的具体实体,具有明确定义的状态和行为;对象其实就是“数据”和“函数”的封装体,其中:数据表示自身的状态,也称作“属性”或“成员数据”;函数表示自身的功能,也称作“方法”或“成员函数”。姓名:布兰尼职衔:收银员年龄:35体重:60千克操作:收款打印帐单收银员对象顾客姓名:朱丽叶年龄:28体重:52千克操作:购买商品顾客对象状态行为类人们为了更好地认识世界,将现实生活中的事物〔对象〕划分成类;同一类中的事物总是具有一些共性;类以共同的特性和行为定义实体;类是具有相同属性和和行为的一组对象的集合。属性事物的特性在类中用变量表示;每个对象的每个属性都拥有其特定的值;属性名称由类的所有对象共享;对象或实体拥有的特征在类中表示时称为属性。学生对象姓名年龄住址……属性方法事物的行为和动作在类中用函数表示;每个对象都有相同的动作和行为;对象执行的操作在类中表示为方法。学生对象吃饭方法睡觉上课……类和对象的区别类是用来描述实体的“模板”或“原型”;对象是实际的实体,每一个对象都是类的一个具体实例;类用来定义对象所有的属性和方法,同一类的所有对象都拥有相同的特征和操作;可以将类理解成生产产品的模具,而对象那么是根据此模具生产的一个个产品。类与结构最简单的理解方式:区别在于:结构体一般只有数据〔属性〕而没有函数〔方法〕。类结构体结构体变量对象CJava封装将某些东西包装在一起,然后以新的完整形式呈现出来;隐藏属性、方法或实现细节的处理方式称为封装;封装其实就是有选择性地公开或隐藏某些信息,它解决了数据的平安性问题。一个人类的对象姓名:张三体重:50kg……密码:******属性走路吃饭……方法可以公开无所谓不可以公开继承继承就是重用现有的类来生成新类的一种特征;通俗地讲就是从现有的类〔即父类或基类〕创立新类〔子类或派生类〕的过程;现实生活中,继承可以到达财产重用的目的,而在Java中,继承可以使代码重用。多态多态是指同一函数在不同的类中有不同的实现;多态的好处就是使类更灵活,更便于扩充。抽象把相同的或相似的对象归为一类的这个过程就是抽象,所以,抽象就是分析问题的方法;抽象的根本原那么:只关心主要问题,而不关心次要问题;只关心主要矛盾,而不关心次要矛盾;只关心相同的东西,而不关心不同的东西;只关心问题是什么,能够完成什么,而不关心怎样去完成。抽象的过程其实就是面向对象编程的核心思想。在Java中定义类/*定义学生类*/classStudent{Stringname;//姓名
intage;//年龄
floatweight;//体重
/*吃饭的方法*/
voiddining(){System.out.println("吃饱了...");weight++;}
/*走路的方法*/
voidwalk(){System.out.println("走累了...");weight--;}}成员变量成员函数定义类的语法class
类名{
成员列表//包括成员变量和成员函数}在Java中定义类struct
结构体名{
成员列表//只有成员变量,没有成员函数};在C中定义结构体习惯上,类名的首字母大写,如:Student在Java中创立对象/*Test类,用来容纳main方法*/publicclassTest{/*main方法,程序入口*/publicstaticvoidmain(String[]args){Studentstd;//声明Student类型的引用std=newStudent();//创立Student类型的对象="张三";//为姓名赋值std.age=18;//为年龄赋值std.weight=50;//为体重赋值std.dining();//调用成员方法System.out.println(std.weight);std.walk();System.out.println(std.weight);}}创立对象的语法和数组相似,对象也是引用数据类型,只能使用new运算符从堆中分配内存;创立对象的一般语法: 类名引用名=new类名();使用已经定义好的类,创立该类对象的过程称为“实例化”。注意:这里要有括号成员运算符.在C语言中,必须要先声明结构体变量,才可以访问结构体中的成员;同样的,只有先实例化类的对象,才可以访问到类中的成员〔属性和方法〕;使用成员运算符〔.〕来访问成员属性或成员方法;一般语法是: 对象名.成员名如:std.age=18;//为成员属性赋值 std.dining();//调用成员方法访问权限:public和privateC语言中结构体的成员可以从任何地方进行访问,这将给数据的平安留下极大的隐患;为了防止从类外部直接访问类成员而造成的数据损坏,Java对类成员的访问制定了约束;关键字public和private是访问修饰符,用来说明某个成员是否可以从类外部进行访问;public修饰的成员可以在任何地方进行访问,不受任何约束;private修饰的成员只能够被本类中的其它成员访问,而不能从类的外部进行访问。访问权限无法从类的外部访问私有成员;其它类的私有成员对于当前类也是隐藏的。可以从类外部访问类属性或方法私有属性或方法公有不可从类外部访问访问权限例如classStudent{
privateStringname;//姓名,私有的,不可以从类外部直接访问
private
intage;//年龄,私有的,不可以从类外部直接访问
private
floatweight;//体重,私有的,不可以从类外部直接访问
//吃饭的方法,公有的,可以从任何地方访问
public
voiddining(){System.out.println("吃饱了...");weight++;//dining方法是类内部成员,可以直接访问本类私有成员
}
//走路的方法,公有的,可以从任何地方访问
public
voidwalk(){System.out.println("走累了...");weight--;//walk方法是类内部成员,可以直接访问本类私有成员
}}public
classTest{
public
static
voidmain(String[]args){Studentstd=newStudent();//实例化一个Student对象
std.age=18;//试图从类外部访问私有成员,将会报出一个错误
std.dining();//允许访问公有成员
}}访问权限〔续〕加上访问修饰符有时候可能会给操作数据带来不便,但可以在很大程度上保证数据的平安;一般地,我们会将成员属性声明为private,而将成员方法声明为public,但这样做并不是绝对的;有时候,类外部可能要操作到某些私有数据成员,那么就可以增加一个公有的方法,再由这个方法来操作私有数据,防止因类外部的误操作而造成的数据损坏;因为main方法要由类外部的虚拟机来调用,所以main方法必须声明成public。修改Student类classStudent{//定义学生类
privateStringname;//姓名,私有
private
intage;//年龄,私有
private
floatweight;//体重,私有
public
voidsetName(Stringname){//为姓名赋值的方法,公有
=name;}
public
voidsetAge(inta){//为年龄赋值的方法,公有
age=a;}
public
voidsetWeight(floatw){//为体重赋值的方法,公有
weight=w;}
public
voiddisplay(){//将所有信息打印出来的方法,公有
System.out.println("姓名:"+name+",年龄:"+age+",体重:"+weight);}
public
voiddining(){……}//吃饭的方法,公有,代码略
public
voidwalk(){……}//走路的方法,公有,代码略}public
classTest{
public
static
voidmain(String[]args){Studentstd=newStudent();//实例化学生类对象
std.setName("张三");//为姓名赋值
std.setAge(18);//为年龄赋值
std.setWeight(55);//为体重赋值
std.dining();//调用吃饭的方法
std.display();//将信息打印出来
}}对象初始化在上例中,只能逐个地为数据成员赋值,如果想在对象实例化的同时就初始化成员属性,就使用到了构造方法;构造方法是特殊的成员方法,它与类同名,在对象实例化时由虚拟机自动调用;请注意:构造方法没有返回值类型,也不能有返回值。构造方法例如/*定义ConstructorDemo类,对构造方法进行测试*/classConstructorDemo{
/*构造方法,方法名与类名完全一致无需指定返回值类型,也不能有返回值*/
publicConstructorDemo(){System.out.println("这是构造方法");}}/*Test类,用来容纳main方法一般将包含有main方法的类声明为public*/public
classTest{
/*main方法,程序入口*/
public
static
voidmain(String[]args){
/*实例化ConstructorDemo类的对象*/ConstructorDemocd=newConstructorDemo();}}构造方法正是由于在实例化对象的同时会自动调用构造方法,所以构造方法一般用来给数据成员分配资源或初始化数据成员;构造方法的一般形式: 访问权限类名〔形参列表〕{方法体}因为是由虚拟机来调用构造方法,所以构造方法一般应定义成public。为Student类添加构造方法classStudent{//定义学生类
privateStringname;//姓名,私有
private
intage;//年龄,私有
private
floatweight;//体重,私有
//构造方法,根据传递进来的参数,为数据成员赋值
publicStudent(Stringn,inta,floatw){
//分别为每个数据成员赋初始值
name=n;age=a;weight=w;}
public
voidsetName(Stringn){……}//为姓名赋值的方法,公有,代码略
public
voidsetAge(inta){……}//为年龄赋值的方法,公有,代码略
public
voidsetWeight(floatw){……}//为体重赋值的方法,公有,代码略
public
voiddisplay(){……}//将所有信息打印出来的方法,公有,代码略
public
voiddining(){……}//吃饭的方法,公有,代码略
public
voidwalk(){……}//走路的方法,公有,代码略}public
classTest{
public
static
voidmain(String[]args){
//利用构造方法,为数据成员指定初始值
Studentstd=newStudent("张三",18,55);std.display();//将信息打印出来
}}构造方法〔续〕每个对象在生成时都必须执行构造方法,而且只能执行一次;如果构造方法调用失败,那么对象也无法创立;不可以显式地直接调用构造方法;在没有定义构造方法的情况下,类会自动产生一个无参数的默认构造方法,这个默认的构造方法什么都不做;一旦显式地定义了构造方法,默认构造方法自动消失。总结对象由状态〔属性〕和行为〔方法〕组成;类是具有相同属性和方法的对象的集合;封装可以隐藏对象实现的具体细节;必须先实例化类的对象,才可以访问到其中的成员;成员运算符用于访问对象的成员;成员可以定义为公有,也可以定义为私有;构造方法一般用来初始化对象中的数据成员;如果不定义构造方法,将有默认的构造方法,一旦定义,默认的构造方法自动消失。练习编写一个包含名为Calculator类的程序。定义两个整型属性以及对该两个变量的setter和getter,编写用于对两个属性执行加、减、乘、除运算方法。在main方法里创立该类的对象并访问这些方法。编写一个名为Box的类,含整型的length,width,height,volume四个属性,要求在构造方法中将其初始化,并定义一个计算体积的calcVolume方法和一个输出体积的print方法,在main方法中进行调用思考有三筐水果,一筐装的全是苹果,第二筐装的全是橘子,第三筐是橘子与苹果混在一起。筐上的标签都是骗人的,〔比方,如果标签写的是橘子,那么可以肯定筐里不会只有橘子,可能还有苹果〕你的任务是拿出其中一筐,从里面只拿一只水果,然后正确写出三筐水果的标签。一列时速15英里的火车从洛杉矶出发,驶向纽约。另外一列时速20英里的火车从纽约出发,驶向洛杉矶。如果一只鸟以每小时25英里的速度飞行,在同一时间从洛杉矶出发,在两列火车之间往返飞行,到火车相遇时为止,鸟飞了多远?回忆对象由属性〔数据〕和方法〔函数〕组成;类是具有相同属性和方法的对象的集合;封装可以隐藏对象实现的细节局部;对象是引用数据类型,使用new运算符创立对象实例,使用成员运算符访问对象中的成员;访问修饰符用来控制访问权限,可以有效地保证数据平安;构造方法一般用来初始化对象中的数据成员相关词汇单词说明this这,这个static静态的package包裹,包import引入,导入overloaded重载,超载overloadedmethod方法重载类和对象II方法重载重载构造方法对象在内存中的存放形式this关键字静态成员,static关键字包打包,package关键字导入包,import关键字类和对象II方法重载重载构造方法对象在内存中的存放形式this关键字静态成员,static关键字包打包,package关键字导入包,import关键字提示在Java中,函数无需C语言中的前向声明,只要直接定义即可;Java中,函数被称为方法;定义一个方法的一般形式: [访问权限]返回值类型方法名称(形参列表){ 方法主体; }我们更关注的是方法原型,对于方法原型的三个主要组成局部应当明确区分:返回值类型方法名称形式参数在Java中定义方法/*Java中的方法例如代码片段*//*定义求平方值的方法*/publicintsquare(intx){return(x*x);}返回值类型方法名称形式参数案例/*编写求绝对值的方法来求整数的绝对值*//*AbsoluteValue类,其中包含求绝对值的方法Java中的任何方法都必须在类中定义*/public
classAbsoluteValue{
/*求绝对值的方法*/
public
intabs(intx){
return((x>=0)?x:-x);}
/*main方法,程序入口*/
public
static
voidmain(String[]args){
//必须先实例化类的对象,才可以调用到其中的成员方法
AbsoluteValueobj=newAbsoluteValue();
inta=-8,b;b=obj.abs(a);//调用abs方法求a的绝对值
System.out.println(a+"的绝对值是"+b);}}方法的定义方法的调用案例分析在上面的案例中,我们已经定义了求整数绝对值的方法;但有时候,我们可能还需要求浮点数的绝对值,请问:可以继续使用这个方法吗?事实上是行不通的,这个方法只能求出整数的绝对值,对于浮点数,还需另外再定义求浮点数绝对值的方法。修改案例public
classAbsoluteValue{
/*求整数绝对值的方法*/
public
intabsOfInt(intx){
return((x>=0)?x:-x);}
/*求浮点数绝对值的方法*/
public
floatabsOfFloat(floatx){
return((x>=0)?x:-x);}
public
static
voidmain(String[]args){AbsoluteValueobj=newAbsoluteValue();
inta=-8,b;b=obj.absOfInt(a);System.out.println(a+"的绝对值是"+b);
floatc=-3.14f,d;d=obj.absOfFloat(c);System.out.println(c+"的绝对值是"+d);}}如果还要求其它类型的绝对值,就需要定义更多的方法,这对于调用者来说,将会是非常麻烦的事情。方法重载用于定义一组方法,这些方法具有相同的名称,并执行类似的操作,但是却使用不同的参数列表;编译器会根据调用时传递的实际参数自动判断具体调用的是哪个重载方法,如:/*abs方法的重载*/intabs(intx){……}floatabs(floatx){……}doubleabs(doublex){……}longabs(longx){……}方法重载的三大原那么方法名相同参数不同〔可以有三方面的不同〕数量不同类型不同顺序不同同一作用域温馨提示:方法重载跟方法的返回值类型没有任何关系。也就是说,只有返回值不同的方法不能构成重载。/*错误的方法重载*/voidfun(intx){……};intfun(intx){……};方法重载例如public
classAbsoluteValue{
public
intabs(intx){//重载方式1,求整数的绝对值
return((x>=0)?x:-x);}
public
floatabs(floatx){//重载方式2,求浮点数的绝对值
return((x>=0)?x:-x);}
public
doubleabs(doublex){//重载方式3,求双精度数的绝对值
return((x>=0)?x:-x);}
public
longabs(longx){//重载方式4,求长整型数的绝对值
return((x>=0)?x:-x);}
public
static
voidmain(String[]args){AbsoluteValueobj=newAbsoluteValue();
inta=-8,b;b=obj.abs(a);System.out.println(a+"的绝对值是"+b);
floatc=-3.14f,d;d=obj.abs(c);System.out.println(c+"的绝对值是"+d);}}方法重载的两种方式之一利用不同数据类型的参数重载;对于带有相同数量参数但参数类型不同的重载方法,编译器可以区分它们,如:只要所有参数式样都是唯一的,就可以使用多个重载;很多编程语言已经重载了输出方法,以便您可以用相同的函数名称输出任何类型的数据。intsquare(intx){……}floatsquare(floatx){……}doublesquare(doublex){……}方法重载的两种方式之二利用不同数量的参数重载,如:将调用与参数最匹配的方法,如果没有方法得出最正确匹配,那么编译器将报错;编译器解决重载的方式与方法定义的顺序无关;重载不考虑方法的返回值类型。/*函数定义*/intfun(intn1){……}intfun(intn1,intn2,intn3){……}/*函数调用*/fun(a);fun(x,y,z);方法重载的作用域规那么只有属于同一作用域范围内的方法才能构成重载。classFirst{……public
voidshow(){……}……}classSecond{……public
voidshow(intx){……}……}不构成重载课堂练习1在Java中,对于成员方法 floatadd(floatf1,floatf2){……} 下面选项〔〕是对该成员方法的重载。intadd(intn1,intn2){……}floatadd(floatf){……}voidadd(floatf1,floatf2){……}voidadd(floatf1,floatf2,floatx){……}floatadd(floatf2,floatf1){……}课堂练习2在Java中,以下方法〔〕不能与 intfun(intx){……} 构成方法重载。intfun(intx,inty){……}floatfun(intx){……}intfun(floatx){……}intfun(intx,inty,intz){……}关于方法重载的重要提示请勿将功能完全不一样的方法进行重载!重载构造方法方法重载的一个重要应用就是重载构造方法;可以定义一组构造方法,使其构成重载关系,从而方便使用者能够灵活机动地以各种不同的方式来实例化对象。重载构造方法例如classMyTime{//定义时间类
private
intmHour,mMinute,mSecond;//三个成员变量,时、分、秒
publicMyTime(){//构造方法重载1mHour=0;mMinute=0;mSecond=0;}
publicMyTime(intmHour){//构造方法重载2 mHour=mHour;mMinute=0;mSecond=0;}
publicMyTime(inthour,intminute){//构造方法重载3mHour=hour;mMinute=minute;mSecond=0;}
publicMyTime(inthour,intminute,intsecond){//构造方法重载4mHour=hour;mMinute=minute;mSecond=second;}
public
voiddisplay(){//显示时间信息的方法
System.out.println(mHour+":"+mMinute+":"+mSecond);}}重载构造方法例如〔续〕/*测试时间类*/public
classTest{
/*main方法,程序入口*/
public
static
voidmain(String[]args){
//分别调用不同的构造方法来初始化时间对象
MyTimet1=newMyTime();//调用重载方式1t1.display();MyTimet2=newMyTime(8);//调用重载方式2t2.display();MyTimet3=newMyTime(8,30);//调用重载方式3t3.display();MyTimet4=newMyTime(8,30,30);//调用重载方式4t4.display();}}/*使用重载构造方法可以使初始化对象的方式灵活机动,大大方便类的使用者。*/对象在内存中的存放形式成员方法1成员方法2……成员方法n成员变量1成员变量2……成员变量n成员变量1成员变量2……成员变量n成员变量1成员变量2……成员变量n对象1对象3对象2每个对象都有自己独立的数据成员,但是所有的对象共享成员方法。this关键字既然所有的对象都共用相同的成员方法,那么在不同的对象都调用同一方法时,它是怎么确定要使用哪个对象的数据成员呢?每个成员方法都有一个隐含的this引用,它总是指向调用它的对象;关键字this给出用于调用成员方法的对象的地址;每当调用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年碳指数设计师笔试通关资料
- 2026年小学生急救知识科普
- 2026年小孩防火安全知识培训
- 2026年主管中药师考试重点难点解析
- 2026年养生美容专业知识培训
- 2026年小学生健康知识主题班会
- 2026年小学二年级上册语文课内重点知识梳理卷含答案
- 2026年小学六年级上册数学计算专项闯关检测卷含答案
- 2026年小学六年级下册语文期末基础复习卷含答案
- 经济动物养殖学习体会
- 学堂在线西南科技大学人工智能基础(2022秋)期末考试题答案
- 首件检验报告(装配)
- 初级电工技能培训一-电工常用工具
- 新药研发毒理学安全性评价
- 外科学教学课件:下肢骨关节损伤
- 2023年潍坊市初中学业水平考试地理试题附答案
- 《张国庆 公共行政学 第4版 笔记和课后习题 含考研真题 详》读书笔记思维导图PPT模板下载
- 皮影教学反思
- GB/T 7631.2-2003润滑剂、工业用油和相关产品(L类)的分类第2部分:H组(液压系统)
- GB/T 11170-2008不锈钢多元素含量的测定火花放电原子发射光谱法(常规法)
- 主题班会-纪念长征胜利80周年-图文
评论
0/150
提交评论