1,概述
- 假设我们玩一个游戏,在游戏过程中我们要不断的释放技能,假设这个技能的释放由100行代码完成的,在每次释放技能的时候都需要把100行代码写一遍,太麻烦,重复东西太多,程序可读性差。
- 为了解决这个问题,我们可以把释放技能的代码提取出来放在一个{}中。并给他起个名字,这样的话,我们在每次需要释放技能的时候只需要通过这个名字来调用即可。
- 上述过程中,所提取出来的代码就可以认为是一个程序中定义的一个方法,在需要的时候调用即可。
- 简单说:方法就是完成特定功能的代码块
- 有些语言里由函数的定义,在java中函数就是方法
2,方法的定义格式
参数列表
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,....){
方法体(函数体):就是完成特定功能的代码
return 返回值;
}
解释:
修饰符:目前就用 public static
返回值类型:就是功能结果的数据类型
方法名:为了方便调用起的名字 符合命名规则
参数:
实际参数:就是实际参与运算的
形式参数:就是方法上定义的,用来接收实际参数的
参数类型:就是参数的数据类型
参数名:就是变量名
方法体:就是完成特定功能的代码
return: 结束方法,把结果返回给调用者
返回值:就是方法的结果,由return带给调用者
-
如何才能写好一个方法:
在写方法前必须先确定2个东西:
返回值类型:就是功能结果的数据类型
参数列表:要几个参数,每个参数的数据类型是什么 -
举个栗子:
写一个求2个数据之和的方法 -
方法特点:
不调用,不执行 -
如何调用呢?(有明确返回值的方法的调用)
单独调用 sum(a,b); 一般来说没有意义
输出调用 System.out.println(sum(a,b)); 可能还需要针对结果进行进一步操作
赋值调用 int result = sum(a,b); 推荐用这种
class Sum{
public static void main(String[] args){
int x = 5;
int y = 6;
//方式一:单独调用
sum(x,y);
//方式二:输出调用
System.out.println(sum(x,y));
//方式三:赋值调用
int result = sum(x,y);
System.out.println(result);
}
//求2个数之和 int
/*
确定2个东西:
返回值类型:int
参数列表:2个,都是int类型
*/
public static int sum(int a,int b){
//int c = a+b;
//return c;
return a+b;
}
}
练习1
键盘输入2个数据,求和,返回较大值,比较是否相等。
import java.util.Scanner;
class Test1{
public static void main(String[] args){
Scanner sc = new Scanner(System.in); //键盘输入
System.out.println("请输入两个数字"); //提示用户输入两个数字
int a = sc.nextInt();
int b = sc.nextInt();
int result1 = sum(a,b); //调用sum方法
System.out.println(a+"+"+b+"="+result1);
int result2 = getMax(a,b); //调用getMax方法
System.out.println(a+"和"+b+"较大的是"+result2);
boolean result3 = biJiao(a,b); //调用biJiao方法
if(result3){
System.out.println(a+"和"+b+"相等");
}
System.out.println(a+"和"+b+"不相等");
}
public static int sum(int a, int b){ //求和
int c = a + b;
return c;
}
public static int getMax(int a,int b){ //返回较大值
int c = a > b ? a:b;
return c;
}
public static boolean biJiao(int a,int b){ //判断是否相等
boolean c = a==b;
return c;
}
}
练习2
键盘输入3个数据,求和,返回较大值
import java.util.Scanner;
class Test2{
public static void main(String[] args){
Scanner sc = new Scanner(System.in); //键盘输入
System.out.println("请输入三个数字"); //提示用户输入三个数字
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
int result1 = sum(a,b,c); //调用sum方法
System.out.println(a+"+"+b+"+"+c+"="+result1);
int result2 = getMax(a,b,c); //调用getMax方法
System.out.println(a+"和"+b+"以及"+c+"中较大的是"+result2);
}
public static int sum(int a, int b,int c){ //求和
int d = a + b +c;
return d;
}
public static int getMax(int a,int b,int c){ //返回较大值
//方法1:先比较a,b。再用a,b中较大的和c比较,得出最大的
//int temp = a > b ? a:b;
//int max = temp > c ? temp:c;
//方法2:
int max = a>b? (a>c?a:c) : (b>c?b:c);
return max;
}
}
3,方法的注意事项
- 方法不调用不执行
- 方法和方法是平级的,不能嵌套定义
- 方法的参数之间是用逗号隔开的
- 定义时设置参数类型,调用时不用传递数据类型
- 若方法有明确的返回值,一定要有return,还必须返回一个值
4,void类型方法的调用
- 单独调用
- 输出调用(错误)
- 赋值调用(错误)
/*
我要在控制台上输出如下图形
******
******
******
*/
import java.util.Scanner;
class Demo{
public static void main(String[] args){
/*
//打印3行7列的
for(int i=1;i<4;i++){
for(int j=1;j<8;j++){
System.out.print("*");
}
System.out.println();
}
System.out.println("--------------------");
//打印5行8列的
for(int i=1;i<6;i++){
for(int j=1;j<9;j++){
System.out.print("*");
}
System.out.println();
}
*/
/*
随着我的需求不断改变,我们每次都要把这个代码写一遍
太麻烦,我们发现需求不断改变只是行和列的值变化了,
代码本省没有发生变化,所以我们就需要改进一下。
这个代码就是一个打印图形的代码。
所以我们可以用方法来改进代码。
*/
//单独调用
printStar(8,15);
//输出调用
//错误: 此处不允许使用 '空' 类型
//System.out.println(printStar(8,15));
//赋值调用
//错误: 非法的表达式开始
//void v = printStar(8,15);
}
/*
写一个打印*图的方法,2个确定:
返回值类型:空 这里使用void (看mian方法就知道了)
参数:int h int l
*/
public static void printStar(int h,int l){
for(int i=1;i<=h;i++){
for(int j=1;j<=l;j++){
System.out.print("*");
}
System.out.println();
}
}
}
练习1:
- 键盘输入行和列,输出对应图形
import java.util.Scanner;
class FangFa{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入两个数字:");
int a = sc.nextInt();
int b = sc.nextInt();
printStar(a,b); //调用打印方法
}
//打印*的方法实现
public static void printStar(int a, int b){
for(int i = 1; i <= a; i++){
for(int j = 1; j <= b; j++){
System.out.print("*");
}
System.out.println();
}
}
}
练习2:
- 键盘输入一个数x(1-9),输出对应的xx乘法表
import java.util.Scanner;
class FangFa{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字:");
int a = sc.nextInt();
printCheng(a); //调用打印方法
}
//打印乘法表的方法实现
public static void printCheng(int a){
for(int i = 1; i <= a; i++){
for(int j = 1; j <= i; j++){
System.out.print(j+"*"+i+"="+j*i+"\t");
}
System.out.println();
}
}
}
5,方法的重载
- 方法重载的概述
在一个类中,允许存在一个以上的同名方法,只要他们的参数个数或者参数类型不同即可。 - 特点:
和返回值无关,只看名字和参数
/*
随着我的需求不断改变,我们对应提供了很多个方法
但是他们的名字都不一样。
我们之前也要求过,起名字要 见名知意
但是现在很明显其实没有知意
怎么办?
针对这样的情况:方法的功能类似,参数列表不同的情况
为了 见名知意 java是允许这些方法的名字一样
这种情况有一个专业的叫法---方法的重载
方法重载:在同一个类中 方法名相同,参数列表不同,和返回值无关。
的这种现象。
参数列表不同:
参数的个数不同
参数的类型不同
*/
import java.util.Scanner;
class Demo{
public static void main(String[] args){
//jvm会根据不同的参数调用不同的方法
//System.out.println(sum(2,3));
//System.out.println(sum(2.0,5));
float f = 3.5F;
System.out.println(sum(f,3.0));
//System.out.println(sum(2,3,4));
}
//写一个求2个数据之和的方法
public static int sum(int a,int b){
System.out.println("2个int");
return a+b;
}
//写一个求3个数据之和的方法
public static int sum(int a,int b,int c){
System.out.println("3个int");
return a+b+c;
}
//写一个求4个数据之和的方法
public static int sum(int a,int b,int c,int d){
System.out.println("4个int");
return a+b+c+d;
}
//写一个求2个double类型的数据之和
public static double sum(double a,double b){
System.out.println("2个double");
return a+b;
}
//错误: 已在类 Demo4定义了方法 sum(double,double)
//public static double sum(double a,double b){
// return a+b;
//}
public static double sum(float a,double b){
System.out.println("1个double,1个float");
return a+b;
}
}
-练习:
- 比较2个数是否相等,参数分别是2个byte,2个short,2个int,2个long
class Demo{
public static void main(String[] args){
byte b1 = 3;
byte b2 = 4;
System.out.println(isSame(b1,b2));
short b3 = 3;
short b4 = 4;
System.out.println(isSame(b3,b4));
int b5 = 3;
int b6 = 4;
System.out.println(isSame(b5,b6));
long b7 = 3;
long b8 = 4;
System.out.println(isSame(b7,b8));
}
public static boolean isSame(byte a,byte b){
System.out.println("byte");
return a==b;
}
public static boolean isSame(short a,short b){
System.out.println("short");
return a==b;
}
public static boolean isSame(int a,int b){
System.out.println("int");
return a==b;
}
public static boolean isSame(long a,long b){
System.out.println("long");
return a==b;
}
}