《对象的行为成员方法.ppt》由会员分享,可在线阅读,更多相关《对象的行为成员方法.ppt(66页珍藏版)》请在三一办公上搜索。
1、1,JAVA面向对象程序设计JAVA Object-Oriented Programming,授课教师:文 斌,2012 Fall,Hainan Normal University,2,授课内容,01了解Java02 面向对象的“对象”03 对象的属性-变量详述 04 对象的行为-成员方法详述 05 生命周期及作用域06 Java常用类与函数库07 面向对象中的继承08 深入多态09 使用异常处理 10 基于swing的图形界面编程 11 可视化程序的事件处理 12 Java多线程,3,授课内容,01了解Java02 面向对象的“对象”03 对象的属性-变量详述 04 对象的行为-成员方法详述
2、 05 生命周期及作用域06 Java常用类与函数库07 面向对象中的继承08 深入多态09 使用异常处理 10 基于swing的图形界面编程 11 可视化程序的事件处理 12 Java多线程,4,Chap 04 对象的行为-成员方法详述,进一步掌握方法的定义和使用掌握类的构造方法的概念和编写、使用掌握方法的重载掌握Getters与Setters方法的规范编写理解封装的含义,5,Java中的方法,Java中的方法类似C语言中的函数,是一个可以被多次调用的相对独立的代码块,或者说是用来完成一个特定的任务的一小段程序。我们已经见过的方法有:public static void main(Strin
3、g args);void setDim(double w,double h,double d);double getArea();,6,方法定义的格式,方法定义的格式:修饰符 返回值类型 方法名称(参数列表)/方法体中的语句在 前面是方法头,中间是方法体。在 中的部分是可选项。根据需要可以不同,也可以没有。,7,自定义一个方法,public static void max(int a,int b)int m;if(ab)m=a;else m=b;System.out.println(“max=”+m);,修饰符 返回值类型 方法名称(参数列表)/方法体中的语句,8,定义方法相关说明,publi
4、c表示该方法是公开的,在别的类和方法里面都能“看到”这个方法。static表示只有在静态方法里面才能访问这个方法。void表示这个方法没有返回值。方法的参数列表说明在调用它时需要传入数据的个数、及每个的类型。,9,方法的调用,使用方法实现特定功能叫做方法的调用。public class App public static void main(String s)int a=5,b=10,m1,m2;max(a,b);max(b,7);,调用方法时只写方法名称和实际要处理的数据,如不需要传递数据则只写方法名称和小括号。,10,方法调用的相关说明,一般形式:方法名(实参)注意:不写类型,只写方法名称
5、和实际参数(有时不写),括号不能省。与方法定义的形式相一致:参数的类型、参数的个数、参数的次序。无返回值的方法,其调用可作为单独语句。有返回值的方法,其调用可放在表达式中,或作为其他方法调用的参数。,11,方法的返回值,通过方法调用得到一个确定的值,就是方法的返回值。方法的返回值是通过方法中的return语句获得的。在return这个关键字后面是一个可以接受的值,它可以是一个简单的值,也可以是一个变量,还可以是一个表达式。在定义方法时return语句中数据的类型要和指定返回值的类型一致,或者可以自动转换成返回要求的类型。,12,public static int max(int x,int y
6、)return(xy?x:y);public static void main(String args)int num=10,m;m=max(num,20);(“最大值是”+m);,带返回值的方法,定义方法的返回值类型为整型,通过return语句将返回值返回到调用位置,13,方法的参数,方法的形式参数:“形参”通常是方法所处理的数据、影响方法功能的因素或者方法处理的结果。如无需传递数据则可以为空。,public static int max(int x,int y)return(xy?x:y);,public static void welcome()(“*”);(“欢迎使用本程序”);(“*
7、”);,14,方法的实际参数:调用一个方法时,方法名后面小括号中的参数称为“实际参数”。实参可以认为是真正参与实际操作被处理的内容。实参可以是常量、变量或表达式,但要求它们有确定的值。,方法的参数,int a=-3,b=5,c;c=max(4,a+b);,15,方法的参数,方法的参数可以是复杂类型的数据,如类的对象、数组等。数组作为方法的形式参数,要写清楚类型和中括号。数组作为方法的实参,只写数组名称。,double aver(double arr)/求形参数组arr所有元素的平均值;double price=12.5,36.9,8.7,3,4.5;double a=aver(price);,
8、16,方法的参数,基本类型数据作方法的参数,实参变量对形参变量的数据传递是“单向值传递”,即只由实参传给形参,而形参不能传回给实参。public static void main(String s)int a=2,b=3;fun(a,b);static void fun(int x,int y)x=10;y=15;,17,方法的参数,引用类型的参数(如数组、对象),实参代表的是数据的引用,即地址。实参将引用传递给形参,两边共用一个地址空间的数据。此时在方法内部对引用的数据作任何操作,结果将被保留。注意数组作函数的参数,形参的里什么都不写。调用时实参只写数组名称。,18,方法的参数,数组作方法的
9、参数举例:import java.util.*;class ParamDemo02 public static void main(String args)int score=new int10;Scanner reader=new Scanner(System.in);for(int i=1;im)m=si;return m;,19,方法的参数,对象作方法的参数举例:import java.util.*;public class MyFirstApp static Scanner reader=new Scanner(System.in);public static void main(St
10、ring args)Hair hisHair=new Hair();(调用方法前);hisHair.printInfo();change(hisHair);(调用方法后);hisHair.printInfo();public static void change(Hair h)(请输入新的颜色);h.setColor(reader.next();(请输入新的发型);h.setStyle(reader.next();class HairString color=黑色;String style=板寸;void printInfo()(头发的颜色是+color+造型是+style);void set
11、Color(String c)color=c;void setStyle(String s)style=s;,20,类中方法的相关说明,在同一个类内部的方法:在类的内部,成员方法可以对该类的成员变量直接访问。class Box int width,height,depth;void setDim(int w,int h,int d)width=w;height=h;depth=d;,21,类中方法的相关说明,在同一个类内部的方法:在类的内部,成员方法之间可以相互直接访问(调用)。class Box int width,height,depth;void setDim(int w,int h,i
12、nt d)width=w;height=h;depth=d;printInfo();void printInfo()(“长:”+width+”宽:”+height+”高:”+depth);,22,类中方法的相关说明,在同一个类内部的方法:在类的内部,static修饰过的静态成员可相互访问,其他成员不能访问static修饰的成员。相关内容将在第五部分具体介绍。,23,类中方法的相关说明,在不同类之间的方法:在一个类的“外界”想要访问类内部的成员方法,需要使用该类创建对象。通过创建的实体(即对象)配合分量运算符“.”的使用,进行方法的调用。格式为:对象.方法名(实参),Box b1=new Box
13、();b1.setDim(3,4,5);,24,类中方法的相关说明,在不同类之间的方法:static修饰过的方法可以在该类的外部通过类名.方法名(实参)进行调用。如Math.sqrt(85);Static相关内容将在第五部分详细讲解,此处不再展开。,25,课后练习,1.编写Java应用程序,定义一个计算两个整数和的方法static int add(int op1,int op2)。在main方法中声明两个整型变量,分别赋值,调用add()方法得到它们的和,在屏幕上输出结果。,public class AddTest public static void main(String args)int
14、 num1,num2;num1=10;num2=20;System.out.println(num1+num2+=+add(num1,num2);static int add(int op1,int op2)return op1+op2;,27,2、编写程序,定义一个方法public static void abs(int a),用来求绝对值并输出结果。在main方法中从命令行读入一个整数,调用这个结果求它的绝对值。,import;public class Demopublic static void main(String args)Scanner reader=new Scanner(Sy
15、stem.in);(请输入一个整数);int n=reader.nextInt();abs(n);public static void abs(int a)if(a=0)(绝对值是+a);else(绝对值是+(-a);,29,3.在上述题目的基础上,修改abs成为带返回值的方法,即public static int abs(int a),实现相同的功能。,import;public class Demopublic static void main(String args)Scanner reader=new reader(System.in);(请输入一个整数);int n=reader.n
16、extInt();(绝对值是+abs(n);public static int abs(int a)if(a=0)return a;elsereturn-a;,31,3.在上述题目的基础上,修改abs成为带返回值的方法,即public static int abs(int a),实现相同的功能。,import;public class Demopublic static void main(String args)Scanner reader=new reader(System.in);(请输入一个整数);int n=reader.nextInt();(绝对值是+abs(n);public s
17、tatic int abs(int a)if(a=0)return a;elsereturn-a;,33,4.定义一个方法public static void draw(int n,char ch),实现输出n个ch符号。在main方法中提示用户输入相应数据,调用draw方法输出图形。,import;public class Multiplication public static void main(String args)Scanner reader=new Scanner(System.in);(要显示哪个符号?);char c=reader.next().charAt(0);(要显示多
18、少个?);int num=reader.nextInt();draw(num,c);public static void draw(int n,char ch)for(int i=1;i=n;i+)System.out.print(ch);();,35,5.求数值累加和的方法,public class App4 static int sum(int n)int s=0;for(int i=1;i=n;i+)s+=i;return s;public static void main(String s)System.out.println(“110的累加和是”+sum(10);,37,作业一,38
19、,方法的重载,多个方法有相同的名字,不同的参数,便是方法的重载。调用方法时编译器会自动根据实参表找到最匹配的方法去执行。找不到、或找到多个,均产生错误。“貌似同一个方法,体现出不同功能”,方法的重载是面向对象程序设计多态的实现方式之一。,39,方法的重载,在一个类和它的子类中,可以定义同名的方法,叫方法重载,只要它们的参数列表各不相同,与返回类型无关。所谓参数列表各不相同是指:参数的个数不同;参数的类型不同;参数的顺序不同。,一个方法的重载也可以返回不同的数据类型,但常用的是返回相同的类型。,40,方法的重载举例,重载Volume类中计算体积的方法,class Volume public in
20、t getVol(int l)return l*l*l;public int getVol(int l,int w,int h)return l*w*h;,方法名称相同而参数列表不同实现方法的重载,41,方法的重载举例,重载方法的调用。,class Volume public int getVol(int l)return l*l*l;public int getVol(int l,int w,int h)return l*w*h;,Volume b=new Volume();System.out.println(b.getVol(10);System.out.println(b.getVol
21、(7,8,9);,重载方法调用时根据其参数类型、个数和顺序来区分。,1000 504,42,方法的重载,注意:方法参数列表中参数名称的不同不能构成方法的重载。方法重载不正确的例子:void func1(int n,int m)void func1(int x,int y)void func2(float f,int n,char c)void func2(float m,int k,char x),43,构 造 方 法,构造方法是一类特殊的方法,从功能上讲,它是用来对新创建的对象进行初始化的;从形式上来讲,它有以下特点:它与类同名它没有任何返回值除了上述两点外,在语法结构上与一般的方法相同,4
22、4,构 造 方 法,Java要求程序中每个变量在使用前都要先初始化,包括新创建的对象。在我们使用new关键字来创建一个类的对象时,我们实际上是在调用这个类的一个构造方法对对象进行构造。如果Java在一个类里找不到自定义的构造方法,它就为这个类添写一个默认无参构造方法,该构造方法无任何执行语句,我们在程序代码中看不到它。之前我们编写的类,在创建对象时都是使用的默认构造方法。,45,构 造 方 法,构造方法“努力”构建对象,并且对对象进行初始化,如果需要,可以自己编写构造方法,在里面放上我们自己的初始化代码。一旦我们在类中自己定义了构造方法,Java不再自动增加默认无参构造方法。如果需要,必须自己
23、将无参形式的构造方法写出来。构造方法也可以重载。,46,构造方法的定义,重写Box class使它带有自己的构造方法。class Box Box()width=10;height=10;depth=10;System.out.println(“Box的构造方法被调用了!”);double volume()return width*height*depth;double width;double height;double depth;,这一句是为了让我们能看到构造方法被调用的事实,除此以外没有任何意义。实际上,构造方法里是不会有与输入/输出有关的代码的,47,构造方法的使用,实例化对象时自动调
24、用构造方法。class BoxConstructorDemo public static void main(String s)Box myBox=new Box();Box hisBox=new Box();double myVol=myBox.volume();double hisVol=hisBox.volume();System.out.println(“myVol is”+myVol);System.out.println(“hisVol is”+hisVol);,Box的构造方法被调用了!Box的构造方法被调用了!myVol is 1000.0hisVol is 1000.0,两次
25、创建Box的对象,所以构造方法被调用了两次,因为值是在构造方法里设定的,所以得到相同的结果。,48,有参构造方法的定义,class Box Box()width=10;height=10;depth=10;System.out.println(“Box的无参数构造方法被调用了!”);Box(double w,double h,double d)width=w;height=h;depth=d;System.out.println(“Box的有参数构造方法被调用了!”);double volume()return width*height*depth;double width;double he
26、ight;double depth;,49,有参构造方法的使用,class BoxConstructorDemo2 public static void main(String s)Box myBox=new Box();Box hisBox=new Box(3,6,9);double myVol=myBox.volume();double hisVol=hisBox.volume();System.out.println(“myVol is”+myVol);System.out.println(“hisVol is”+hisVol);,两次创建Box的对象,调用了不同的构造方法,Box的无参
27、数构造方法被调用了!Box的有参数构造方法被调用了!myVol is 1000.0hisVol is 162.0,有参数的构造方法可以重新设定Box的长、宽、高值,50,学生类,包含学号、姓名、成绩,class Student int num;String name;double score;Student()/无参构造方法 num=101;name=“小明”;score=85;/有参构造方法 Student(int n,String na,double s)num=n;name=na;score=s;,51,class Student int num;String name;double s
28、core;Student()num=101;name=“小明”;score=85;Student(int n,String na,double s)num=n;name=na;score=s;void show()System.out.println(num+name+score);,public class TestStu public static void main(String s)Student stu1=new Student();stu1.show();/通过对象调用类的方法实现对本对象的操作 Student stu2=new Student(105,”小强”,76);stu2.
29、show();,101小明85105小强76,52,构造方法的重载,class Box int length,width,height;Box()length=10;width=10;height=10;Box(int l,int w,int h)length=l;width=w;height=h;,Box b1=new Box();Box b2=new Box(7,8,9);,53,封装与Getters、Setters方法,面向对象编程的核心思想之一就是将数据和对数据的操作封装在一起。如定义类。封装对对象的使用者实现了数据的隐藏。实现封装的关键在于绝不能让类中的方法直接访问其他类的成员变量,
30、但可以访问它自己的成员变量。封装使得程序仅通过对象的方法与对象数据进行交互,提高了重用性和可靠性。,54,封装与Getters、Setters方法,与数据进行交互的两种标准方法:Getters访问器方法:仅访问成员变量而不对其进行修改的方法。方法名通常为”get成员变量名”,如getName()、getScore()。Setters更改器方法:对成员变量做出修改的方法。方法名通常为”set成员变量名”,如setPassword()。,55,封装与Getters、Setters方法,使用相应方法访问成员变量的优点:在类的内部改变变量或方法实现,不会影响其他代码。如变量名称的变化。可以在方法内执行
31、错误检查、提供安全操作步骤。而直接对变量进行操作将不会做这写处理。如数值有效性审核(成绩、工资、帐户余额),56,小结,方法的定义与调用;形参与实参之间的关系;无返回值的方法定义时类型为void,调用时自成独立语句;有返回值的方法定义时指名类型,通过return把值返回到方法调用位置,方法调用作为结果要进行应用;同名不同参数表的多个方法形成方法重载。构造方法的编写和使用,构造方法的重载。封装的关键、定义与成员变量相关的方法。,57,6.定义一个类Initial,类的内部重载initArr()方法,分别实现对整型数组、双精度型数组、字符串数组的初始化功能,数组作为方法的参数,方法体内提示用户为数
32、组元素输入数据,然后显示所有元素。在main方法中创建三种类型的数组,创建Initial类的对象,分别调用initArr()方法进行初始化。,import java.util.*;public class OverLoad2 public static void main(String args)/TODO Auto-generated method stubScanner reader=new Scanner(System.in);Initial init=new Initial();int a=new int6;init.initArr(a);double b=new double5;in
33、it.initArr(b);String s=new String3;init.initArr(s);,class InitialScanner reader=new Scanner(System.in);void initArr(int arr)(初始化整型数组);for(int i=0;iarr.length;i+)(请输入第+(i+1)+个整数);arri=reader.nextInt();(整型数组初始化完毕,所有元素为:);for(int i=0;iarr.length;i+)System.out.print(arri+);System.out.println(n-);,void i
34、nitArr(double arr)(初始化双精度型数组);for(int i=0;iarr.length;i+)(请输入第+(i+1)+个双精度数);arri=reader.nextDouble();(双精度型数组初始化完毕,所有元素为:);for(int i=0;iarr.length;i+)System.out.print(arri+);System.out.println(n-);void initArr(String arr)(初始化字符串型数组);for(int i=0;iarr.length;i+)(请输入第+(i+1)+个字符串);arri=reader.next();(字符串
35、型数组初始化完毕,所有元素为:);for(int i=0;iarr.length;i+)System.out.print(arri+);System.out.println(n-);,61,7.定义一个类MathDemo,类的内部重载round()方法,分别实现对单精度、双精度类型数据进行四舍五入的功能,要处理的实型数据作为参数,方法体最后将得到的结果返回。在main方法中定义float与double类型变量,分别赋好初值,创建MathDemo类的对象,调用round()方法,将结果显示在屏幕上。,import java.util.*;public class OverLoad3public
36、static void main(String args)/TODO Auto-generated method stubfloat x=3.475f;double y=3432.934;System.out.println(x+四舍五入后为+MathDemo.round(x);System.out.println(y+四舍五入后为+MathDemo.round(y);,class MathDemostatic Scanner reader=new Scanner(System.in);static int round(float a)int n=(int)a;if(a-n=0.5)return n+1;elsereturn n;static long round(double a)long n=(long)a;if(a-n=0.5)return n+1;elsereturn n;,64,授课内容,01了解Java02 面向对象的“对象”03 对象的属性-变量详述 04 对象的行为-成员方法详述 05 生命周期及作用域06 Java常用类与函数库07 面向对象中的继承08 深入多态09 使用异常处理 10 基于swing的图形界面编程 11 可视化程序的事件处理 12 Java多线程,65,作业二,66,问题?,