第三章 方法、方法重载、构造方法ppt课件.ppt
类的方法,方法:是类或对象的行为特征的抽象,方法是一个命名的代码块,如同数学中的函数作用:方法只能完成一个特定的功能,它可以把程序中的特定功能组合到一起,便于多次使用。也使程序变得清晰。声明格式:修饰符 返回值类型 方法名(形参列表)局部变量声明执行语句,类的方法,声明格式:修饰符 返回值类型 方法名(形参列表) 局部变量声明执行语句返回值类型:基本数据类型或引用数据类型方法名:符合标识符的命名规则 方法名后必需加()形参:接收方法调用者传递过来的数据,可以是基本数据类型或引用 数据类型,多个参数以,号隔开 实参:调用方法时实际传递给方法的参数方法返回值:用return 语句,把一个确定的值返回给调用者,return 的返回值 类型必需与声明的返回值类型匹配,无返回 值用void关键字,值传递,Java中进行赋值操作或方法调用中传递参数时,遵循值传递的原则:基本类型数据传递的是该数据的值本身引用类型数据传递的是对对象的引用(句柄),而非对象本身,类的方法,1、写出狮子对象的“跑”方法、 “叫”方法,电动玩具狮子属性:颜色:黄色行为:跑叫,按此按钮,狮子开始叫,按此按钮,狮子开始跑,类的方法示例,AutoLion类代码实现,ublic class AutoLion String color = 黄色; public void run() System.out.println(正在以0.1米/秒的速度向前奔跑); public String bark() String sound = 大声吼叫 ; return sound; ,方法体,返回类型,方法名称,如何定义类的方法,类的方法定义类的某种行为(或功能),方法的名称,方法的主体,方法返回的数据类型,定义类的方法,ublic 返回值类型 方法名() /这里编写方法的主体,步骤一:定义方法名以及返回值,步骤二:编写方法体,方法的返回值,两种情况如果方法具有返回值,方法中必须使用关键字return返回该值,返回类型为该返回值的类型如果方法没有返回值,返回类型为void,ublic class Student String name = 张三; public void getName() return name; ,返回类型要匹配,return 表达式;,编译错误,作用: 跳出方法给出结果,方法调用,方法是个“黑匣子”,完成某个特定的应用程序功能,并返回结果方法调用:执行方法中包含的语句,对象名.方法名();,2、小明过生日,爸爸送他一个电动狮子玩具,编程测试这个狮子能否正常工作,方法调用,ublic class AutoLion String color = 黄色; /颜色 /*跑*/ public void run() System.out.println(正在以0.1米/秒的速度向前奔跑。); /*叫*/ public String bark() String sound = 大声吼叫 ; return sound; /*获得颜色*/ public String getColor() return color; /*显示狮子特性*/ public String showLion() return 这是一个 + getColor() + 的玩具狮子!; ,public class TestLion public static void main(String args) AutoLion lion = new AutoLion(); System.out.println(lion.showLion(); lion.run(); System.out.println(lion.bark(); ,在类的方法中调用该类另一个方法,在main()方法中调用类的方法,方法调用小结,方法之间允许相互调用,不需要知道方法的具体实现,提高了效率,ublic class Studentpublic void showInfo() return 我是一名学生; ,方法的返回类型为void,方法中不能有return返回值!,常见错误4-1,public class Studentpublic double getInfo() double weight = 95.5; double height = 1.69; return weight, height; ,方法不能返回多个值!,常见错误4-2,ublic class Studentpublic String showInfo()return 我是一名学生;public double getInfo() double weight = 95.5; double height = 1.69; return weight; ,多个方法不能相互嵌套定义!,常见错误4-3,ublic class Studentpublic String showInfo()return 我是一名学生;public double getInfo()double weight = 95.5; double height = 1.69; return weight;,ublic class Studentint age=20;if(age20) System.out.println(年龄不符合入学要求!); public void showInfo()return 我是一名学生;,不能在方法外部直接写程序逻辑代码!,常见错误4-4,小结1,编写电池类(Cell):具有品牌属性,可以续电编写测试类(TestCell),成员变量和局部变量2-1,变量声明的位置决定变量作用域变量作用域确定可在程序中按变量名访问该变量的区域,for(int i = 0, a = 0; i 4; i+) a+;System.out.println ( a );,代码错误,a的作用域仅在for循环中,成员变量和局部变量2-2,变量1类型 变量1; 变量2类型 变量2;变量3类型 变量3;,ublic 返回类型 方法1() 变量4类型 变量4;public 返回类型 方法2() 变量5类型 变量5; ,public class AutoLion,AutoLion类的方法,其他类的方法,谁能使用这些变量?,方法1,方法2,成员变量,局部变量,局部变量,成员变量和局部变量的区别,作用域不同局部变量的作用域仅限于定义它的方法成员变量的作用域在整个类内部都是可见的初始值不同Java会给成员变量一个初始值Java不会给局部变量赋予初始值在同一个方法中,不允许有同名局部变量;在不同的方法中,可以有同名局部变量,ublic class Test int score1 = 88; int score2 = 98; public void calcAvg() int avg = (score1 + score2)/2; public void showAvg() System.out.println(平均分是: + avg); ,常见错误,局部变量avg的作用域仅限于calcAvg()方法,方法重载Overload,Java允许一个类中定义多个同名的方法,只要形参列表不同就可以,如果同一个类中包含两个或两个以上的方法名称相同 ,则称为方法重载要求:方法名相同参数类型、个数,顺序至少有一项不同方法的返回类型可以不相同方法的修饰符可以不同原则:只对不同的数据完成基本相同的任务的方法才用方法重载,方法重载Overload,优点:不必对相同的操作使用不同的方法名有助于更轻松的理解和调试代码易于维护代码,public class Math int max(int a,int b) return ab?a:b; double max(double a,double b)return ab?a:b; ,Math类中两个max方法,满足重载条件,生活中的方法重载,类,方法,方法参数,方法实现,司机,轿车,巴士,火车,驾驶,启动、行驶、,等待乘客上车、启动、行驶、到站停车、,正点发车、行驶、到站停车、,如果用代码实现,我们需要三个方法,这些方法的方法名称相同,参数类型不同,方法重载的代码示例 1,方法重载并不陌生java.io.PrintStream类的println方法能够打印数据并换行,根据数据类型的不同,有多种实现方式,public class Test public static void main(String args) int i = 0;char c = z;String str = hello;System.out.println(i);System.out.println(c);System.out.println(str);,PrintStream,println(int)println(char)println(String),方法名相同,参数类型不同,调用不同的println方法,方法重载,方法重载的代码示例 2,java.lang.Math类的max()方法能够从两个数字中取出最大值,它有多种实现方式运行时,Java虚拟机先判断给定参数的类型,然后决定到底执行哪个max()方法,public class Test public static void main(String args) Math.max(1,2);Math.max(1.0F,2.F);Math.max(1.0,2);,方法重载,构造方法重载 2-1,构造方法重载是方法重载的典型示例,ublic classTeacher7 private String name; / 教员姓名private String school = 长沙; / 所在中心publicTeacher7(String name) this.name = name; /设定教员姓名publicTeacher7(String name, String school) this.name = name; /设定教员姓名this.school = school; /设定教员的所在中心public String introduction() return 大家好!我是 + school + 的 + name ;,构造方法重载,构造方法重载 2-2,通过调用不同的构造方法来表达对象的多种初始化行为例如:默认情况下,教师来自北京中心,初始化时,只需提供教员姓名有时,需要提供所在中心名称及教员姓名,ublic classTeacher7Test public static void main(String args) Teacher7 teacher1 = newTeacher7(李芳);System.out.println(teacher1.introduction();AccpTeacher7 teacher2 = newTeacher7(张欣, 天津中心);System.out.println(teacher2.introduction();,大家好!我是北京中心的李芳大家好!我是天津中心的张欣,方法重载(常见错误),public class Math int Max(int a,int b) return ab?a:b; int max(int b,int b)return ab?a:b; ,方法名不相同,不构成重载,构造方法,构造方法是一个特殊的方法,用于创建类的对象,并完成一些初始化工作,它总是与new关键字一起使用来创建对象.要求:方法名必需与类名相同不能声明返回类型构造方法不能被子类继承,不能被static,final,abstract,native修饰重载构造方法当创建一个对象时,在不同的条件下,可能有不同的初始化行为,则需定义不同的构造方法,构造方法,默认的构造方法默认的构造 方法是指无参数的构造方法,可分为两种隐含的默认构造方法程序显示定义的默认构造方法在一个类中,没有定义构造方法,java编译器会提供一个无参数的构造 方法,如果定义了构造方法,则编译器不会提供默认的无参构造方法.,构造方法示例,public class PersonString name ;public Person() public Person(String _name) name = _name; ,构造方法,重载构造方法,构造方法(常见错误),public class PersonString name ;public void Person() public Person(String _name) name = _name; public static void main(String args ) Person p = new Person(); ,方法有返回类型,尽管是一个方法,但不是构造方法,编译错误,默认无参数的构造方法在自定义了构造方法后,java编译器不再提供,无法调用无参构造方法创建Person类的实例,给定如下Java代码,请指出代码中的错误,并解释原因。,public class Sample private int x;public Sample() x = 1;public Sample(int i) x = i;public int Sample(int i) x = i;return x+;private Sample(int i, String s)public Sample(String s,int i)private Sampla(int i)x=i+; private void Sampla(int i)x=i+; ,总结,无参构造方法,带参构造方法,不是构造方法,带参构造方法,带参构造方法,名称与类名不相同,不是构造方法,小结 4,编写一个类Book3,代表教材:具有属性:名称(title)、页数(pageNum)、种类(type)具有方法:detail,用来在控制台输出每本教材的名称、页数、种类具有两个带参构造方法:第一个构造方法中,设置教材种类为“计算机”(固定),其余属性的值由参数给定;第二个构造方法中,所有属性的值都由参数给定编写测试类Book3Test进行测试:分别以两种方式完成对两个Book3对象的初始化工作,并分别调用它们的detail方法,看看输出是否正确,方法递归调用,递归:在方法体内部调用自身称为递归注:递归必需有一个明确的递归结束条件,称之为递归出口计算n的阶乘:调用过程如下,static int method(int n)if (n=1)return 1; return n* method(n-1);,static int method(int n)if (n=1)return 1; return n* method(n-1);,static int method(int n)if (n=1)return 1; return n* method(n-1); ,n=3,n=2,n=1,Return 1,Return 2*1,Return 3*2,