成员方法


成员方法

基本介绍

在某些情况下,我们要需要定义成员方法(简称方法)。比如人类:除了有一些属性外( 年龄,姓名..),我们人类还有一 些行为比如:可以说话、跑步..,通过学习,还可以做算术题。这时就要用成员方法才能完成。现在要求对 Person 类完善。

成员方法快速入门

  1. 添加speak成员方法,输出“我是一个好人”
  2. 添加cal01成员方法,可以计算从1+…+1000的结果
  3. 添加cal02成员方法,该方法可以接受一个数n,计算从1+…+n的结果
  4. 添加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

为什么需要成员方法

  • 看一个需求
    请遍历一个数组,输出每个数组的各个元素值

  • 解决思路

  1. 传统方法:使用单个for循环,将数组输出
  2. 定义一个类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

成员方法的好处

  1. 提高代码的复用性
  2. 可以将实现的细节封装起来,然后供其他用户来调用即可

成员方法的定义

访问修饰符 返回数据类型 方法名(形参列表) {//方法体 语句;[return 返回值;]}

  1. 形参列表:表示成员方法输入 cal(int n),getSum(int num1,int num2)
  2. 返回数据类型:表示成员方法输出,void表示没有返回值
  3. 方法主体:表示为了实现某一功能代码块
  4. 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]
  • 返回数据类型
  1. 一个方法最多有一个返回值[如何返回多个结果? 返回数组]
  2. 返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)
  3. 如果方法要求有返回数据类型,则方法体中最后的执行语句必须为 return 值; 而且要求返回值类型必须和 return 的值类型一致或兼容
  4. 如果方法是 void,则方法体中可以没有 return 语句,或者只写 return
  • 方法名

遵循驼峰命名法,最好见名知意,开发中按照规范

  • 形参列表
  1. 一个方法可以有0个参数,也可以有多个参数,中间用逗号隔开,比如getSum(int n1,int n2)
  2. 参数类型可以为任意类型,包含基本数据类型或引用类型,比如printArr(int[] map)
  3. 调用带参数的方法,一定对应着参数列表传入相同类型或兼容类型的参数
  4. 方法定义时的参数称为形式参数,简称形参;方法调用时的传入参数称为实际参数,简称实参,实参和形参的类型要一致或兼容、个数、顺序必须一致
  • 方法体

里面写完成功能的具体的语句,可以为输入、输出、变量、运算、分支、循环、方法调用,但里面不能再定义方法!即:方法不能嵌套定义

  • 方法调用的细节说明

1.同一个类中的方法调用:直接调用即可。比如print(参数)
2.跨类中的方法A类调用B类方法:需要通过对象名调用。比如对象名.方法名(参数)
3.特别说明一下:跨类的方法调用和方法的访问修饰符相关

类定义的完善

练习题

  1. 编写类 AA ,有一个方法:判断一个数是奇数 odd 还是偶数,返回boolean
  2. 根据行、列、字符打印 对应行数和列数的字符,比如:行: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();//换行
		}
	}
}

文章作者: Chtholly2333
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Chtholly2333 !
  目录