《Java语言程序设计 教学课件 ppt 作者 于红 第4章__Java面向对象程序设计》由会员分享,可在线阅读,更多相关《Java语言程序设计 教学课件 ppt 作者 于红 第4章__Java面向对象程序设计(65页珍藏版)》请在金锄头文库上搜索。
1、第四章 Java面向对象程序设计,4.1 类与对象,4.1.1类的定义 1.格式 class extends implements /类头 /类体的内容 ,2.类头 (1)修饰符:用来说明类的访问权限,可以为public 、abstract或final等。默认为public。关于每个关键字的具体含义将在后面几节中陆续介绍。 (2)class:类标识符,在类定义中必须包含该关键字。 (3)类名:类名必须是合法的Java标识符,类的命名要符合2.1.6节的命名规范。,(4)extends选项:用来定义子类。关于该选项的使用将在4.2节详细阐述。 (5)implements选项:用来实现接口。关于该
2、选项的使用将在4.6.2节详细阐述。,3.类体: 类体对该类的属性及行为进行详细阐述,其中包括成员变量和成员方法两部分。成员变量用来描述类的属性,可以是整型、浮点型、字符型等基本数据类型,也可以是引用类型。成员方法用来描述类的行为。,4.Java中的变量 (1)成员变量:在类内定义的实例变量,用于描述对象的属性。其生命周期随着对象创建而开始,随着对象的消亡而消亡。 (2)局部变量:在类的成员方法中定义的局部变量,主要包括方法体内定义的变量和方法的形参。其生命周期随着方法的调用而存在,方法的调用结束而消亡。,4.1.2 方法 1.方法定义格式 (参数列表)throws /方法体 2.说明 (1)
3、方法修饰符:主要有public、private、protected、final、static、abstract、synchronized。每个修饰符的含义都会在后续章节中详细阐述。,(2)方法返回值类型:java方法定义中必须指定方法返回值类型,返回值类型可以是任何一种Java数据类型,包括基本数据类型和引用类型。如果成员方法不需要返回值,则将该方法的返回值定义为void,此时关键字void不能省略。 (3)方法名:必须是合法的Java标识符,方法名要符合2.1.6节的命名规范。 (4)参数列表:成员方法可以没有参数,没有参数时方法名后面跟一对括号。如果方法有参数,参数放在括号内,如果有多个参
4、数,各参数之间用逗号分隔。方法的参数可以与成员变量同名,但是不能与该方法体内的局部变量同名。,(5)throws:用于异常处理,这部分将在第7章详细阐述。 (6)方法体是方法的主要部分,用于实现方法的业务逻辑,也就是定义该方法要完成的动作。由于方法定义中必须指定返回值类型,因此方法体中必须指定返回值,返回值用return语句指定,如果方法返回值类型不是void,则return语句必须带参数,而且参数类型必须与方法的返回值类型一致。,3.方法参数 (1)形参:在方法定义语句的参数列表中列出的参数 (2)实参:在方法调用时在参数列表中列出的参数 (3)形参在定义时是没有具体值的。 (4)实参在引用
5、时必须有确定的值。 (5)形参和实参个数和类型必须一一对应。 4.方法重载: 方法名相同,而参数不同的用法称为方法的重载。这里的参数不同既可以是参数的个数不同,也可以是参数的类型不同。参数变量名不同或方法的返回类型不同,均不作为区分重载的基准。,4.1.3构造方法与对象创建 1.构造方法 (1)构造方法的作用:用于对成员变量进行初始化。 (2)构造函数的使用方法。 1)构造方法的方法名必须与类名相同。 2)构造方法不具备返回值类型。 3)构造方法中可以定义参数。 4)构造方法的方法体中不能使用return语句。 5)不能被显式调用,必须在用new创建对象时自动调用。,2.创建对象 (1)声明对
6、象的同时创建对象,一般格式为: =new (参数列表); 声明 实例化 初始化 (2)声明对象与创建对象用不同语句完成,一般格式为: ; /对象声明 =new (参数列表); /对象实例化,3.使用对象 对象创建好之后,就是如何使用的问题。Java中通过运算符“.”实现对对象的成员变量访问和成员方法调用。 4.参数传递问题 (1)基本数据类型参数的传值:传递给形参的是调用者实参值的拷贝。当改变形参时,实参的值不会被改变。,(2)引用类型参数的传值:传给形参的是调用者实参值的拷贝,实参为引用类型,传递给形参的是实参引用的内存地址。此时改变形参所引用的地址空间中成员变量的值会改变实参的值,但是如果
7、在方法体中给形参赋值,相当于让形参所对应的引用指向新的地址空间,在此后对形参所引用的地址空间中成员变量所作的修改不会影响实参所对应的对象,即:实参的值不会被改变。,4.1.4访问权限 1包 包声明语句格式: package 说明: (1) 包的名字,可以是任何合法的Java标识符,或若干标识符用“.”分隔开。 (2) 包的声明要在源文件的首行,也就是声明之前不能有任何语句,该源文件中的类都属于这个包,其中最多只能有一个public类,这些类一般都有一定的内在关系,比如共同完成一个功能。例如:定义一个名字为com的包。,2访问权限 类在声明成员变量和方法时,可以用关键字public,protec
8、ted和private来说明成员变量和方法的访问权限,使得对象在不同情况下访问成员变量和成员方法受到一定的限制。Java中,成员的访问权限要分别指定。,(1)public成员 1)Java提供的系统方法都具有public属性。 2)应用程序的main()方法必须是public。 3)类的所有public成员都将被子类继承。,(2)private成员 1)私有实例变量可被所属类中的方法使用,但不能被其他任何类的对象使用。 2)私有方法可以被所属类中的其他方法调用,但是不能被其他类的方法调用。 3)任何私有成员都不能被继承。 (3)友好成员 1)友好变量:同一个包中的其他任何类都可以读取或修改它。
9、 2)友好方法:同一个包中的其他任何类都可以调用它。,(4)protected成员 用protected修饰的成员变量和方法被称为受保护的成员变量和受保护的方法,保护成员在不涉及到继承的时候,属于包内友好,与友好成员一样,对象在包内才可以访问这种成员。修饰的成员只能够被子类和同一个包中的其他类访问。,3Import import用于导入其他包中的类:可以是Java类库中的类也可以是程序员自己定义的类。当在一个包中使用其他包中的类时,需要将其他包中的类用import导入。,4.2 继承,4.2.1 继承的定义 :继承是面向对象语言除封装性之外的又一个重要特点,是一种由已有的类派生出新类的机制,已
10、有的类被称为父类或基类,新类被称为子类或派生类。子类继承父类的部分属性和行为,并根据需要增加新的属性和行为,即:能继承父类的成员变量和方法,也可以新增子类的成员变量和方法。 注:Java不支持多重继承,单继承使JAVA的继承关系很简单,一个类只能有一个父类,易于管理程序,同时也带来了弊端。,4.2.2 子类对象构造过程 当用子类创建一个新的对象时,子类的对象从父类继承了一部分成员,还有自己新增的成员,所以在构造子类的对象时,一定先构造从父类继承的成员,然后再构造新增成员。也就是调用子类构造方法之前要先调用父类的构造方法,这也是构造子类对象前先构造父类对象的原因。,4.2.3 访问控制 在继承时
11、,子类对父类中不同权限的成员有不同的继承方式,根据子类和父类是否在同一个包中这两种情况分别说明。 (1)如果子类和父类在同一个包中,子类继承父类中除private类型的成员外的三种成员作为自己的成员,包括成员变量和成员方法。继承来的成员的访问权限保持不变。 (2)如果子类和父类在不同包中,子类继承了父类的protected、public成员作为子类的成员。继承来的成员的访问权限保持不变。,可以看出,Java的访问权限控制机制比较简单。继承中的访问权限控制与4.1节中的访问权限控制的区别主要在于protected类型,无论子类与父类是否在同一个包中,protected类型的成员都可以派生到子类中
12、,其他类型的成员的访问权限控制相同。,4.2.4变量隐藏和方法覆盖 1变量隐藏: 子类继承父类时,子类中可以声明与父类中成员变量同名的子类成员变量,此时父类的同名变量被隐藏。 2方法覆盖: 子类的成员变量可以隐藏父类的成员变量,同样,子类的成员方法也可以与父类的成员方法同名,如果子类的成员方法声明与父类完全相同,称为方法覆盖,也叫方法重写。方法重写要求方法的返回类型、名称、参数个数和类型与父类的同名方法完全相同,并且,重写的方法的访问权限不能被降低。,4.2.5 多态 Java中的多态性分两种:编译期多态和执行期多态,方法重载属于编译期多态,方法重写属于执行期多态。,4.3 特殊修饰控制符,4
13、.3.1 static 1.类变量 在类定义中,没用static修饰的成员变量叫实例变量。实例变量隶属于某个具体的对象,使用时必须用对象名进行约束。用static修饰的成员变量叫类变量,类变量隶属于类,使用时可以用对象名进行约束,也可以直接用类名进行约束。,2.类方法 在类定义中,没用static修饰的成员方法叫实例方法,用static修饰的成员方法叫类方法。实例方法的使用依赖于对象,类方法的使用依赖于类。 在类被加载到内存时,系统不会为实例方法分配入口地址,这是因为实例方法的调用依赖于对象,没有对象,即使分配入口地址也没有任何意义。当创建该类的第一个对象时,为该类的实例方法分配入口地址,此时
14、可以通过对象调用实例方法,如果该对象没有被销毁,再创建其他对象时,不需要为实例方法分配入口地址,所有的对象公用同一个入口地址,当所有对象都销毁之后,方法的入口地址被收回。,在类被加载到内存时,系统会同时为类方法分配入口地址。类方法可以通过对象调用,也可以直接通过类名调用,类方法的入口地址在程序运行结束时才会被收回。,4.3.2 final final作为Java的控制修饰符可以分别用来修饰变量、修饰方法、修饰类。 1final变量 用final修饰的变量必须在使用之前赋初始值,在程序中不能修改final变量的值。 (1)final变量的类型 final变量有两种类型:,1)编译期final变量
15、 在定义final变量时直接给变量赋初始值,编译的时候,程序中其他地方出现的该标识符由所赋的初值代替。例如: final int DormCount=10; 定义DormCount为10,编译时,程序的其他地方出现的DormCount均用10来代替。,2)执行期final变量 Java中允许在定义final变量的时候不给出初值,而是在执行期给final变量赋初值。如果在定义final变量时使用表达式赋初值或在构造方法中赋初始值,这种final变量在被分配内存空间时赋初值,赋初值之后其值不能被改变。 例如:,public class Dorm int final r=(int)(10*Math.
16、random(); final int DormSize; Dorm() DormSize=8; 与上面定义的DormCount不同,类Dorm中的final变量r和DormSize在Dorm类的不同对象中可以有不同的值,但是在同一个对象中该final变量的值保持不变。,(2)static final变量 显然上面的思考题的结果是每个对象有一个DormSize,因此两个对象有2个DormSize,那么是否可能让内存中只有一个DormSize呢? 如果用static修饰final变量,那么这个final变量在内存中只有一份。关于static final变量,有以下两点需要说明: 1)static final变量不能在构造方法中赋值,必须在定义的同时赋值。 2)编程习惯把这种编译期final变量名称用大写字母,如果多个单词,用“_”分隔。,(3)引用类型的final变量 前面例子中用final修饰的都是基本数据类型变量,用final修饰引用