方法
把一些常用的代码定义为方法,可以实现代码的重用。简化了程序的编写和维护工作。
方法名 起一个贴近的名字
形参列表 (参数) 运行时所需要的数据
返回值类型 方法数据结果类型 给别人的数据类型
方法体 完成功能的代码
return 表达式 将结果返回 代表代码结束 在用时return的数据必须和返回值类型相匹配
方法的定义
方法定义三要素 方法名 参数 返回值类型
参数的语法就是定义变量 如果方法有多个参数 使用逗号相隔 例:(int x,int y)
如果方法没有返回值 则返回值类型需要使用void关键字
如果方法定义时 有返回值类型 那么在方法体中至少出现一个return关键字将数据返回
return 返回的数据必须和返回值类型匹配
执行到return即意味着方法执行结束 后不能再编写代码
可以在同一个方法体中写多个return 但是要保证只能执行其中一个
public static int abs (int x) {
if (x>=0) {
return x;
} else {
return -x;
}
}
}
1. 有参数有返回值
如果方法定义时 有返回值类型 那么在方法体中至少出现一个return关键字将数据返回
例: 定义一个计算整数平方的方法 (有计算就有返回值 需要写返回值类型 )
public static int square (int x) {
int y = x*x;
return y;
}
2.有参数无返回值
如果方法没有返回值 则返回值类型需要使用void关键字 void代表返回值类型为空 可以写return 但必须什么都不能带
例: 定义一个打招呼的方法 (没有返回值)
public static void sayHi (String name) {
System.out.println("你好,我是"+name+"今天想吃面,什么面,想见你一面");
}
3.无参数有返回值
public static int chuanMen3() {
System.out.println("景绪第三次去明旭家里骂骂咧咧...哭哭啼啼");
return 20;
}
4.无参数无返回值
无参数的情况下 小括号里不填
例: 定义一个方法,输出10次 建...庆 既没有参数也没有返回值
public static void show () {
for(int i=1;i<=10;i++) {
System.out.println("建党百年普天同庆");
}
}
方法的调用
通过名字来调用
主方法运行时也是需要调用 只不过是java虚拟机调用的
除了主方法之外 其余方法的调用需要代码来完成
通过方法名来调用某个方法的执行
1.无参数无返回值方法调用
调用方法: 方法名 () ;
例:
public static void show () {
System.out.println("hello,我是思聪,一口吃一个热狗");
}
public static void main(String[] args) {
System.out.println("主方法运行了");
show();
show();
}
2. 有参数无返回值方法调用
调用有参方法时 必须传参 传参就是传数据
传参时的注意事项 数量 类型 顺序 必须和方法定义时一致
只有在方法需要改变属性时才传参
传参其实就是隐含的赋值
定义时的参数是形参 传参时的参数是实参
传参可以是常量也可以是变量
public static void add(int x, int y) {
System.out.println(x+"+"+y+"="+(x+y));
}
add(10,5);
add(100,200);
//此时直接把 x=10 y=5和x=100 y=200 传参给add方法 结果为10+5=15 100+200=300
public static void main(String[] args) {
int m,n;
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个整数");
m = sc.nextInt();
System.out.println("请输入第二个整数");
n = sc.nextInt();
add(m,n);
//此时把键盘输入的m,n传参给add方法 假如m=3 y=5 结果为3+5=8
}
例题 : 输入一个年份判断平年闰年
public class 平年闰年 {
public static void leapYear (int year) {
if (year%4==0 && year%100!=0) {
System.out.println(year+"是闰年");
} else {
System.out.println(year+"是平年");
}
}
public static void main(String[] args) {
int y;
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个年份");
y = sc.nextInt();
leapYear(y);
}
}
3. 有参数有返回值方法调用
定义一个和返回值类型相同类型的变量 接收返回值数据 或者直接使用(但只能使用一次)
public static int square(int x) {
return x*x;
}
public static void main(String[] args) {
//1.定义一个和返回值类型相同类型的变量 接收返回值数据
int r = square(5);
//此时给aquare的参数x赋值5 回到方法 5*5=25 把结果25 return到主方法 int r =25
System.out.println(r);//结果为25
//2.直接在代码中使用返回值数据
System.out.println(square(10));
}
例题: 根据商品总价,计算出对应的折扣
public static double discount (double price) {
if (price>0 && price<100) {
return price;
} else if (price>=100 && price<=199) {
return price* 0.95;
} else {
return price* 0.85;
}
}
public static void main(String[] args) {
double p;
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个价格");
p = sc.nextInt();
double x = discount(p);
System.out.println("打折后的价钱为"+x);
//或者写成 System.out.println("打折后的价钱为"discount(p));
}
方法的调用基本数据类型和引用类型比较
任何一个方法被调用虚拟机都会为它分配一个栈区
//任何一个方法被调用虚拟机都会为它分配一个栈区
//形参也是方法中定义的变量
public static void getX (int x) {
x = x*3;
}
public static void getY (int []y) {
y[0] = y[0]*3;
}
public static void main(String[] args) {
int x = 10;
System.out.println("调用getx方法之前 x的值是"+x);//10
getX(x);//此时传递的是数据 不是变量x
System.out.println("调用getx方法之后 x的值是"+x);//此时输出的是main里面的x 不是方法getX里的x
System.out.println("------------------------------------------");
int [] y = {10};
System.out.println("调用getx方法之前 y的值是"+y[0]);
getY(y);//此时传递的是数组在堆区所在的地址 所以 getX里的y[0]变为30 main里的y[0]也变为30
System.out.println("调用getx方法之后 y的值是"+y[0]);
}
//结果顺序为 10 10 10 30
方法重载
方法的重载就是在同一个类中允许同时存在一个以上同名的方法
重载的规则 名字可以相同 参数类型必须不同 或者参数个数不同 返回值可以相同也可以不同
调用重载方法时是根据传参的类型来决定要用哪个方法
public static int add(int x,int y) {
System.out.println("整数平方和");
return x*x+y*y;
}
public static double add(double x,double y) {
System.out.println("小数平方和");
return x*x+y*y;
}
public static void main(String[] args) {
System.out.println(add(3,5));//结果为 整数平方和 34 3和5都是整数 所以走第一个方法
System.out.println(add(1.1,2.2));//结果为 小数平方和 6.05 1.1和2.2都是小数 所以走第二个方法
//调用重载方法时是根据传参的类型来决定要用哪个方法
}