资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,二级,三级,四级,五级,2022/1/4,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,二级,三级,四级,五级,2022/1/4,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,二级,三级,四级,五级,2022/1/4,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,二级,三级,四级,五级,2022/1/4,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,二级,三级,四级,五级,2022/1/4,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,二级,三级,四级,五级,2022/1/4,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,二级,三级,四级,五级,2022/1/4,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,二级,三级,四级,五级,2022/1/4,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,二级,三级,四级,五级,2022/1/4,#,Java,语言程序设计,第一章,搭建,IDE,环境,本章学习要点,掌握,JDK,的下载与安装;,掌握,path,变量的配置;,掌握使用记事本编写、编译和运行,Java,程序;,掌握使用,IntelliJ IDEA,编写、编译和运行,Java,程序;,理解,path,变量的作用;,理解,Java,的运行机制。,1.1 Java,语言简介,Java,语言是面向对象编程思想的一种高级语言,JavaSE,是各应用平台的基础,要想学习,JavaEE,和,JavaME,,必须先要学习,JavaSE,。而本书主要介绍的就是,JavaSE,。,JavaSE,可以分为四个主要的部分:,JVM,、,JRE,、,JDK,和,Java,语言。,要想运行用,Java,编写好的程序,,JVM,必不可少。,JVM,(,Java Virtual Machine,JVM,)叫,Java,虚拟机,包括在,Java,执行环境(,Java SE Runtime Enviroment,JRE,)中,所以要运行,Java,程序,就必须先安装,JRE,,而,JRE,又包括在,JDK,中。,JDK,(,Java SE Development Kits,)称为,Java,开发工具包,包括,JRE,及开发过程中需要的一些工具程序,如,javac,、,java,等。,1.2 JDK,的下载和安装,本书使用的,JDK,版本是,Java SE,。最新的,JDK,,可以在,Oracle,官网上下载。,JavaSE 8u221,这是,JDK8,,也是本书要用到的版本,。,1.3 JDK,的安装,默认路径安装即可,注意两个路径:,C:Program FilesJavajdk1.8.0_221,C:Program FilesJavajre1.8.0_221,安装成功显示:,安装完,JDK,之后,打开,C:Program FilesJava,,能看到两个文件夹,即表示,JDK,安装成功,1.4 JDK,目录介绍,bin,目录:该目录用于存放一些可执行程序,其中最重要的就是,javac.exe,和,java.exe,。,include,目录:由于,JDK,是通过,C,和,C+,实现的,因此启动时需要引入一些,C,语言的头文件,该目录就是用于存放这些头文件的。,jre,目录:此目录是,Java,运行时环境的根目录,包含,Java,虚拟机、运行时的类包、,bin,目录,但不包含开发工具。,lib,目录:,lib,是,library,的缩写,意为,Java,类库或库文件,是开发工具使用的归档包文件。,src.zip,文件:,src,中放置的是,JDK,核心类的源代码,通过该文件可以查看,Java,基础类的源代码。,1.5,使用记事本编写,Java,的第一个程序,1.,在,C:Program FilesJavajdk1.8.0_221bin,文件夹下新建文本文档,特别提醒,,一定要将扩展名显示出来,能看到文本文档的,.txt,扩展名。,2.,将文本文档重命名为,HelloWorld,,将扩展名,txt,改为,java,。,3.,用记事本打开文件,并输入如下程序代码,:,1 public class HelloWorld,2 public static void main(String args),3 System.out.println(HelloWorld);,4 ,5 ,4.,编译文件:,javac HelloWorld.java,5.,运行文件:,javac HelloWorld.java,1.6,配置,path,变量,1.5,节中,我们是在,C:Program FilesJavajdk1.8.0_221bin,目录下编写的,HelloWorld.java,,但在实际开发中,我们更需要把源文件放在另外的路径下。现在我们将,HelloWorld.java,剪切到,D:java book,目录下,,在编译该文件时,会报,找不到,javac,命令,。,path,环境变量是系统环境变量的一种,用于保存一系列的路径,每个路径之间以分号隔开。当在命令行窗口运行一个可执行文件时,操作系统首先会在当前目录下查找该文件是否存在,如果不存在,会继续在,path,环境变量中定义的路径下寻找文件,如果仍未找到,系统会报找不到命令的错误。,只需要在,path,变量中添加,javac.exe,和,java.exe,两个命令的安装路径即可。,1.7 IntelliJ IDEA,开发,Java,项目,IntelliJ IDEA,简称,IDEA,,是,java,编程语言开发的集成环境。,IDEA,有两个版本:,Ultimate,和,Community,。其中,Ultimate,是针对,web,开发的版本,,Community,是针对,Java,和,Android,开发的。本书中选择,Community,版本。该软件的安装很简单,直接单击,next,,直到最后单击,finish,按钮即可。,1.8 Java,中的注释,注释是为了让别人看懂程序,是对程序的某个功能或者某行代码的解释说明,只在源文件内有效,不会被编译到字节码文件中。,Java,中的注释分为三种。,1.,单行注释,单行注释通常用于对某一行代码进行解释,用符号,”/”,表示,2.,多行注释,多行注释可以注释多行内容,以“,/*,“开始,”,*/,“结束。,3.,文档注释,文档注释是对一段代码概括性的解释说明,以“,/*,“开始,”,*/,“结束。,1.9,本章小结,简单介绍了,Java,语言的特点及三大体系,;,详细讲解了,JDK,的下载与安装及目录,;,详细地展示了使用记事本如何编写,Java,源文件,;,如果配置,path,变量以便在任意目录下能编译和运行源文件,;,讲解了,Java,程序的运行机制,;,讲解了,Java,程序的开发工具,IDEA,,详细展示了在,IDEA,中创建,Java,项目的过程。,第二章,Java,编程基础,本章学习要点,理解数据类型的概念;,理解常量、常量值和变量的概念;,掌握数据类型的自动转换和强制转换;,掌握各种运算符的运算规则;,掌握选择语句和循环语句的使用规则;,掌握数组的定义和使用;,掌握,foreach,语句的使用;,深刻理解类和对象的概念;,掌握类的定义、对象的创建和使用。,2.1,对象和类的概念,2.1.1,对象的概念,2.1.2,类的概念,2.1.1,对象的概念,所谓对象就是现实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的概念。,对象,的,特点,:,1.,对象具有唯一性,2.,对象具有属性和行为。,2.1.2,类的概念,类是对对象的抽象,是对某一类事物的共性描述,定义了一类事物共有的特征属性和功能行为。,对象和类有什么关系呢?,类是对某一类事物的抽象描述,而对象用于表示现实中该类事物的个体,每个对象都是独一无二的,对象也称为类的实例(,instance,)。类是对象的模板,通过该模板就能创建一个一个具体的对象。,2.2,类的定义和对象的创建,2.2.1,类的定义,2.2.2,对象的创建,2.2.3,对象的使用,2.2.1,类的定义,语法格式为:,类修饰符,class,类名,extends,超类名,implements,接口名列表,类体内容,其中,“,类修饰符,class,类名,extends,超类名,implements,接口名列表,”为类的声明部分,“,”为类体部分。,表示可选项,可以省略,2.2.1,类的定义,类的最简化的定义格式如下:,class,类名,成员变量,成员方法,2.2.1,类的定义,“猫”类的定义代码如下。,1 class Cat,2 String name;,3 void catchMouse(Mouse mouse),4 System.out.println(name+“,抓偷吃的,”+mouse.name);,5 ,6,2.2.2,对象的创建,Java,语言中,使用,new,关键字来创建对象,具体格式如下:,类名 对象名,=new,类名,();,用,Cat,类创建一个,cat,对象:,Cat cat=new Cat();,其中“,new Cat(),”用于创建,Cat,类的一个实例对象,“,Cat cat,”则是声明了一个,Cat,类型的引用变量,cat,。中间的等号用于将,Cat,对象在内存中的地址赋值给变量,cat,,这样变量,cat,便持有了对象的引用。,2.2.3,对象的使用,对象的使用原则是先创建后使用。,对象的使用是指对象引用类中的成员变量或方法。,Java,语言通过引用操作符“,.,”实现对象对成员变量或方法的引用,一般格式为:,对象名,.,成员变量名,对象名,.,成员方法名(,参数列表,),例如:,Cat,类的对象,cat,引用类的成员变量,name,和方法,catchMouse(),代码示例如下:,cat.name=”,花花,”,;,cat.catchMouse();,2.3,类的成员变量,2.3.1,数据类型,2.3.2,常量和常量值,2.3.3,变量,2.3.4,数据类型之间的转换,2.3.1,数据类型,数据类型的出现就是为了把数据分成所需内存大小不同的数据。,在,Java,语言中,不同的数据类型占据不同大小的内存空间,不同的数据类型的值表现形式也不一样。,什么是数据类型呢?,Java,中的数据类型规定了不同的数据在内存中所占的空间大小,分为基本的数据类型和引用数据类型。,基本数据类型共,8,种:,int,(整型)、,long,(长整型)、,short,(短整型)、,byte,(字节型)、,double,(双精度浮点型)、,float,(单精度浮点型)、,char,(字符型)和,boolean,(布尔型),,2.3.1,数据类型,引用的数据类型包括类、接口和数组,还有一种特殊的,null,类型。所谓引用就是对一个“对象”的引用。“对象”包括实例和数组两种。,null,类型就是,null,值的类型,这种类型没有名字,空引用(,null,)是,null,类型变量唯一的值。空引用可以转换为任何引用类型。但是空引用只能被转换为引用类型,不能转换成基本类型。,2.3.2,常量和常量值,1.,常量值 常量值又称为字面常量,它是通过数据直接表示的。根据不同的数据类型,常量值分为整型常量值、实型常量值、字符型常量值和布尔型常量值四种。,整型常量值:从数据的表现形式来看,整型常量值有十进制、八进制和十六进制三种表现形式,其中八进制的整型常量值是以,0,开头的,十六进制的整型常量值是以,0 x(,或,0X),开头的,如,10,、,017,、,0X9A,等。,从数据类型来看,整型常量值分为,int,、,short,、,long,和,byte,四种,长整型类型则要在数字后面加大写的英文字母,L,或小写的英文字母,l,,如,697L(,或,697l),整型常量值默认的是,int,类型的,如不具体指定,3,为,short,或者,byte,,默认,3,为,int,。,2.3.2,常量和常量值,实型常量值:从数据的表现形式来看,实型常量值就是带小数点的数据,如,3.14,、,2.50,等。实型常量默认在内存中占,64,位,是具有双精度型(,double,)的值。单精度型数值一般要在该数后面加,F,或,f,,如,69.7f,。,字符型常量值:从数据的表现形式看,字符型常量值是带一对单引号的,如,a,、,1,等。注意:,1,是字符型常量值,而,1,是整型常量值。,布尔型常量值:从数据的表现形式看,布尔型常量值只有,true,和,false,。,2.3.2,常量和常量值,常量。常量是指在程序的整个运行过程中值保持不变的量。常量不同于常量值,它可以在程序中用符号来代替常量值使用。常量的定义格式为:,final dataType constantName,在定义常量时,需要注意两点:,第一,在定义常量时就需要初始化,而且其值不允许再被更改。,第二,为了与变量区分,常量名一般都用大写字母。,2.3.3,变量,从字面意思上理解,常量的值一旦设置后就不能被修改的,而变量的值在程序运行期间可以被修改的。,从内存的角度理解,在程序运行期间,随时可能产生一些临时数据,应用程序会将这些数据保存到一些内存单元中,每个内存单元都有一个标识符来标识。这些内存单元被称为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值。,变量的声明格式为:,dataTyPe variableName,如:,int a;,2.3.4,数据类型之间的转换,数据类型之间的转换分为两种情况:自动类型转换和强制类型转换。,自动类型转换,指的是把常量值(或者具有值的变量)赋值给不同数据类型变量时,常量值(或者变量的值)会自动地转换成与变量相同数据类型的常量值。,要实现自动转换,必须同时满足两个条件,:,第一:两种数据类型彼此兼容,第二:目标类型的取值范围大于源类型的取值范围,,,Java,中基本数据类型的转换顺序为,byte,、,short,、,char,int,long,float,double,。,2.3.4,数据类型之间的转换,当两种类型彼此不兼容,或者目标类型取值范围小于源类型时,自动类型转换无法进行,这就需要进行强制类型转化。一般格式为:,目标数据类型 变量,=,(目标类型)值,其中()为强制类型转换符,作用是将值强制转换为目标数据类型的值。如,int num=4;,byte b=num;,2.4,类的成员方法,2.4.1 Java,中的各种运算符,2.4.2 Java,中顺序结构的语句,2.4.3 Java,中的选择语句,2.4.4 Java,中的循环语句,2.4.5,数组和,foreach,语句,2.4.1 Java,中的各种运算符,从类的定义看出,类包含特征和行为,其中行为也称为类的成员方法,是用函数来定义的。函数就是完成一个个功能的代码块,而完成功能就离不开运算符和语句。,1.,算术运算符,:,对各种整数或浮点数等数值进行运算操作的符号,2.,关系运算符,:,关系运算符中“关系”二字的含义是指一个数据与另一个数据之间的关系,这种关系只有成立与不成立两种可能情况,用逻辑值,true,或,false,来表示。,3.,逻辑运算符,:,逻辑运算符的操作数只能是,true,或者,false,,判断的结果是,true,或,false,。,4.,赋值运算符,:,指为变量或常量指定数值的符号,左边的操作数必须是变量,不能是常量或表达式,。,5.,运算符的优先级,2.4.2 Java,中顺序结构的语句,若是在程序中没有给出特别的执行目标,系统则默认自上而下一行一行地执行该程序,这类程序的结构就称为顺序结构。顺序结构中的语句分为表达式语句、空语句和复合语句,3,大类。,1.,表达式语句,由各种运算符和操作数连接成的式子称为表达式,在表达式的后面加“;”就构成了表达式语句,如,2+3*1,;,2.,空语句,空语句就是一个“;”,它在程序中什么也不做,也不包含具有实际性的语句。,3.,复合语句,复合语句又称为语句块,用一对花括号表示,花括号内可以包含很多条语句。,2.4.3 Java,中的选择语句,选择语句适合于带有逻辑或关系比较等条件判断的计算。,Java,中提供了两种选择语句:,if,语句和,switch,语句。其中,if,语句又分为,if,语句、,ifelse,语句、,ifelse ifelse,语句及嵌套语句。,1.if,语句,if,语句是指如果满足某种条件,就进行某种处理。语法如下:,if(,条件表达式,),代码块,2.4.3 Java,中的选择语句,2.ifelse,语句,ifelse,语句是指“如果,XXX,成立”,就要,“,否则,”,就要,.,语法如下,:,if(,条件表达式,),代码块,1,else,代码块,2,2.4.3 Java,中的选择语句,3.ifelse ifelse,语句,:,这是一条多条件判断语句,适用于条件较多的情况下。语法如下:,if(,条件表达式,1),代码块,1,else if(,条件表达式,2),代码块,2,else if(,条件表达式,n),代码块,n,else,代码块,n+1,2.4.3 Java,中的选择语句,4.switch,语句,switch,语句也是多条件判断语句,与,ifelse ifelse,语句等价。语法如下:,switch(,变量或表达式,),case,整数(或字符、或字符串):代码块,1,case,整数(或字符、或字符串):代码块,2,default:,代码块,n,2.4.4 Java,中的循环语句,Java,中的循环语句主要有,while,、,do,while,、,for,。,1.for,语句,for,语句是一种在程序执行前就要先判断条件表达式是否为真的循环语句。假如条件表达式的结果为假,那么它的循环语句根本不会执行。,for,语句通常使用在知道循环次数的循环中。,for,语句语法格式如下所示:,for(,条件表达式,1;,条件表达式,2;,条件表达式,3),代码块,;,2.4.4 Java,中的循环语句,while,循环语句可以在一定条件下重复执行代码。该语句需要判断一个测试条件,如果该条件为真,则执行循环语句(循环语句可以是一条或多条),否则跳出循环。,while,循环语句的语法结构如下:,while(,条件表达式,),语句块,;,2.4.4 Java,中的循环语句,3.dowhile,语句,do,while,循环语句由循环条件和循环体组成,但它与,while,语句略有不同。,do,while,循环语句的特点是先执行循环体,然后判断循环条件是否成立。,do,while,语句的语法格式如下:,do,语句块,;,while(,条件表达式,);,2.4.5,数组和,foreach,语句,数组可以看成是多个具有相同数据类型的数据的集合,这些数据称为数组元素,数组元素之间有先后顺序。一个数组元素可以用数组名和这个元素在数组中的顺序位置来表示,顺序位置是从,0,开始的。如,a0,代表数组,a,中的第,1,个元素,其中,0,就是数组元素在数组中的位置。,1.,定义数组:,Java,语言支持两种格式定义数组。,type arrayName;,type arrayName;,2.4.5,数组和,foreach,语句,2.,数组的初始化,所谓初始化,就是为数组的数组元素分配内存空间,并为每个数组元素赋初始值。数组的初始化有两种方式:静态初始化和动态初始化。,静态初始化:初始化是由程序员显示指定每个数组元素的初始值,由系统决定数组长度,如,int a=new int1,2,3,4,5,。或者采用简写的形式,int a=1,2,3,4,5,。,动态初始化:只指定数组的长度,如,int a=new int5;,由系统为每个数组元素指定初始值。,2.4.5,数组和,foreach,语句,3.,遍历数组元素,数组最常见的用法就是访问数组元素,包括对数组元素进行赋值和取出数组元素的值。访问数组元素的格式为:数组名,数组元素下标,。,遍历数组元素通常用循环语句,和,foreach,语句。,2.4.5,数组和,foreach,语句,foreach,语句,在遍历数组、集合方面,,foreach,语句为开发者提供了极大的方便。,foreach,循环语句是,for,语句的特殊简化版本,主要用于执行遍历功能的循环。,foreach,循环语句的语法格式如下:,for(,类型 变量名,:,集合,),语句块,;,2.5,本章小结,引入了对象和类的概念,深入讲解了什么是对象,什么是类,对象和类的关系,如何定义类,如何用类创建对象,如何使用对象。,由类的类体中包含成员变量和成员方法两部分,引出了类的成员变量和类的成员方法两节,重点讲解了,Java,中的各种数据类型和选择、循环语句。,第三章,面向对象程序设计(上),本章学习要点,理解类体中变量的分类;,掌握静态变量和实例变量的区别;,掌握成员变量和局部变量的区别;,掌握静态方法和实例方法的区别;,掌握,this,关键字的使用;,掌握,static,关键字的使用;,理解包的概念;,掌握构造方法的创建;,理解构造方法的作用;,理解方法重载的概念;,掌握访问权限修饰符的使用规则。,3.1,类体中的变量,3.1.1,成员变量,3.1.2,局部变量,3.1.1,成员变量,根据定义的位置不同,类体中的变量分为成员变量和局部变量两种。定义在类体中的变量称为成员变量,而定义在方法体内的变量称为局部变量。,成员变量是在类体中定义的变量,也称为全局变量。根据成员变量的类型前面是否有,static,关键字,将成员变量分为静态变量和实例变量两种。,1.,静态变量:又称类变量,数据类型前面有,static,修饰。,static,的英文含义就是“静态的”,因此当成员变量的数据类型前面有,static,修饰时,称此时的成员变量为静态成员变量,也称为类变量。,3.1.1,成员变量,2.,实例变量,成员变量的数据类型前面有,static,修饰时,称为静态的成员变量,简称静态变量。那么,当成员变量的数据类型前面没有,static,修饰时,就称为实例变量。,静态变量和实例变量的区别如下:,1.,静态变量的数据类型前面有,static,,而实例变量的数据类型前面没有,static,。,2.,静态变量的引用形式有两种:“类名,.,变量名”或者“对象名,.,变量名”。实例变量的引用形式只有“对象名,.,变量名”。,3.,静态变量是在类加载时,就会被分配内存空间,并且该类的所有实例的静态变量共享一块内存空间。而实例变量是在创建对象的时候才会被分配内存空间,而所有对象的实例变量占有不同的内存空间。,4.,静态变量和类共存亡,而实例变量和实例共存亡。,3.1.2,局部变量,根据定义的位置不同,类体中的变量分为成员变量和局部变量两种。定义在类体中的变量称为成员变量,而定义在方法体内的变量称为局部变量。,成员变量和局部变量的共同之处:,1.,成员变量和局部变量的类型都可以是,Java,中的任何一种数据类型。,2.,成员变量和局部变量的名字都必须符合标识符规定,名字如果使用拉丁字母,建议首写字母小写;如果变量由多个单词组成,从第,2,个单词开始每个单词的首写字母使用大写。,3.1.2,局部变量,成员变量和局部变量的区别:,1.,成员变量定义在类体内部,作用范围是整个类,局部变量定义在方法体内部,只在定义它的方法体内有效,在方法外部不能被识别。,2.,成员变量没有初始化时,系统会分配默认值,而局部变量必须初始化。,3.,变量的作用域就是变量的有效范围,局部变量的作用域是它所在的方法或语句块,而成员变量作用域是整个类体。,3.2,类体中的方法,3.2.1,静态方法和实例方法,3.2.2,构造方法,3.2.3,方法重载,3.2.1,静态方法和实例方法,当类体中的方法其方法类型前面有,static,修饰时,该方法称为静态方法或者类方法。当类体中的方法其方法类型前面没有,static,修饰时,该方法称为实例方法。,静态方法的特点:第一,静态方法中只能使用静态成员,而不能使用非静态成员,静态成员包括静态变量和静态方法,非静态成员包括实例变量和实例方法。第二,静态方法的引用方式有两种:“类名,.,方法名”或者“对象名,.,方法名”。,实例方法的特点:第一,实例方法中即可以使用非静态成员,也可以使用静态成员。第二,实例方法的引用方式只有一种:“对象名,.,方法名”。,3.2.2,构造方法,对象的创建是“,new,类名,(),”。其中“类名,(),”从表面上看是一个方法,而且是一个无参方法。其中“类名”是方法名,这个方法有个名字叫“构造方法”。,构造方法是特殊的方法,它特殊在什么地方呢?,1.,每个类中都会有构造方法。,2.,构造方法的方法名必须和类名一致,包括大小写规则,3.,构造方法只能由,new,运算符调用,4.,构造方法的作用就是用来创建对象的,也就说构造方法只有在创建对象的时候才会被调用。,5.,构造方法前面可以带有访问权限修饰符,如,public,、,private,。,6.,不允许有方法的返回值类型,也不能有空返回值数据类型,void,,所以构造方法内部严禁使用,return,关键字。,3.2.3,方法重载,方法重载是指在一个类中用同一个名字定义多个方法。方法的声明部分相同,方法的参数和方法体不同。参数不同包括参数的个数和参数的类型不同,不包括顺序不同。,3.3 this,关键字,3.3.1,在构造方法中使用,this,3.3.2,在实例方法中使用,this,3.3.1,在构造方法中使用,this,this,关键字代表当前类的当前对象本身,更准确地说,,this,代表了当前对象的一个引用。,this,可以出现在构造方法、实例方法中,但不能出现在静态方法中。,带参数的构造方法通常用来给成员变量初始化,为了避免起名字的麻烦,通常有参构造方法中的形参参数名和成员变量名相同。那么此时,当把形参赋值给成员变量时,成员变量前面就需要使用,this,,此处的,this,代表当前类的当前对象。,3.3.2,在实例方法中使用,this,除了构造方法中可以使用,this,之外,在实例方法中也可以使用,this,,代表正在调用当前方法的对象。,3.4,包,3.4.1,包的概念,3.4.2 import,语句,3.4.3,访问控制符,3.4.1,包的概念,“包机制”就是通过不同的包名为类提供多重的命名空间,有了包之后,“包名,+,类名”才是类的完整名字,或者叫做全类名。,由于域名的唯一性,“域名倒置”的包名也具有唯一性,“包名,+,类名”定义的全类名也就具有了唯一性,这就使得任何的,Java,类的全称都是唯一的,这就避免了类名重复的冲突。,命名包的关键是,package,,示例代码如下:,1 package com.a;2 public class Student 3,3.4.2 import,语句,在引入了包的概念之后,如果想在一个类中使用另一个类,就必须导入另一个类所在的包。导包需要使用,import,关键字。包分为自定义的包和系统自带的包。,3.4.3,访问控制符,访问控制符是一组限定类、属性或方法是否可以被程序里的其他部分访问和调用的修饰符。,Java,语言中的访问控制符分为两类:一类是用来修饰类的,一类是用来修饰成员变量和成员方法的。,3.4.3,访问控制符,修饰类的访问控制符有两种:公共的,public,和缺省的,default,。,如果定义类的同时在,class,前面加上了,public,,则这个类的访问权限就是公共的,即此类可以被所有类访问到。,如果定义类的同时,class,前面什么都不写,,class,前面默认添加,default,访问权限修饰符,注意,,default,不能显示地写出来,被,default,修饰的类只能被和自己在同一个包中的类访问。,3.4.3,访问控制符,修饰成员变量和成员方法的访问控制符有,4,种,按照访问权限范围从小到大排列,分别是:私有的(,private,)、缺省的(,default,)、受保护的(,protected,)、公共的(,public,)。,用,private,修饰的成员称为私有成员,一个类的私有成员只能在这个类的内部访问,其他的类无法访问这个类的私有成员。,没有访问权限控制符修饰的成员称为缺省成员,一个类的缺省成员除了可以在这个类的内部访问之外,还可以被同一个包中的其他类访问。,用,protected,修饰的成员称为受保护成员,一个类的受保护成员除了可以在这个类的内部访问,可以被同一个包中的其他类访问之外,还可以被这个类的子类访问。,用,public,修饰的成员称为公共成员,一个类的公共成员没有访问限制,可以被任意类访问。,3.5,本章小结,3.1,节详细讲解了类中变量的分类,;3.2,节详细讲解了类中方法的分类,;this,关键字也是经常使用的,代表当前类的当前对象,;,为了避免类重名的冲突,引入了包机制,;,为了限制类与类之间的引用,引入了访问控制符的概念。,第四章,面向对象程序设计(上),本章学习要点,理解继承的概念;,掌握继承中构造方法的调用顺序;,理解方法重写的概念;,理解上转型的概念;,理解多态的概念;,理解抽象类和接口的区别;,掌握抽象方法的写法;,掌握,final,关键字修饰的变量、方法和类的特点;,理解内部类的概念;,掌握匿名内部类的使用;,掌握上转型对象的特点。,4.1,类的继承,4.1.1,“子类”和“父类”,4.1.2,继承中构造方法的调用,4.1.3,继承中成员变量的隐藏,4.1.4,继承中成员方法的重写,4.1.5,继承中的上转型,4.1.6,继承中的多态,4.1.1,“子类”和“父类”,class A extends B,其中,A,为子类,,B,为父类或者超类或者基类,继承就是为了避免多个类间重复定义共同的属性和行为。,子类可以继承父类的一切非私有的成员,构造方法除外。,子类除了继承父类的非私有成员外,还可以有自己的什么呢?可以有不同于父类的属性和行为。,4.1.1,“子类”和“父类”,Java,中类的继承是“单继承”,即只允许一个类直接继承另一个类,也就是,extends,关键字后面只能有一个类名。例如:,class Student extends Person,Person1,Person2,会导致编译错误。,尽管一个类只能有一个直接的父类,但是它可以有多个间接的父类。例如:,Student,类继承,Person,类,,Person,类继承,Person1,类,,Person1,类继承,Person2,类,那么,Person1,和,Person2,类是,Student,类的间接父类。,4.1.2,继承中构造方法的调用,子类可以继承父类中的非私有成员,也就是不能继承父类中的私有成员,同时,子类也不能继承父类中的构造方法。,子类既然不能继承父类的构造方法,那么子类是如何调用父类的构造方法呢?就是通过“,super();,”这条语句,而且这条语句可以省略。但是如果把“,super();,”这条语句写出来,它一定要在第一条的位置,否则会编译出错。,“,super();,”这条语句的作用就是调用父类中无参数的构造方法,所以当父类中没有无参构造时,子类中的构造方法中第一条语句必须显示地用,super,调用父类中有参数的构造方法,否则编译会出错。,4.1.3,继承中成员变量的隐藏,如果子类继承于某个父类,当子类中声明的成员变量和父类中声明的成员变量重名时,子类就隐藏了继承到的成员变量。,那么,子类如何操作父类中被隐藏的成员变量呢?有两种方法:第一,在子类中使用,super,关键字调用父类中被子类隐藏的成员变量。第二,子类通过调用从父类继承的方法来操作隐藏的成员变量。,Cat,类中的第,5,行和第,9,行代码,通过,super.,来调用父类,Animal,中被隐藏的成员变量,name,。,4.1.4,继承中成员方法的重写,在子类中如果创建了一个方法与父类中的某个方法具有相同的名称、相同的返回值类型、相同的参数列表,只是方法体中的实现不同,以实现不同于父类的功能。这种方式被称为方法重写,又称为方法覆盖。,在重写方法时,需要遵循以下规则:,1.,参数列表必须完全与被重写的方法参数列表相同,否则不能称其为重写。,2.,返回的类型必须与被重写的方法的返回类型相同,否则不能称其为重写。,3.,访问修饰符的限制一定要不小于被重写方法的访问修饰符,否则不能称其为重写。,4.,重写方法一定不能抛出新的检査异常或者比被重写方法声明更加宽泛的检査型异常。,4.1.5,继承中的上转型,对象的类型转换往往发生在具有继承关系的父类和子类之间,向上类型转换是将子类对象转为父类对象。如果,A,是,B,的父类,当把子类对象赋值给父类对象的引用时,称父类的引用是子类对象的上转型对象。例如:,A a,;,a=new B();,或者:,A a=new B();,其中,new B(),是子类,B,的一个对象,而,a,为父类,A,的一个引用变量,,a=new B(),这条语句使得父类的引用,a,指向了子类对象,new B(),,此时,a,就叫做,new B(),的上转型对象。,4.1.5,继承中的上转型,上转型对象有三个特点:,1.,当子类重写了一个方法后,上转型对象调用方法时,调用的必须是经过重写后的方法。,2.,当子类继承或隐藏了某个成员变量或方法,此时上转型对象可以访问。,3.,上转型对象不能操作子类新增的成员变量,也不能操作子类新增的方法。,在上转型的三个特点中,最常用的就是第,1,条,。,4.1.6,继承中的多态,Java,实现多态有,3,个必要条件:继承、重写和向上转型。,4.2,抽象类,4.2.1,抽象方法,4.2.2,抽象类,4.2.1,抽象方法,用,abstract,修饰的方法称为抽象方法,抽象方法一般位于父类中,而且要被子类继承。,声明抽象方法的一般格式如下:,方法修饰符,abstract,方法返回值类型,方法名,(,参数列表,);,抽象方法是在类中仅仅有声明部分,并没有实现方法体。,构造方法、静态方法、私有方法不能被声明为抽象的方法。,4.2.2,抽象类,用关键字,abstract,修饰的类称为抽象类。抽象类的作用类似于“模板”,通常先给出属性或方法的格式,然后根据这些格式来派生出新的子类,再由其子类来创建对象。,定义抽象类的一般格式如下:,类修饰符,abstract class,类名,声明成员变量,声明抽象方法,/,此处不能有方法体,定义一般方法,/,此处可以包含方法体,4.2.2,抽象类,有关抽象类说明如下:,1.,抽象类只能声明对象,而不能创建具体对象即不能被实例化。,2.,在抽象类中,可以包含抽象方法,也可以包含非抽象方法,也可以不包含抽象方法。,3.,包含抽象方法的类一定是抽象类。,4.,如果一个类是某个抽象类的子类,那么该子类既可以抽象类,也可以是非抽象类。,5.,当抽象类的子类是非抽象类时,必须重写父类中所有的抽象方法。,4.3,接口,4.3.1,接口的定义,4.3.2,接口的实现,4.3.3,接口与抽象类,4.3.4,接口的回调,4.3.5,内部类,4.3.6,匿名内部类,4.3.1,接口的定义,接口的定义包括接口声明和接口体两部分。接口定义的格式如下:,接口修饰符,interface,接口名称,extends,父接口名,接口体,4.3.1,接口的定义,对接口定义说明如下:,1.,接口中全部的数据都是常量,用,public final,修饰。其中,final,关键字可以修饰类中的成员变量、成员方法,甚至可以修饰类。用,final,修饰的成员变量是最终变量,即为常量。程序中的其他部分可以调用该变量,但不能修改该变量的值。用,final,修饰的成员方法是最终方法,该方法不能被子类重写,只能被调用。用,final,修饰的类是最终类,最终类不能被继承,即没有子类。,2.,全部的方法都是抽象方法
展开阅读全文