Java(5)——方法
第五章 方法
文章目录
方法概述
方法是一个语法结构,他可以把一段代码封装成一个功能,以方便反复调用,类似于C++中的函数
方法好处
- 提高代码的复用性
- 让程序的逻辑更清晰
示例
public class MethodDemo1 {
public static void main(String[] args) {
//张工
int c1 = sum(10,30);
System.out.println(c1);
//徐工
int c2 = sum(10,50);
System.out.println(c2);
}
public static int sum(int a,int b)
{
int c = a+b;
return c;
}
}
out:
5.1 方法的定义、调用
5.1.1 方法完整的定义形式、调用
方法定义格式
修饰符 返回值类型 方法名(形参列表){
方法体代码(需要执行的功能代码)
return 返回值;
}
方法定义示例
public static int add(int a,int b){
int c = a+b;
return c;
}
方法调用格式
方法名();
示例
public class MethodDemo2 {
public static void main(String[] args) {
int rs = add(100,200);
System.out.println("和是:"+rs);
}
public static int add(int a,int b){
int c = a+b;
return c;
}
}
方法格式的注意点
-
方法的修饰符:暂时都使用public static修饰。
-
方法申明了具体的返回值类型,内部必须使用return返回对应类型的数据。
-
形参列表可以有多个,甚至可以没有;如果有多个形参必须用","隔开,且不能给初始化值。
5.1.2 方法的其他定义形式、调用
如果方法不需要返回结果,返回值类型必须申明为void(无返回值),此时方法内部不可以使用return返回数据(如果非要写return,后面不跟东西即可)。
方法如果没有参数,或者返回值类型申明为void可以称为无参数、无返回值的方法,以此类推。
5.2 方法使用的常见问题
方法的编写顺序无所谓
与C++的函数不同,Java方法可以写在主方法的后面。而在C++中,函数如果写在后面,最前面一定要写函数声明(函数原型)。
方法和方法之间是平级关系,不能嵌套定义
C++中同样不允许函数嵌套定义,但是允许函数嵌套调用,java中的方法也是如此。
方法的返回值类型为void,方法内不能使用return返回数据;如果方法的返回值类型写了具体类型,方法内部则必须使用return返回对应类型的数据
方法不调用就不执行,调用时必须严格执行匹配方法的参数情况
有返回值的方法调用时可以选择定义变量接收结果,或者直接输出调用,甚至直接调用;无返回值方法的调用只能直接调用
5.3 方法案例
案例一:定义一个方法,方法中计算出1到n的和并返回。
public class Test {
public static void main(String[] args) {
System.out.println("1-5的和是:"+sum(5));
}
public static int sum(int n){
int sum = 0;
for(int i =1;i<=n;i++)
{
sum+=1;
}
return sum;
}
}
out:
案例二:判断整数为奇数还是偶数
public class Test {
public static void main(String[] args) {
check(11);
System.out.println("----------");
check(100);
}
public static void check(int number){
if(number % 2 == 0)
{
System.out.println(number + "是偶数");
}
else{
System.out.println(number + "是奇数");
}
}
}
out:
5.4 方法调用内存图
方法在没有被调用的时候,在方法区的字节码文件中存放
方法被调用的时候,需要进入到栈内存中运行
形象图
如果把方法比作子弹,则弹夹是方法区,手枪则是栈区。
示意图
5.5 方法的参数传递机制(面试题常考)
5.5.1 基本类型的参数传递
java的参数传递机制是值传递,不像C++,既可以值传递也可以地址传递;值传递的本质就是:在传输实参给方法的形参的时候,并不是传输实参变量(地址)本身,而是传输实参变量(该内存地址)中存储的值。
- 实参:在方法内部定义的变量
- 形参:在定义方法时,
()
中所声明的参数。
面试题中经常会有如下题目
public class MethodDemo1 {
public static void main(String[] args) {
//目标:理解Java的基本类型的参数传递:值传递
int a = 10;
change(a);
//输入,a虽然在方法里被改变,但是方法外没变
System.out.println(a);
}
public static void change(int a){
//传入方法前
System.out.println(a);
//改变传入方法的参数
a = 20;
//改变后的参数
System.out.println(a);
}
}
面试题原理示意图
5.5.2 引用类型的传递机制
虽然看起来也是值传递,实际上已经是地址传递了;其用法实际上和C++别无二致。
面试题经常有如下题目
public class MethodDemo2 {
public static void main(String[] args) {
//目标:理解引用类型的参数传递机制:值传递,区分其不同点
int[] arr = {10, 20, 30};
System.out.println(arr[1]);
change(arr);
System.out.println(arr[1]);
}
public static void change(int[] arr){
System.out.println(arr[1]);
arr[1] = 222;
System.out.println(arr[1]);
}
}
示意图
5.6 方法的参数传递案例
案例一:打印整型数组内容
设计一个方法用于输出任意整型数组的内容,要求输出成如下格式:“该数组内容为:[]”
public class Test {
public static void main(String[] args) {
int[] ages = {10,20,30,40};
printArray(ages);
}
public static void printArray(int[] arr){
System.out.print("{");
for (int i =0;i<arr.length;i++)
{
// if(i == arr.length-1)
// System.out.print(arr[i]);
// else
// System.out.print(arr[i]+",");
System.out.print(i == arr.length-1?arr[i]:arr[i]+",");
}
System.out.println("}");
}
}
out:
案例二:从数组中查询指定元素的索引
设计一个方法可以接收整型数组和要查询的元素值;最终要返回元素在该数组中的索引,如果数组中不存在该元素则返回-1。
public class Test {
public static void main(String[] args) {
int[] ages = {10,20,30,40};
System.out.println(select(ages,20));
}
public static int select(int[] arr,int n){
for(int i = 0;i<arr.length;i++)
{
if(arr[i] == n)
return i;
}
return -1;
}
}
out:
5.7 方法重载
5.7.1 方法重载的形式、作用
引入
方法重载名词挺好听,但是其实没那么难。实际上,方法重载也是一种多态。
打个比方,一个人叫你打车,但是你可能打的是出租车,也有可能是公交车,这取决于你打车这个方法里不同的行为。这就是方法重载,也就是所谓行为的多态性。
导学
假如要我们开发武器系统,功能需求如下:
- 可以默认发射一枚武器
- 可以指定地区发射一枚武器
- 可以指定地区发射多枚武器
示意图
当然调用的时候名字都一样怎么办?调用方法的时候,会通过参数的不同来区分调用的是哪个方法;因为我们在前面说过,如果要调用一个方法,里面的参数时不能少不能多的,所以一个方法1个参数就需要传1个,两个就传两个。
概念
方法重载的意思是:一个类可以有多个方法具有相同的名字(比如打车),但是这些方法的参数不能一样(比如你的打车是打出租车,我是打公交车),参数不同可以满足下列要求:
- 参数个数不同(比如计算方法,可以传一个参数,也可以传两个)
- 参数个数相同,但参数列表中对应的某个参数的类型不同
方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载。
- 多个方法在同一个类中。
- 多个方法有相同的方法名。
- 多个方法的参数不相同,类型不同或者数量不同。
方法重载的特点
重载仅对应方法的定义,与方法的调用无关,调用方法参照标准格式
重载仅针对同一个类中方法的名称和参数进行识别,与返回值无关,换句话说不能通过返回值来判定两个方法是否相互构成重载。
方法重载的作用
对于相似功能的业务场景,可读性好,方法名称相同提示是同一类型的功能,通过形参不同实现功能差异化的选择,这是一种专业的代码设计。
注意问题
重载的时候虽然保证了相互的参数不相同,但是仍然有可能重载方法被调用的时候会出现歧义调用。
总结
方法重载实际上和C++的函数重载别无二致,并且Java中也提供了占位符思想。举一个简单的例子,同样是开车,拖拉机需要拖拉机钥匙,校车需要校车钥匙,那么传入的参数就有所不同;但是他们本质都是开车,所以方法名当然可以一样,但是对于不同的车,参数肯定不同,当然有很多种不同的方式:比如说我钥匙可以不一样(即数据类型不一样),当然我也可以是启动的钥匙数目不一样(即参数的个数不同)。
5.7.2 方法重载的识别技巧(面试题常考)
- 只要是在同一个类中,方法名称相同、形参列表不同,那么他们就是重载的方法,其他都不管。(即使修饰符,返回值类型也无所谓)
- 形参列表不同指的是:形参的个数、类型、顺序不同,不关心形参的名称
示例
public class MethodDemo2 {
//新方法
public static void open(){}
//重载方法
public static void open(int a){}
//重载方法
static void open(int a,int b){}
//重载方法
public static void open(double a,int b){}
//重载方法
public static void open(int a,double b){}
//和上一条的方法重复了,因为方法重载不关心形参的名称,所以不是重载方法
public void open(int i,double d){}
//名称不一样,不是重载方法,是一种新方法
public static OPEN(){}
}
5.8 单独使用return关键字
return;
可以立即跳出并结束当前方法的执行;return关键字单独使用可以放在任何方法中。
使用场景代码
public class returnDemo {
public static void main(String[] args) {
//目标:明确return关键字的作用
//如果插入的分母为0,程序要提示报错
chu(10,0);
}
public static void chu(int a,int b){
if(b == 0){
System.out.println("您输入的数据有问题,除数不能是0!");
return;//立即退出当前方法。
}
int c = a/b;
System.out.println("除法的结果是:"+c);
}
}
out:
文章来源: blog.csdn.net,作者:ArimaMisaki,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/chengyuhaomei520/article/details/125044842
- 点赞
- 收藏
- 关注作者
评论(0)