第4章面向对象基础_第1页
第4章面向对象基础_第2页
第4章面向对象基础_第3页
第4章面向对象基础_第4页
第4章面向对象基础_第5页
已阅读5页,还剩104页未读 继续免费阅读

下载本文档

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

文档简介

第四章

面向对象基础朱海波副教授1主要内容:

1.面向对象基本概念2.Java的类与对象3.成员变量与封装4.成员方法2

理解面向对象编程的基本概念了解类的封装方法如何创建类和对象了解成员变量和成员方法的特性学习使用OOP方式进行程序设计

教学目的和要求:3重点与难点重点:类和对象的概念,及实际应用难点: 类的设计4

4.1面向对象的基本概念4.2类4.3对象4.4方法4.5访问控制修饰符4.6静态修饰符、静态字段和方法4.7抽象类与抽象方法4.8最终类、最终属性、最终方法与终结器本章小结目录54.1面向对象概念1、对象2、对象的封装3、类和实例4、消息5、继承6、对象之间的关系61、对象对象

(object):面向对象技术的核心。我们可以把我们所生活的真实世界(RealWorld)看成是由许多大小不同的对象所组成的。对象可以是有生命的个体,比如一个人或一只鸟。7对象对象也可以是无生命的个体,比如一辆汽车或一台计算机。8对象对象还可以是一件抽象的概念,如天气的变化或者鼠标所产生的事件,或者是一个自然数。1239对象的属性和行为环顾周围的世界,任何地方都可以看到对象,例如:人、狗、汽车、计算机、桌子、椅子等等。不管是有生命的对象还是无生命的对象,它们都有一些共同的特征:属性和行为。10对象的属性和行为例如,人有姓名、年龄、身高、职业等属性,有工作、吃饭、运动等行为。而汽车有形状、颜色、品牌等属性,有启动、加速、刹车、转弯等行为。11软件对象软件对象:现实世界中的对象在计算机中的抽象表示,即仿照现实对象而建立的。软件对象也有状态和行为,软件对象用变量表示对象的状态、用方法来实现对象的行为。一个软件对象就是变量和相关方法的集合。软件对象=变量+方法12软件对象的特性对象名:唯一标识,区别于其它对象的标志,例如car;变量:对象所处的状态,例如汽车行驶的速度;方法:通过改变对象的状态,来实现对象的行为,例如通过加速这个方法来改变汽车的速度;接口:与外界通信的通道。注意:今后,在不引起歧义的情况下,我们把软件对象简称为对象。13对象和实体的关系对象是对现实世界中实体的抽象Why?实体太复杂啦!How?取其关心的部分!What?对象是抽象的,对象是部分的!人抽象

142、对象的封装一个对象的变量(状态)构成这个对象的核心,一般不将其对外公布,而是将对变量进行操作的方法对外公开,这样变量就被隐藏起来。这种将对象的变量置于方法的保护之下的方式称为封装。变量方法外部访问152、对象的封装例如:可以把汽车抽象成一个对象,用变量表示它当前的状态,如速度、油量、所处的位置等,它的行为则可以有加速、刹车、换档等。我们在驾驶汽车时,只需要知道如何操作相应的方法就可以了,不用考虑汽车内部是如何实现诸如提速、刹车等行为。16封装将对象的私有数据隐藏起来,其他对象不能直接访问这些私有数据,必须通过调用该对象的相关方法来间接访问。私有数据

方法

方法数据对象A对象B公有数据17对象封装的好处通过将对象进行封装,能把对别的对象来说并不重要的对象的实现细节隐蔽起来,从而在使用一个对象时,只需知道调用它的方法而无需知道该方法是如何实现的。(1)模块化:一个对象的源代码的编写和维护独立于其他对象的源代码,而且,对象的使用也很方便;(2)信息隐蔽:每个对象都有一个公共接口使得其他对象可以与其通信,但对象的私有信息和方法则由它自己维护,并且改变这些私有信息和方法不会影响到使用它的其他对象。183、类在现实世界里,有许多同“种类”的对象。而这些同“种类”的对象可被归类为一个“类”。例如,我们可将世界上所有的动物归为动物类,所有的汽车归类为汽车类。动物类汽车类19对象与类classTaxi{intcolor;intdoor_number;

intspeed;

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

类抽象软件对象归类现实生活中的对象20类的概念类是对多个具有相似行为的对象的一种抽象,描述了属于该类型的所有对象的性质,即类定义了所有某种类型的对象的共有的变量和方法。在面向对象的程序设计中,类是程序的基本单元。Athlete21类与实例

(instance)汽车类有些共同的状态(汽缸排气量、排档数、颜色、轮胎数……)和行为(换档、开灯、刹车……),但每一台汽车有个别的状态和方法可以不同于其他汽车。你的汽车只是这世界中许多汽车中的一个。我们就称你的汽车对象是汽车类中的一个实例(instance)。汽车类(class)实例(instance)new你的车22对象和类的关系类是同类对象的集合和抽象{学生A、学生B……}学生类对象是类的一个实例化学生类学生A234、消息(message)单独一个对象一般没有什么用处,在大的应用程序中通常包括许多对象,并通过这些对象之间的交互来完成一个复杂的功能。例如在多媒体教室教学活动中,包括教师对象、学生对象、计算机对象、投影仪对象、扩音器对象以及桌子等对象,通过这些对象之间的交互才能顺利完成我们的教学活动。24通过各个对象之间的交互,程序就可以实现更高级的功能以及更复杂的行为。软件对象是通过相互间传递消息来实现交互的。对象B对象Amessage25当对象A想让对象B执行某项任务时,对象A就向对象B传递消息。有时,接受消息的对象需要了解更多的信息,以明确它该做什么,这时就需要传递一些参数。例如,要使汽车加速,必须发给它一个消息,告诉它做何种动作(即加速),以及实现这个动作所需的参数(即需要达到的速度等)。发送消息的实质就是要调用接受消息的对象的方法,所以发送消息可分为三个步骤:(1)确定接受消息的对象;(2)确定调用对象的哪个方法;(3)传递此方法所需要的参数。26

一个消息由3个元素所组成:1.消息目标对象(你的汽车)。2.执行方法的名字(换档)。3.执行方法所需用的参数(parameters)(低、高速档)。消息的好处

1.一个对象的行为是通过它的方法来表达,所以消息传递支持所有对象之间可能的交互。2.发送消息的对象与接受消息的对象不需要在相同的程序中,或者相同的机器上。275、子类和继承什么是子类?子类是作为另一个类的扩充或修正所定义的一个类。bicycle(superclass)MountainbikesRacingbikesTandembikessubclass28继承的概念什么是继承?继承即子类可以利用父类中定义的方法和变量,就像它们属于子类本身一样。classCar{intcolor_number;intdoor_number;intspeed;

push_break(){…}add_oil(){…}}

classTrash_CarextendsCar{doubleamount;fill_trash(){…}}29类层级(classhierarchy)类的继承关系不仅仅只是一层关系,它可以有好几层。这种树状关系,我们称作类层级(classhierarchy)。至于层级数可依照实际需要而定

。30类层级(classhierarchy)

子类继承了父类的变量及方法。如此便可重复使用父类中的变量及方法。这就是继承的好处。不仅如此,子类不受父类的限制,还可增加自己的变量及方法。例如在出租车中加了一个无线电调用方法,或是在轿车里加了一个卫星导航方法。都是按子类特殊的需要新加的。因此,我们可以发现越下层的类,其行为越特别。316、对象之间的关系包含继承关联32包含关系汽车对象轮子对象发动机对象变速箱对象座位对象……33继承关系交通工具对象车对象汽车对象公交汽车对象34关联关系老师对象vs学生对象汽车对象vs加油站对象茶杯对象vs茶壶对象354.2类

类是现实世界某些对象的共同特征(属性和操作)的表示,对象是类的实例。类的属性:类中所包含的各项数据,如变量或其他类的对象,一般称为类的成员变量。类的服务:类中所包含的成员方法。36回顾4.1面向对象的基本概念374.2类

Java语言中,类的来源主要有两种途径:Java类库用户自定义的类所有的类都是Object类的子类。如果在自定义类时,没有写明父类,则默认的父类为Object。从严格意义上讲,Java程序中定义的所有的类都是子类。384.2.1

类的定义

{类成员变量声明类方法声明 }类修饰符用来说明类的特殊性质,分为三种:访问控制符:public抽象类说明符:abstract最终类说明符:final接口名跟在implements关键字后面,用来说明类中实现了哪个接口定义的功能和方法。接口是Java用来实现多重继承的一种特殊机制,我们将在后面详细介绍。[修饰符]class类名[extends父类][implements接口名]391.关于类头[修饰符]class

类名[extends父类][implements

接口名]

class关键字的后面,应跟随我们所定义的类的名称。(注意不要把class写成Class)。父类名跟在extends

关键字后面,用来说明当前类是哪个已经存在类的子类。继承是类与类之间的一种非常重要的关系。publicclassTaxiextendsCar40

2.关于类体

类体主要包括类的具体内容,包括类的属性(成员变量)与方法(成员方法)。class<类名>{

<成员变量声明><成员方法声明>}publicclassTaxiextendsCar{

public

int

color_number=2;

intdoor_number;

intspeed;

publicvoidbrake(inti,j){…}voidspeedUp(){…}voidslowDown(){…}}

41类的属性定义语法如下:[修饰符]变量类型变量名[=变量初值];

变量类型和变量名是声明一个变量必不可少的部分;这里的变量的类型是基本数据类型。类的属性变量修饰符用来说明变量的性质,主要有:访问控制符:public静态修饰符:static最终修饰符:final[修饰符]

class类名[extends父类][implements接口名]public

int

color_number=2;

42类的方法方法的声明如下:[修饰符]返回值类型方法名(参数列表)[

throws异常名1,异常名2,…]{ //方法体:局部变量声明;语句序列;}类的方法有两种作用:一是对类的属性进行各种操作;二是与其他类或对象进行交互,作为一个接口。方法修饰符有四种:访问控制符:public抽象修饰符:abstract静态修饰符:static最终修饰符:finalpublicvoidbrake(inti,j)

{

intx,y;x=i;y=j;…}43修饰符的比较访问控制符:public,private抽象修饰符:

abstract最终修饰符:final静态修饰符:static类

√√√×变量

×√√方法

√√444.2.2用户自定义类Java程序设计中,程序员的大部分精力都要放在创建用户自定义类型(user-definedtype)上。用户自定义类型也称为自定义类。每个用户自定义类型(即类)都包含有数据和一组操作数据的方法。类的实例称为对象。下面,介绍一个简单的Employee类。今后,我们在编写职工工资系统时,有可能会用到它。45classEmployee{ Stringname;//成员变量 doublesalary; DatehireDay;

publicEmployee(Stringn,doubles,intyear,intmonth,intday) { name=n;//职工姓名 salary=s;//职工工资

hireDay=newGregorianCalendar(year,month-1,day);

//出勤数 } publicStringgetName()//方法1 { returnname; }

…… //更多的方法}构造方法464.2.3

构造方法定义好一个类以后,我们需要创建该类的实例。在Java中,构造一个类的实例(即对象),需要做以下三件事情:

(1)为对象分配内存空间;

(2)初始化对象中的成员变量;

(3)调用类的构造方法来创建该对象。在Java中,每个类中都至少有一个构造方法。如果没有,则系统会自动提供一个缺省的构造方法。类的构造方法的作用:

(1)可以保证用户能正确地创建出该类的对象;(2)可以初始化对象。47构造方法的格式

[修饰符]方法名([形式参数列表])[throws异常列表]{方法体}其中,构造方法的修饰符与普通方法的修饰符相同。一个类可以有多个构造方法,它们都具有相同的方法名,即类名,但是形式参数的个数和类型不同。在创建对象时,编译器会根据参数的个数和类型来决定调用哪个构造方法。这就是构造方法的多态。没有返回值,也没有void方法名与类名相同48缺省的构造方法构造方法分为缺省的构造方法(不带参数)和带参数的构造方法。如果在类中没有定义构造方法,Java会自动为用户提供一个缺省的构造方法。缺省的构造方法确保每个类都至少有一个构造方法。例如,在类Employee中,如果我们没有定义构造方法,则Java自动提供一个缺省的构造方法,如下:

publicEmployee()//缺省的构造方法{}49构造方法的例子【例】下面的例子将建立雇员信息类EmpInfoA,其中定义了一个构造方法。利用这个构造方法创建一个雇员对象,并初始化该对象,然后输出该对象的若干信息。

50构造方法举例publicclassEmpInfoA{Stringname;//雇员的姓名

Stringdesignation;//雇员的职务

Stringdepartment;//雇员的部门

publicEmpInfoA(Stringn,Stringdes,Stringdep){name=n;designation=des;department=dep;}voidprint(){//成员方法

System.out.println(name+"是"+department+"的"+designation);}

publicstaticvoidmain

(Stringargs[

]

){

//主方法,程序的入口

EmpInfoA

emp=new

EmpInfoA("张三","经理","销售部");

emp.print();//调用对象emp的方法print()}}

例子:EmpInfoB51类成员变量的初始化对类的成员变量进行初始化,主要有5种途径:每种数据类型都有默认的初始值;可以在声明成员变量的同时进行初始值,inti=10;在类的成员方法中,对成员变量赋值。例如:在main()方法中;在类的构造方法中,对成员变量赋值。例如:在前面的构造方法的例子中;利用初始化块对成员变量进行初始化。初始化块是由一对花括号{}括起的语句块。52初始化块、构造方法中初始化成员变量classPoint{

intx,y; //成员变量{ //在初始化块中初始化

x=10;y=20;

System.out.println("在初始化块中进行初始化:x="+x+",y="+y);}

Point(int

dx,int

dy)//在构造方法中初始化

{x=dx;y=dy;

System.out.println("在构造方法中进行初始化:x="+x+",y="+y);}

publicstaticvoidmain

(Stringargs[

]

){

Pointp=new

Point(40,40);

}}注意:初始化块和构造方法都是在创建对象时被调用。通常,初始化块先执行。534.3对象类是对象的产品模板。在现实世界里,我们使用的是产品而不是产品的图纸。同样的道理,Java中运行的应该是由类所创建的对象。一个典型的Java程序会创建很多对象,它们通过消息传递进行相互交流,共同完成程序的功能。一旦任务完成,对象就会被垃圾收集器收回,完成它从创建、使用到清除的生命三步曲。54对象的创建

首先,必须拥有一个合适的类才能创建一个合适的对象,有了合适的对象才能完成合适的工作。

对象创建的语法格式为:类名对象名=new

类名([参数列表]);调用类的构造方法对象声明EmpInfoA

emp=new

EmpInfoA("张三","经理","销售部");55创建一个对象的三个步骤1、对象的声明格式为:类名对象名;

例如:PeoplezhangPing;2、为声明的对象分配内存new运算符为声明的对象分配内存,然后调用类的构造方法来初始化对象。用new可以为同一个类创建多个对象,这些对象分别占用不同的内存空间,因此改变其中一个对象的状态不会影响到其他对象的状态。3、执行构造方法,进行初始化zhangPing=newPeople(“20040101”);zhangYong=newPeople(“20040102”);//创建另一个对象上面三个步骤,通常可以写成如下简洁的形式:PeoplezhangPing=newPeople(“20040101”);类名对象名=new类名([参数列表]);56创建对象相当于定义一个变量,既可采用上述方法。PeoplezhangPing=newPeople(“20040101”);PeoplezhangPing;zhangPing=newPeople(“20040101”);也可以把上述步骤分开进行,先声明对象,再实例化对象,最后进行初始化。57对象创建的例子【例】下面的例子将建立雇员信息类EmpInfoB。利用缺省的构造方法创建一个雇员对象。并且在主方法中初始化该对象,然后打印出该对象的若干信息。

58

publicclassEmpInfoB{Stringname;//雇员的姓名

Stringdesignation;//雇员的职务

Stringdepartment;//雇员的部门

voidprint(){//成员方法

System.out.println(name+"是"+department+"的"+designation);}publicstaticvoidmain(Stringargs[]){//主方法

EmpInfoB

emp=newEmpInfoB();//调用缺省构造方法创建对象

=

"张三";//初始化对象emp的成员变量

emp.designation="经理";

emp.department=

"销售部";

emp.print();//调用对象emp的方法print()}}例子:EmpInfoA对象创建举例59对象的使用

创建好一个对象之后,就可以使用这个对象。(1)访问对象的成员变量:通过运算符“.”格式为:对象名.成员变量名例如,在前面例子中:=

"张三";成员变量的访问也可以用new创建对象,然后直接访问,不用先声明对象。例如:newEmpInfoB().name="张三"。(2)调用对象的方法:也是通过运算符“.”格式为:对象名.方法名([参数列表])

例如,在前面例子中:emp.print();

同样,我们也可以用new创建对象,然后直接调用它的方法,不用先声明对象。例如:newEmpInfoB().print()。

60对象的清除与垃圾回收

Java运行时,系统通过垃圾收集器周期性地收集无用对象所占用的内存,并释放该内存空间,完成对象的清除工作。Java的垃圾收集器自动扫描内存,对正在使用的对象做标记,然后把无用对象作为垃圾收集起来,并释放掉。垃圾收集器作为一个线程单独运行,当系统的内存用尽或者程序中调用System.gc()方法要求进行垃圾收集时,垃圾收集线程与系统同步运行,否则垃圾收集器在系统空闲时异步地执行。在对象作为垃圾被收集器释放之前,系统会自动调用对象的方法finalize(),清除对象所占用的资源。

61对象的清除与垃圾回收

虽然Java提供自动的内存垃圾收集和处理机制。但是,在某些情况下,例如当一个类被破坏后,需要程序员自己执行一些垃圾收集器不能处理的工作。这时可以在类中定义方法finalize(),用来清除对象所占用的资源,它的格式如下:

protectedvoidfinalize()[throwsThrowable]{//撤销对象}

624.4.1方法概述4.4方法Java程序是由一个个类所组成的,类又有两个部分:属性和方法。属性描述类是什么,方法描述类能做什么。方法是类的主要组成部分。在一个类中,程序的作用主要体现在方法中。方法是一个有名字的子程序。通常分为一个主方法和若干个子方法。主方法调用其他方法,其他方法之间也可以互相调用,同一个方法可以被一个或多个方法调用任意次。

63Java程序的基本结构导入Java类库;//Import…定义用户类1{

定义类1的若干变量;定义类1的方法1; ……定义类1的方法M;}定义用户类2{定义类2的若干变量;定义类2的方法1; ……定义类2的方法N;}……64方法的类型方法的类型可分成两种:(1)标准方法,Java语言提供了丰富的标准类和标准方法,这些方法提供了程序员所需的许多功能。例如,System.out.println();(2)用户自定义的方法,以解决用户专门的需要。Java程序的执行是从main方法开始的,调用其他方法后又回到main方法,在main方法中结束整个程序的运行。654.4.2定义方法1.声明方法头2.声明方法体Java中声明方法的语法如下:[修饰符]返回值类型方法名(参数列表)[

throws例外名1,例外名2,…]{ //方法体:局部变量声明;语句序列;}publicvoidbrake(inti,j)

{

intx,y;x=i;y=j;…}66

1、声明方法头

方法头一般由方法名、参数列表、返回类型、方法修饰符和方法抛出的异常五部分组成。注意事项:(1)方法名可以是任何有效的标识符,命名规则与标识符命名规则相同。(2)返回类型用来指定方法返回值的类型,方法最多只能返回一个值。(3)参数列表是方法的输入接口,它列出了一系列形式参数的类型和名称。对于每个行参,调用方法时必须有一个实参与之对应,而且该实参的类型必须与行参的类型一致。672、声明方法体方法头定义了方法的性质,方法体则定义了方法的内容。注意事项:(1)在一个方法中嵌套定义另一个方法将产生语法错误;(2)方法体包含在一对大括号中,即使方法体中没有语句,一对大括号也是必不可少的。(3)方法头中如果指定了非void的返回值类型,方法体中就必须包含一条return语句,以保证任何情况下都有返回值。68

声明方法体的例子classDepartment{

int

m_DeptNo; //部门编号

Stringm_DeptName;//部门名称

int

m_DeptTotalEmp;//部门雇员数

int

getDeptNo()//获取当前对象的部门号{returnm_DeptNo;//返回这个对象的部门号}} 69回顾4.2类

4.3对象4.4方法704.4.3方法的调用方法按其被调用的方式可分为两类:(1)需要程序员书写专门的调用命令来调用的方法,称为程序调用方法,例如getDeptNo();(2)系统自动调用的方法,称为系统方法。例如main()、action()、paint()、init()等。这两类方法的定义和使用原则有很大差异。在某个类中调用该类自身的方法,可以直接使用这个方法的名称;调用其他对象或类的方法,则需要使用该对象或类名作为前缀。

71

方法的调用(实例)classDepartment{

int

m_DeptNo; //部门编号

Stringm_DeptName; //部门名称

int

m_DeptTotalEmp;//部门雇员数

int

getDeptNo()//获取当前对象的部门号

{returnm_DeptNo;//返回这个对象的部门号

}publicstaticvoidmain(String[]args){Departmentdep=newDepartment();

dep.m_DeptNo=100;//访问对象dep的成员变量

System.out.println("部门号为:"+dep.getDeptNo());

//调用对象dep的方法}}72

方法的重载(Overloading)同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即形式参数的个数或类型不能完全相同。例如:几何图形类中有多个方法用来绘制不同的图形,这些方法有相同的名字draw,但形参不一样,

draw(Pointa,Pointb);

draw(Pointa,Pointb,Pointc);

draw(Pointa,Pointb,Pointc,Pointd);

draw(Pointa,floatradius);ababcabcdaradius重载73

方法的重载(Overloading)几何图形类中有四种不同的绘图方法,我们在调用draw方法进行绘图时,是调用其中哪一个方法呢?其实,这时Java编译器会根据您提供的实参的类型和个数来决定具体调用其中哪个方法。例如:draw((0,1),(4,12));draw((3,4),2.5);方法重载可以简化程序的编写,您只要记住一个方法名,不需要记那么多复杂的方法名称。通过提供不同的实参就可以调用不同的方法来完成不同的功能。构造方法也可以重载,其目的是使得用户可以为同一个类创建初始值不同的对象。74classOverloading{ voidget

(inti){

System.out.println("getoneintdata:i="+i); } voidget(intx,inty){

System.out.println("gettwoint

datas:x="+x+"y="+y); } voidget(doubled){

System.out.println("getonedoubledata:d="+d); } voidget(Strings){

System.out.println("getastring:s="+s); }publicstaticvoidmain(Stringargs[]){Overloadingmo=newOverloading();mo.get(1);mo.get(2,3);mo.get(4.5);mo.get

("astring"); }}754.4.4JavaAPI中的方法

JavaAPI(ApplicationProgramInterface)也称为Java类库。JavaAPI提供了丰富的标准类和方法,可以执行常见的算术运算、字符、字符串、输入输出、错误检查等操作。

1、Math类以及其中的方法2、Math类方法的调用System.out.println()761、Math类的方法

方法说明方法说明abs(x)x的绝对值max(x,y)取x和y中较大者ceil(x)不小于x的最小整数min(x,y)取x和y中较小者cos(x)x的余弦函数值pow(x,y)x的y次幂exp(x)指数方法e的x次幂sin(x)x的正弦函数值floor(x)不大于x的最大整数sqrt(x)x的平方根log(x)x的自然对数(以e为底)

772、Math类方法的调用

例如,要计算并且打印出900的平方根,我们需要调用Math类的方法如下:

System.out.println(Math.sqrt(900));注意:Math类方法的调用必须在方法名前加上类名Math和点“.”运算符。784.5访问控制修饰符Java语言新推出“访问控制修饰符”的概念,允许类创建者声明哪些东西是类使用者可以使用的,哪些是不可使用的。每个访问控制修饰符都代表一种访问控制权限。这些访问控制权限按照权限的大小可进行如下排序:

public

>

protected

>default(无修饰符)>

private79为类指定访问权限的格式: class类名;如果一个类没有指定为public,则该类的访问权限就是缺省的。一、类的访问控制权限(2种)public:公共访问权限default:缺省访问权限[public]80为类中的变量和方法指定访问权限的格式: [public|private|protected]数据类型变量名; [public|private|protected]返回类型方法名(参数列表);如果一个变量或方法没有指定访问控制修饰符,则该变量或方法的访问权限就是缺省的。二、变量和方法的访问控制权限(4种)public:公共访问权限default:缺省访问权限protected:保护访问权限private:私有访问权限814.5.1公共访问控制符public类的访问控制修饰符只有一个:public。一个类被声明为公共类,表明它可以被所有的其他类所访问。

注意:公共类可以被所有其他类访问不代表公共类中的成员也可以被访问。只有当这些成员也是公共的,才可以访问。例如:要进入二楼的一个房间,必须首先保证这栋楼的大门是开着的,而且这个房间的门也开着,才可以进入其中。824.5.2缺省访问控制权限如果一个类前面没有访问控制修饰符,则说明它具有缺省的访问控制权限。缺省的访问控制权限规定类只能被同一个包中的类访问,而不能被其他包中的类访问。418包1包2包3包n……类defaultclass类名;834.5.3私有访问控制符private

用private修饰的变量或方法只能被该类本身所访问,而不能被任何其他的类,包括该类的子类,来访问。

变量1…n方法1…mprivate父类变量1…n方法1…m子类变量1…n方法1…m其他类84classEmployee{

privateStringname;//成员变量,私有访问权限

private

doublesalary;

publicEmployee(Stringn,doubles) {//构造方法

name=n;//职工姓名

salary=s;//职工工资

}

publicStringgetName()//方法1 {

return

name;

} publicstaticvoidmain(Stringargs[]){

Employee

e=newEmployee

("Jack",2600d);

System.out.println("姓名为:"+e.getName()); }}√√√852.私有方法虽然大多数方法是公开的,但是私有方法也经常使用。例如那些与类的访问者无关的方法就可以设置为私有的。private方法1(与访问者无关)public方法2(与访问者有关)被访问类变量1…n方法1…m访问类86publicclassDemo{ publicint

a;//公共的成员变量

privateint

b;//私有的成员变量

publicint

getA(){//公共的成员方法

returna; } privateint

getB(){//私有的成员方法

returnb; } publicDemo(intx,inty){

a=x; //访问公共成员变量,对其初始化

b=y; //访问私有成员变量,对其初始化 } publicstaticvoidmain(Stringargs[]){ Demodp=newDemo(1,2);

intw=dp.getA();//访问公共的成员方法

System.out.println("变量a的值:"+w);

intv=dp.getB();//访问私有的成员方法

System.out.println("变量b的值:"+v); }}874.5.4保护访问控制符protected用protected修饰的类成员可以被三种类所访问:该类本身、与它在同一个包中的其他类、在其他包中的该类的子类。protected的主要作用:允许位于其他包中的子类来访问父类的成员。4188包1包2protected假设包1

中的类4

不是包2

中的类1

的子类假设包1

中的类8

是包2

中的类1

的子类88packagep1;publicclassDemopro{

public

inta;//公共的成员变量

protected

voidmethod()//保护的成员方法 {

System.out.println("Demopro中的公共成员变量a的值:"+a); }}

packagep2;importp1.*;publicclasstest{ publicstaticvoidmain(Stringargs[]){

Demopro

dp=newDemopro();

dp.method();

/*不能访问Demopro

中的方法method,因为它是受保护的,并且位于不同的包中*/

dp.a=10;//可以访问Demopro

中的公共成员变量a

System.out.println("Demopro中的公共成员变量a的值:"+dp.a); }}89如果上面的两个类Demopro

和test位于同一个包中,则上面的语句dp.method()就不会有错。如果两个类位于不同的包中且没有继承关系,则对保护类型的变量和方法的访问将受到限制。因此,上面的dp.method()不能正确执行。90归纳上述4种不同的访问控制修饰符:同一个类同一个包不同包中的子类不同包中的非子类private

√×××默认

√××protected

√×public

权限递增914.6静态修饰符、初始化块和方法4.6.1静态修饰符static是静态修饰符,用来修饰类中的变量和方法。被static修饰的变量称为静态变量,静态变量的特点是:它属于类本身,不属于类的任何一个具体对象。静态变量是一个公共的内存单元。92static

intx;类student张三李四实例化xinty;类student张三李四实例化yy属于属于属于共享93静态变量静态变量是类固有的,可以在创建类以后直接访问,而非静态的成员变量只有在生成对象后才存在,才可以访问。把静态变量称为类变量,非静态变量称为对象变量。相应地,静态方法称为类方法,非静态方法称为对象方法。94classStaticDemo{

static

intx;//静态变量

inty;//非静态变量

staticpublicint

getX(){returnx;}//静态方法publicint

getY(){returny;}//非静态方法}publicclassShowDemo{publicstaticvoidmain(String[]args){

System.out.println("静态变量x="+StaticDemo.getX());

System.out.println("非静态变量y="+StaticDemo.getY());//非法访问

StaticDemoa=newStaticDemo();

StaticDemob=newStaticDemo();

a.x=2;a.y=2;

b.x=3;b.y=3;

System.out.println("静态变量a.x="+a.getX());

System.out.println("非静态变量a.y="+a.getY());

System.out.println("静态变量b.x="+b.getX());

System.out.println("非静态变量b.y="+b.getY());}}95类的静态成员可以通过“类名.成员名”或者“对象名.成员名”来访问,例如在前面的程序中我们就使用了StaticDemo.getX()和a.getX

温馨提示

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

评论

0/150

提交评论