成员方法
基本介绍
在某些情况下,我们要需要定义成员方法(简称方法)。比如人类:除了有一些属性外( 年龄,姓名..),我们人类还有一 些行为比如:可以说话、跑步..,通过学习,还可以做算术题。这时就要用成员方法才能完成。现在要求对 Person 类完善。
成员方法快速入门
- 添加speak成员方法,输出“我是一个好人”
- 添加cal01成员方法,可以计算从1+…+1000的结果
- 添加cal02成员方法,该方法可以接受一个数n,计算从1+…+n的结果
- 添加getSum成员方法,可以计算两个数的和
public class Method01 {
public static void main(String[] args) {
// 方法使用
// 1.方法写好后,如果不去调用,不会输出
// 2.先创建对象,然后调用方法即可
Person p1=new Person();
p1.speak();//调用方法
p1.cal01();//调用cal01
p1.cal02(10);//调用cal02
//调用getSum方法,同时num1=10,num2=20
//把方法getSum返回的值,赋给变量returnRes
int returnRes =p1.getSum(10,20);
System.out.println("getSum方法返回的值="+returnRes);
}
}
class Person{
String name;
int age;
//方法(成员方法)
//添加speak 成员方法,输出“我是一个好人”
//解读
//1.public 表示方法是公开的
//2.void:表示方法没有返回值
//3.speak():speak是方法名; ()形参列表
//4.{}方法体,可以写我们要执行的代码
//5.System.out.println("我是一个好人");表示我们的方法就是输出一句话
public void speak() {
System.out.println("我是一个好人");
}
//添加cal01 成员方法,可以计算从1+...+1000的结果
public void cal01(){
//循环完成
int res =0;
for(int i=1;i<=1000;i++) {
res+=i;
}
System.out.println("计算结果="+res);
}
//添加cal02的方法,该方法可以接受一个数n,计算从1+..+n的结果
//解读
//1.(int n)形参列表,表示当前有一个形参n,可以接受用户输入
public void cal02(int n){
int res =0;
for(int i=1;i<=n;i++) {
res+=i;
}
System.out.println("cal02的计算结果="+res);
}
//添加getSum成员方法,可以计算两个数的和
//解读
//1.public表示方法是公开的
//2.int:表示方法执行后,返回一个int值
//3.getSum方法名
//4.(int num1,int num2)形参列表,2个形参,可以接受用户传入的两个数
//5.return res;表示把res的值,返回
public int getSum(int num1,int num2){
int res =num1+num2;
return res;
}
}
//方法调用小结
/*
*1.当程序执行到方法时,就会开辟一个独立的空间(栈空间)
*2.当方法执行完毕,或者执行到return语句时,就会返回;
*3.返回到调用方法的地方
*4.返回后,继续执行方法后面的代码
*5.当main()方法(栈)执行完毕,整个程序退出
* */
方法的调用机制原理
分析getSum
为什么需要成员方法
看一个需求
请遍历一个数组,输出每个数组的各个元素值解决思路
- 传统方法:使用单个for循环,将数组输出
- 定义一个类MyTools,写一个成员方法,调用方法实现
public class Method02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//使用方法完成数组
MyTools too1=new MyTools();
too1.printArr(map);
too1.printArr(map);
too1.printArr(map);
//遍历map数组
//传统的解决方式就是直接执行
// for(int i=0;i<map.length;i++) {
// for(int j=0;j<map[i].length;j++) {
// System.out.print(map[i][j]+" ");
// }
// System.out.println();
// }
//....
//
//要求再次遍历
}
}
//把输出的功能,写到一个类的方法中,然后调用该方法即可
class MyTools{
//方法,接受一个二维数组
public void printArr(int[][] map) {
System.out.println("==============");
//对传入的map数组进行遍历输出
for(int i=0;i<map.length;i++) {
for(int j=0;j<map[i].length;j++) {
System.out.print(map[i][j]+"\t ");
}
System.out.println();
}
}
}
//方法的好处:1.提高了代码的复用性
//成员方法的定义
//public返回数据类型 方法名(形参列表..){ //方法体
// 语句
// return 返回值;}
/*1.参数列表:表示成员方法输入 cal(int n)
2.数据类型(返回类型):表示成员方法输出,void表示没有返回值
3.方法主题:表示为了实现某一功能的代码
4.return语句不是必须的
*/
//访问修饰符有public protected 默认 private
成员方法的好处
- 提高代码的复用性
- 可以将实现的细节封装起来,然后供其他用户来调用即可
成员方法的定义
访问修饰符 返回数据类型 方法名(形参列表) {//方法体 语句;[return 返回值;]}
- 形参列表:表示成员方法输入 cal(int n),getSum(int num1,int num2)
- 返回数据类型:表示成员方法输出,void表示没有返回值
- 方法主体:表示为了实现某一功能代码块
- return语句不是必须的
注意事项和使用细节
public class MethodDetail01{
public static void main(String[] args) {
// TODO Auto-generated method stub
//1.一个方法最多有一个返回值【思考,如何返回多个结果 返回数组】
AA a=new AA();
int res[]=a.getSumAndSub(1, 4);
System.out.println("和="+res[0]);
System.out.println("差="+res[1]);
//细节:调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型 的参数
byte b1 =1;
byte b2=2;
a.getSumAndSub(b1,b2);//byte->int
// a.getSumAndSub(1.1,1.8);// double ->int(x)
//细节:实参和形参的类型要一致或兼容、个数、顺序必须一致
// a.getgetSumAndSub(100);//个数不一致×
//细节:方法不能嵌套定义
}
}
class AA{
public int[] getSumAndSub(int n1,int n2) {
int[] resArr =new int[2];
resArr[0]=n1+n2;
resArr[1]=n1-n2;
return resArr;
}
//2.返回类型可以为任意类型,包含基本数据类型或应用类型(数组,对象)
// 看getSumAndSub
//3.如果方法要求有返回数据类型,则方法中最后的执行语句必须为 return值
//而且要求返回值类型必须和return的值类型一致或兼容
//如果方法是void,则方法体中可以没有return语句,或者 只写return
}
- 访问修饰符(作用是控制 方法 使用的范围)
- 如果不写默认访问,[有四种:public,protected,默认,private]
- 返回数据类型
- 一个方法最多有一个返回值[如何返回多个结果? 返回数组]
- 返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)
- 如果方法要求有返回数据类型,则方法体中最后的执行语句必须为 return 值; 而且要求返回值类型必须和 return 的值类型一致或兼容
- 如果方法是 void,则方法体中可以没有 return 语句,或者只写 return
- 方法名
遵循驼峰命名法,最好见名知意,开发中按照规范
- 形参列表
- 一个方法可以有0个参数,也可以有多个参数,中间用逗号隔开,比如getSum(int n1,int n2)
- 参数类型可以为任意类型,包含基本数据类型或引用类型,比如printArr(int[] map)
- 调用带参数的方法,一定对应着参数列表传入相同类型或兼容类型的参数
- 方法定义时的参数称为形式参数,简称形参;方法调用时的传入参数称为实际参数,简称实参,实参和形参的类型要一致或兼容、个数、顺序必须一致
- 方法体
里面写完成功能的具体的语句,可以为输入、输出、变量、运算、分支、循环、方法调用,但里面不能再定义方法!即:方法不能嵌套定义
- 方法调用的细节说明
1.同一个类中的方法调用:直接调用即可。比如print(参数)
2.跨类中的方法A类调用B类方法:需要通过对象名调用。比如对象名.方法名(参数)
3.特别说明一下:跨类的方法调用和方法的访问修饰符相关
类定义的完善
练习题
- 编写类 AA ,有一个方法:判断一个数是奇数 odd 还是偶数,返回boolean
- 根据行、列、字符打印 对应行数和列数的字符,比如:行:4,列:4,字符#,则打印相应的效果
import java.util.Scanner;
public class MethodExercise01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
AAA a=new AAA();
// int n;
// Scanner c=new Scanner(System.in);
// n =c.nextInt();
// boolean b=a.isOdd(n);
// if(b=false) {
// System.out.println("是偶数");}
// else {
// System.out.println("是奇数");
// }
//使用print方法
Scanner c=new Scanner(System.in);
int x1=c.nextInt();
int x2=c.nextInt();
char q=c.next().charAt(0);
a.print(x1, x2, q);
}
}
//编写类AAA,有一个方法:判断一个数是奇数odd还是偶数,返回booolean
class AAA{
//思路
//1.方法的返回类型boolean
//2.方法的名字 isOdd
//3.方法的形参 (int number)
//4.方法体,判断
public boolean isOdd(int num) {
// if(num%2!=0) {
// return ture;
// }else {
// return false;
// }
//return num%2!=0?true:false;
return num%2!=0;
}
//根据行、列、字符打印 对应行数和列数的字符,
//比如:行:4,列:4,字符#,咋打印相应的效果
/*
* ####
* ####
* ####
* ####
*
*/
//1.方法的返回类型 void
//2.方法的名字 printchar
//3.方法的形参(int row,int column,char c)
//4.方法体,循环
public void print(int row,int col,char c) {
for(int i=0;i<row;i++) {
for(int j=0;j<col;j++) {//输出每一行
System.out.print(c);
}
System.out.println();//换行
}
}
}