教学课件-面向对象程序设计.ppt
第3章 面向对象程序设计Object-Oriented Programming,3.1 类和对象,面向对象方法 类的定义 成员变量 成员方法 构造方法 对象的创建和使用 类成员与实例成员,面向对象方法,现实生活中的对象,有形的对象医院医生病人手术器械体温计.,无形的对象治疗方案手术规程.,面向对象方法,对象的特征分析静态特征:属性,姓名性别年龄职称专长,量血压听诊写病历开处方,【案例3-1】用面向对象方法模拟医生为病人诊疗过程。,案例说明:本案例通过对病人就诊模型的分析与简化,抽象出包括日期、体温计、病人以及医生等四个主要的类,并利用医生类的接诊、开处方、诊疗等实例成员方法将这些类联系起来,重现病人就诊时医生用体温计测量病人体温,给病人诊疗并开据处方的过程。,图5-2 案例5-1的运行结果,面向对象的基本概念,对象(Object)是一个应用系统中用来描述客观事物的实体,是具有特定属性(数据)和行为(方法)的基本运行单位,是类的一个特定状态下的实例。类(Class)是Java代码的基本组织模块,是用以描述一组具有共同属性和行为的对象的基本原型,是对这组对象的概括、归纳与抽象表达,它定义了本类对象所应拥有的状态属性集及操作这组属性的行为方法集。,面向对象的基本概念(续1),接口(Interface)是一种只包含常量与抽象方法的特殊的类,是Java语言用以实现类间多重继承功能的唯一手段。接口定义了一组特定功能的对外接口与规范,而并不真正实现这种功能,功能的实现留待给实现这一接口的各个类来完成,包(Package)是用来容纳一组相关类与接口的容器,是Java语言组织与管理类与接口的一种机制,类与对象的关系,类与对象之间的关系,类似于数据类型与变量之间的关系;一个类可以生成无数个不同的对象,每个对象属性值不同,其状态也不同。,可以用计算机模型与计算机实体之间的关系来更形象地说明类与对象之间的关系:将冯诺依曼计算机模型看作计算机类,则不同品牌的计算机实体就对应为一个个的实例对象。,类与对象的关系示例,计算机模型与计算机实体之间的关系:,面向对象编程(OOP),从问题域客观存在的事物出发,将这些现实世界的物理实体抽象成概念世界的抽象数据类,再进一步将这种抽象数据类转换为计算机世界的类(Class);类刻画出实体所具有的状态信息与所能发挥的功能信息,是创建对象时所遵循的模板(Template)。对类进行实例化,就生成一个个的对象,对象对应于各个具体事物,是程序运行过程中实际发挥作用的类的独立内存映像。借助于类与对象这两个面向对象程序中最基本的要素,按照尽可能符合人类自然思维的方式,来构造软件系统,这就是所谓的面向对象程序设计(OOP),OOP的逻辑过程,面向对象设计分析的完整过程如图所示:,面向对象的重要特征,面向对象具有以下几个重要特征:,抽象,封装与隐藏,继承,多态性,抽象,抽象(Abstraction):抽象是面向对象编程的起点,也是其最本质的特征之一。抽象的广义概念是这样定义的:从研究对象中提取与当前目标主题关系最密切的主要方面,而忽略掉与目标无关的那些方面或关系不大的细枝末节,从而更充分地注意与当前目标有关的方面,更明确地突出主题,这就是抽象,抽象示例,下图阐述了如何由自然界众多的动物实体出发,经过抽象的处理过程,最终得到动物这一概念,封装,封装(Encapsulation):封装也可称为信息隐藏(Information Hiding),是通过对象的方法来访问与改变对象属性的一种机制。封装是面向对象的一个重要原则,其实现的核心是将类的属性与相关的操作捆绑起来,包装成不可分割的、独立的对象实体,将内部的数据与实现细节尽可能隐蔽起来,使外部用户不能直接操纵对象的内部信息,只能通过对象对外提供的施加有一定限制的访问接口来使用对象,封装示例,下图形象地说明了一个类的封装原理。类对数据与行为的封装是借助于不同级别的访问修饰符来达到控制目的的,继承,继承(Inheritance):继承是指从已有的类中可以派生出若干个新类,已有类称为基类或父类,新类称为派生类或子类;子类将自动地获得基类的属性与方法,从而不需再重复定义这些属性与方法;当然子类还可以修改父类的方法或增加新的方法,从而使自己更适合特殊的需要。类之间的继承关系是现实世界中遗传关系的直接模拟,多态性,多态性(Polymorphism):是指允许不同类的对象对同一消息作出各自的响应,即以统一的风格处理已存在的数据及相关的操作。多态性语言具有灵活、抽象、行为共享、代码共享的优势,较好地解决了应用程序中方法同名的问题,OOP的优越性,从面向过程到面向对象是程序设计技术的一个飞跃。人们之所以要采用面向对象的程序设计技术,其目的在于:,提升程序的开发与运行效率,提高代码的可重用性(或者称为复用性),按照与人类习惯思维方法一致的原则开发系统,OOP的优越性(续),提高程序的可靠性与可维护性 提高程序的可扩展性 增强程序的可控制性,总之,面向对象的程序设计,能够有效分解、降低问题的难度与复杂性,提高整个求解过程的可控制性、可监视性和可维护性,从而获得较高的开发效率与可靠效果,类的定义,在面向对象的程序设计中,将数据与对数据进行的操作合起来定义为类。类是将数据和与数据相关的操作封装在一起的集合体,用来定义一组对象共同具有的状态(属性)和行为(方法)的模板。类是一种复杂的数据类型,它不但包含数据,还包含了对数据进行操作的方法(Method),通常将类中的数据称为成员变量,而操作数据的方法称为成员方法,二者统称为类的成员。,类的定义,Java类的定义格式如下:说明:(1)类声明定义该类的名称、访问权限、与其他类的关系以及实现的接口等。(2)类主体定义该类中的成员,包含成员变量和成员方法。成员方法是用来描述对成员变量进行的操作,不但定义方法,一般还要实现该方法。,类的定义,类声明的格式如下:class extends implements 说明:(1)class是定义类的关键字,、都应该是合法的Java标识符。(2)在类的声明中必须包括关键字class和自定义的类名,而方括号中的是可选项。(3)子句extends 显式地指明当前类的父类,子句implements 则说明当前类要实现接口。,类的定义,类主体的定义格式如下:说明:(1)类体的数据声明为成员变量,针对数据的操作声明为成员方法,数据的操作过程在成员方法的实现中体现。(2)构造方法主要用于类对象的实例化,又称构造器。(3)类体中声明的成员变量和方法的排列顺序可以任意。,成员变量,声明类的成员变量格式如下:修饰符 static final 数据类型 成员变量名1,成员变量名2,说明:(1)修饰符的作用是限定成员变量的可访问权限,主要有public(公共的)、protected(受保护的)、private(私有的)以及缺省等四种情况(2)static用于声明类成员变量,用于保存与整个类有关的状态数据的成员变量称为静态成员变量或者类成员变量,简称为类变量,final用于声明常量;(3)成员变量的数据类型既可以是基本数据类型,也可以是引用数据类型,如数组或者其他类对象等。,成员方法,成员方法是可被调用执行并返回值的、能实现特定功能的程序段。成员方法声明格式如下:修饰符abstractstaticfinal 返回值类型 方法名(参数列表)throws 异常类 方法体 说明:(1)方法的修饰符和成员变量的修饰符一样有四种情况;(2)abstract、static和final分别用于指定所声明的方法为抽象方法、静态方法和最终方法。静态方法又称类成员方法或类方法,一般用于与类有关的数据操作,可以使用类名直接调用。,成员方法,(3)成员方法执行数据操作功能后都会向调用者返回数据操作的结果,返回值类型就是用于声明该成员方法返回值结果的数据类型,可以是包括基本数据类型和引用类型在内任何合法的类型。(4)若成员方法不返回任何值,则返回值类型用void标记,不能缺省。(5)每个成员方法都有一个方法名,紧邻方法名的是用一对括号()括起来的参数列表,参数列表也称为形式参数表,简称形参表。(6)形参表主要用于声明该成员方法在被调用时需要调用者提供的、与数据操作相关的参数的个数与数据类型。每个成员方法允许声明的形参可以有0到多个,每个形参由形参数据类型、空格符和形参名组成,多个形参之间用逗号分隔,即便成员方法没有形参,括号()也不能缺省。,成员方法,(7)形参的作用域是局部的,只限于声明它的成员方法之内有效。throws用于声明该成员方法在执行过程中可能会抛出的异常类型。(8)花括号所括起来的就是方法体,方法体可以包含一到多条语句,用以实现成员方法所负责的数据操作功能。若成员方法的返回值类型不为void,则在方法体中需要使用return语句返回其数据操作的结果,且结果类型必须与方法声明的返回值类型相一致。(9)在方法体内可以局部变量,其作用域只限于声明它的方法体内,且声明中不能使用public等访问修饰符和static关键字,同时需遵循“先赋值,后使用”的原则,且在同一个类的不同方法中可以声明同名的局部变量,包括形式参数在内的所有局部变量都不能在方法体外被访问。,成员方法,如果方法有返回值类型,则方法体中必须有return语句如果想让方法执行后得到值a,即返回值为a,那么在方法中要使用returna语句。return有“返还”之意,它把表达式的值返回到调用之处。例如:public class Class3 double f(int x)return 2.5+x;public static void main(String args)Class3 aaa=new Class3();double y=aaa.f(3);System.out.println(y);System.out.println(aaa.f(2);,构造方法,每当由类构造对象时都要调用该类特定的构造方法,在Java中,每个类都至少有一个构造方法。构造方法可以确保用户正确地构造类的对象,同时,构造方法也会对对象作初始化工作。构造方法的声明格式如下:()初始化的程序代码块说明:(1)一个类的构造方法可以有多个,它们都具有相同的方法名,即类名;(2)与类的成员方法不同,构造方法用于创建类的对象并对对象的成员变量进行初始化。(3)构造方法没有返回值类型,但是也不能有void关键字,且只能通过new运算符调用,且其修饰符一般采用public(或者没有),以便于在其他位置根据需要定义并实例化该类的对象。,可以使用参数值作为变量的初值,也可以直接给变量赋具体的数值。,构造方法,(4)当一个类没有显式声明其构造方法时,Java编译器会自动为该类生成一个默认的、无参数的构造方法,且实例化后对象的成员变量在没有特别赋值的情况下自动获得其所声明类型的默认值。,构造方法,构造方法分为缺省的构造方法(不带参数)和带参数的构造方法。(1)缺省的构造方法 如果类的定义没有编写构造方法,Java语言会自动为用户提供。这个由Java自动提供的构造方法就是所谓的缺省构造方法。缺省的构造方法确保每个Java类都至少有一个构造方法,该方法应符合方法的定义。例如在下例的类EmpInfo中,我们没有定义构造方法,则Java自动提供了一个缺省的构造方法,如下:public EmpInfo()/缺省的构造方法,构造方法,EmpInfo.javapublic class EmpInfo String name;/雇员的姓名 String designation;/雇员的职务 String department;/雇员的部门 void print()/成员方法 System.out.println(name+is+designation+at+department);public static void main(String argv)EmpInfo employee=new EmpInfo();/创建对象并实例化 employee.name=Robert Javaman;/给成员变量赋值 employee.designation=Manager;/给成员变量赋值 employee.department=Coffee Shop;/给成员变量赋值 employee.print();/调用方法print()运行结果如下:Robert Javaman is Manager at Coffee Shop,调用缺省的构造方法,构造方法,构造方法,(2)带参数的构造方法 带有参数的构造方法能够实现这样的功能:当构造一个新对象时,类构造方法可以按需要将一些指定的参数传递给对象的变量。,构造方法,例如,可以为People类增加一个如下所示的构造方法Class People string name;int age;float height;float weight;public People()/无参数 name=沈昕;age=26;height=1.62;weight=55.5;,构造方法,如果希望在创建对象时,其实例变量具有不同的初值,可以通过传递参数并将参数值赋给实例变量的方法来实现。构造方法的参数要与实例变量一一对应,例如:People类的另一种构造方法为:带参数的构造方法 Class People string name;int age;float height;float weight;public People(String initName,int initAge,double initHeight,double initWeight)name=initName;age=initAge;height=initHeight;weight=initWeight;,对象的创建和使用,对象是类的实例,所以一个对象必定属于一个已知的类。Java语言中,一个对象的生命周期经历:创建,使用,销毁等三个阶段。对象被创建后将获得包括内存在内的所需资源;而对象销毁后,其所占的资源将被系统自动回收。Java语言具有资源回收机制,能跟踪存储单元的使用情况,自动回收不再被使用的资源。对象的创建:创建一个对象包括两个步骤-声明对象和为对象分配内存。1)对象的声明一般格式为:类名 对象名如:People 张三这里people是前面定义的一个类的名字,张三是声明对象的名字。但此时对象“张三”的内存中没有任何数据,即“张三”还是一个空对象,不能使用。要是用这个对象还必须为这个对象分配内存,也叫做为对象分配实体。,对象的创建和使用,2)为对象分配内存:为对象分配内存,即使用new运算符和类的构造方法实例化某个对象。如果类中没有构造方法,系统会自动调用默认的构造方法(没有参数,名字遵循普通构造方法的要求:和类名相同),格式为 对象名=new 构造方法名(实参列表);/实例化对象 例如:张三=new People()也可以把以上两个步骤合在一起,格式为:类名 对象名=new 构造方法名(实参列表);例如 People 张三=new People(),new可以实例化类的多个不同的对象,分配不同的内存。因此,这些对象之间的状态相互独立。,对象的创建和使用,创建一个对象后,在程序中就可以引用对象中的成员变量,调用对象的成员方法,语法格式如下:对象名.成员变量对象名.成员方法(实参列表)例如:aday.year=2009;aday.setDate(2009,10,28);说明:(1)对象名与成员变量或方法之间使用点运算符“.”分隔。(2)方法调用时给出的参数称为实际参数,简称实参。实参可以是常量、变量、表达式或方法的调用,实参的个数与数据类型及排列次序一定要与类定义中该方法声明的形参保持一致,且多个实参之间用逗号分隔。,对象的创建和使用,(2)当调用方法时,系统按照实参与形参一一对应的关系将实参的值或引用传递给对应的形参。需要特别注意的是,若实参为引用类型的数据,其值不能为null。方法后的圆括号()是必需的,即便该方法没有声明形式参数也不能缺省。,对象创建的一个例子,class People int age;String name;double height;People()name=张婷;age=25;height=160.0;void laugh()/类的一个成员方法System.out.println(Haaha.);public static void main(String args)System.out.println(main方法执行);People p=new People();p.laugh();(p.name=+p.name);(p.age=+p.age);(p.height=+p.height);,一个构造函数,对象创建的一个例子,public class Class27 int a;public Class27()a=10;public Class27(int q)a=q;public static void main(String args)Class27 ob1=new Class27();Class27 ob2=new Class27(20);Class27 ob3=new Class27(30);System.out.println(ob1.a);System.out.println(ob2.a);System.out.println(ob3.a);,两个构造函数,对象创建的一个例子,class Man int height;int age;public class Class1 public static void main(String args)Man man1;man1=new Man();man1.height=180;man1.age=20;System.out.println(man1.height);/使用对象的成员变量 System.out.println(man1.age);,在本源程序中,有两个类,其中包含主方法的类为主类,文件名与主类名相同,对象的创建和使用,对象的创建课堂练习:有一个类class1拥有以下成员变量:Int a;Double b;String c;请编写构造函数(带参数)初始化成员变量,创建类class1的对象ob,输出对象ob的三个成员变量值。,类成员与实例成员,Java类中所包含的成员从功能上可以划分为成员变量和成员方法两种。其中,前者存储数据,后者负责数据的处理。然而,从成员与类及类实例(对象)之间的关系的上看,类中的成员还可以划分为类成员和实例成员两种。,类成员与实例成员,类成员是属于类的,使用static关键字声明,故又称静态成员,包括类成员变量和类成员方法。通过类名就可以直接访问类成员变量和调用类成员方法,即使没有创建对象,也能够引用类成员。当然,类成员也能够通过类的实例(即对象)进行引用。实例成员则属于类的实例(即对象),包括实例成员变量和实例成员方法。只有创建了对象之后,才能通过对象访问实例成员变量和调用实例成员方法。换句话说,实例成员只能通过类的实例进行引用,而不能为类名。,类成员与实例成员,成员变量又可以分为:实例成员变量和类成员变量(静态成员变量)(1)实例成员变量-每次创建类的一个实例对象时,系统会为对象的每一个实例成员变量分配内存单元,使得属于不同对象的同一个实例成员变量具有不同值。也就是说,只有对象存在时,其实例成员变量的值才存在。(2)类成员变量-系统运行时为每一个类成员变量只分配一个存储单元,使得所有通过该类实例化的对象共享同一个类成员变量的存储空间。只为该类的第一个对象分配内存单元,其后所有新创建的对象都共享这一个类变量。,类成员变量(静态成员变量或类变量)如果成员变量的类型关键字前面有关键字static,这样的成员变量称作类变量或静态成员变量。如:class dog float x;/实例成员变量 static int y;/类变量 静态成员变量在不创建对象的情况下也可以使用,它是所有对象共有的变量。如果一个类中的某个成员变量是类变量,那么所有类的实例对象的这个类变量都分配给同一处的内存,修改了其中一个对象的这个类变量,其他类的这个类变量也会随之改变。也就是说,类变量被所有对象共享。实例成员变量(实例变量):只有在创建了类的对象后才能使用。,类成员与实例成员,class Chinese static String country=中国;/定义静态变量country并初始化 String name;int age;void shout()(啊!我爱你+country);/类中的成员方法也可以直接访问静态成员变量 class TestChinese public static void main(String args)System.out.println(Chinese country is+Chinese.country);/未创建对象直接使用“类名.变量名”格式 Chinese ch1=new Chinese();(我们的祖国是+ch1.country);/创建了对象直接使用“对象名.变量名”格式 ch1.shout();,类成员变量例,类成员与实例成员,类的成员方法也分为:实例成员方法和类成员方法(1)实例成员方法体中既可以访问类成员变量,也可以访问实例成员变量,且只能通过对象来调用。(2)类成员方法体中只能访问类成员变量,不能访问实例成员变量。但是类成员方法既可以通过对象来调用,也可以通过类名调用。,class dog float x()/实例方法 return static int y();/类方法 return类方法在不创建对象的时候也可以被调用。若一个方法被声明为类方法,则它只能对类变量进行操作,且象类变量一样,类的所有实例对象共享同一个类方法。如下例:,Main方法就是静态方法,它在程序执行时,由JVM自动调用,而不用先创建对象,类成员与实例成员,class test int a=3;static int b;float f(int x,int y)a=x;b=y;/变量引用合法,因为f为实例方法return x*y;static float g(int x,int y)a=x;b=2*a;/变量a引用不合法,因为g为类方法,而a为实例变量return x*y;,类成员与实例成员,public class Class14 int a;static void setA(int b)a=b;public static void main(String args)Class14.setA(10);,错误在于在静态方法中调用了非静态变量,a是成员变量,只有在创建对象后才可以使用,类方法,public class Class15 static int a;/静态变量 static void hello()/静态方法(救川);static void setA(int b)/在静态方法中调用另一个静态方法 a=b;/静态变量a hello();void printA()/在非静态方法中调用静态方法 System.out.println(a);hello();public static void main(String args)Class15.setA(100);Class15 ob=new Class15();ob.printA();,类方法,在使用类方法时要注意以下几个问题:(1)使用static修饰的类方法是属于某个类的,它在内存空间中的内容将随着类的定义而进行分配和装载,不被任何一个对象所单独拥有。(2)类方法不能操纵和处理属于某个对象的实例变量,而只能处理属于整个类的类变量,也就是说类方法只能处理类变量或者调用类方法。不能调用实例方法。实例方法可以调用该类中的任何其他方法:包括类方法和其他实例方法。(3)因为类方法不能访问实例变量,所以在类方法中不能使用关键字this。,类变量与类方法的一些说明,局部变量,类中的变量可分为成员变量(Member Variable)与局部变量(Local Variable)两类 成员变量在类体中定义,其作用域为整个类。成员变量在类中定义的顺序与位置并不影响它的作用域范围 局部变量的作用域(Scope)又称为局部变量的作用范围,它是变量可被使用的代码块范围;作用域决定了变量的可见性与生存时间。局部变量作用域开始于它的声明,持续到包含该局部变量的程序段结束之处。不同类型的局部变量,其作用域也不尽相同,局部变量的三种类型,定义于方法体内的局部变量:这类局部变量仅能在方法内使用,其作用域局限于所定义的方法体。复合语句(或称为语句块)中定义的局部变量:这类局部变量只在复合语句中有效。方法的形参也称为局部变量:这类局部变量的作用域覆盖整个方法。方法形参在方法被调用时被创建,并以调用方法传来的实参作为其初始值,当方法终止,调用结束时,这些形参自动被释放,其生命周期也随着终止。,局部变量的使用原则,局部变量不允许加Java修饰符,局部变量在使用前必须先声明,并赋初值,否则将出错,class People double 身高;/成员变量 booblean 性别=true;String 姓名,职业;public void 人物简介()/成员方法定义age=30;/合法,因为age为全局变量,且和定义位置无关String 爱好=“围棋”;/局部变量(“个人基本资料:”+姓名+年龄+性别+身高+职业+爱好);int age;public void speak(String s)(“我的娱乐是”+爱好);/非法,变量爱好是局部变量,局部变量,在变量定义过程中,有时会出现成员变量和局部变量同名的情况,此时,在出现局部变量的方法中,同名的成员变量会被隐藏,即这个成员变量会在这个方法内暂时失效。,This关键字,一个对象中的方法一般可以直接访问同一对象的成员变量。但是,有时候方法体内部定义的变量和成员变量名字相同,还有时方法的入口参数和对象的成员变量名字相同,那么就需要将三者区别清楚。因此,专门用 this 来指明当前对象的成员变量。通过this可以引用当前对象的成员变量或者调用当前对象的成员方法。语法格式如下:this.成员变量 this.成员方法(参数列表),This关键字,说明:(1)由于this用于表示指向当前对象的引用,所以它不能在类成员方法(静态方法)中使用,只能出现在实例成员方法中。(2)在类的方法体中,如出现形参或局部变量与成员变量同名的情况,系统默认的是形参或局部变量,若需要访问成员变量,则只能使用this来引用。(3)在没有以上同名情况的时候,对于当前对象的成员变量和成员方法的访问可以省略this引用。(4)this引用还可以用在重载的构造方法中,以调用本类已定义的构造方法。语法格式如下:this(参数列表)(5)在构造方法中,this()引用必须是第一行语句。,关键字this最常见的应用是在类的构造方法和实例方法中解决局部变量与成员变量同名的问题。例如,下面一段程序:public class People private String name;private int age;private char gender;private double height;private doublet weight;public People(String name,int age,char gender,double height,double weight)name=name;age=age;gender=gender;height=height;weight=weight;,This关键字,在上面的一段程序中,共有name、age、gender、height和weight5个实例变量。在构造方法中的5个参数的变量名称与实例成员变量的名称一一对应相同。在参数名或者局部变量名与实例成员变量同名的时候,由于参数变量和局部变量的优先级高,所以在方法体中参数名或者局部变量名将隐藏同名的实例成员变量。这种情况在Java语言中是不被允许的。如果想使实例变量和方法的参数或方法本身定义的局部变量同名的话,就需要用一种方法使实例成员变量与和其同名的方法参数或局部变量区分开来,这就要使用到this关键字。下面的一段程序改写了上面的程序,使People类的构造方法可以合法地使用与实例变量名称相同的参数。,This关键字,public class People private String name;private int age;private char gender;private double height;private doublet weight;public People(String name,int age,char gender,double height,double weight)this.name=name;this.age=age;this.gender=gender;this.height=height;this.weight=weight;,其中,使用this调用的都是实例变量,例如:this.name,而name是参数变量。由上面的实例,我们可以看出,this在方法体中用来指向调用当前正在执行方法的对象。当然我们也可以通过使用与实例变量名不同的参数名或者局域变量名来避免这个问题。,This关键字,public class Class27 int a;public Class27()a=10;public Class27(int a)a=a;public static void main(String args)Class27 ob1=new Class27();Class27 ob2=new Class27(20);Class27 ob3=new Class27(30);System.out.println(ob1.a);System.out.println(ob2.a);System.out.println(ob3.a);,一个使用this关键字的例子构造方法参数与成员变量重名,?,/源文件名:theThis.javaclass aThis int a1=1;int a2=2;void ss()int a1=10;int a2=20;(局部变量a1=+a1);(局部变量a2=+a2);(成员变量a1=+this.a1);(成员变量a2=+this.a2);public class theThis public static void main(String args)aThis aa=new aThis();aa.ss();,一个使用this关键字的例子-局部变量与成员变量重名,1成员方法调用成员方法根据其是否带有static修饰符可以分为类方法和实例方法。(1)实例方法调用的格式:对象名方法名(实参列表);例如:Circle c1=new Circle();/r1是对象名 System.out.println(“area=”+c1.getArea();(2)类方法调用的格式:类名方法名(实参列表);例如:public class Class14 static int a;static void setA(int b)a=b;public static void main(String args)Class14.setA(10);,方法调用及参数传递,方法调用方式分类,以表达式方式调用方法:对于有返回值的方法,将其作为表达式或表达式的一部分来调用。调用的形式为:变量=对象名.方法名(实际参数表);,以语句方式调用方法:对于返回值为空(void)的方法,一般以独立语句的方式进行调用。调用的形式为:对象名.方法名(实际参数表);,根据成员方法是否有返回值将调用方式分为两类:,public class EmpInfo String name;/雇员的姓名 String designation;/雇员的职务 String department;/雇员的部门 void print()/成员方法 System.out.println(name+is+designation+at+department);public static void main(String argv)EmpInfo employee=new EmpInfo();/创建对象并实例化 employee.name=Robert Javaman;/给成员变量赋值 employee.designation=Manager;/给成员变量赋值 employee.department=Coffee Shop;/给成员变量赋值 employee.print();/调用方法print(),方法参数传递机制,方法的参数是方法的输入接口,是外界传递给方法进行加工操作的数据,方法的参数传递机制是指采用何种方式将实参传递给形参,2参数传递(1)形参和实参,【例】程序题目public class Test public int min(int a,int b)int c;c=(ab)?a:b;return c;public static void main(String args)int min=0,x=10,y=20;Test t=new Test();min=t.min(x,y);System.out.println(“min is”+min);,方法调用及参数传递,(2)参数传递分为:按值传递 和引用传递,【例】程序题目class Test void method(int i,int j)i=i+10;j=j-10;public class CallByValue public static void main(String args)Test object=new Test();int a=25,b=30;(调用前a和b的值:+a+b);object.method(a,b);(调用后a和b的值:+a+b);,参数传递,Java 方法的参数是基本数据类型时,是按值传递的(pass by value)。按值传递就是将实参的值复制一份赋值给方法的形参,方法对形参的任何更改影响的只是实参的复制值,并不会对实参的真实值产生影响,(3)引用传递:当参数为数组和对象时,传递的方式为引用传递。按引用传递就是将实参的引用(指向实参值的地址)复制一份赋值给方法的形参,方法对形参的操作实际就是对形参引用对象的操作,此时,引用对象的内容可以在被调用的方法中改变,但实参中的引用值作为传递给形参的副本,并不能被改变。因此,在引用传递方式中,方法对于形参的改变会影响到实参的内容,【例】程序题目/当参数为数组时,传递的方式为引用传递public class T2 public static void main(String args)int a=1,2,3;static void method2(int a)a0=0;a1=7;a2=8;method2(a);System.out.println(a0);System.out.println(a1);System.out.println(a2);,参数传递,【例】程序题目/当参数为对象时,传递的方式为引用传递class Test int a,b;Test(int i,int j)a=i;b=j;void method(Test ob)/传递一个对象ob.a=ob.a+10;ob.b=ob.b-10;public class CallByReference public static void main(String args)Test object=new Test(25,30);(调用前object.a和object.b的值:+object.a+object.b);object.method(object);(调用后object.a和object.b的值:+object.a+object.b);,参数传递,引用传递会改变实参的值,1。创建一个Rectangle类。该类拥有属性length和width,该类