java方法重载


文章内容选自尚硅谷

方法重载的定义

在同一个类中,允许多个同名的方法,但是同名的方法必须要求其参数列表不同
遵循两同一不同的原则:

  • 两同:类相同,方法名相同
  • 一不同:参数列表不同(参数类型,参数个数)

代码如下

//如下的4个方法构成了重载
	public void getSum(int i,int j){
		System.out.println("1");
	}
	
	public void getSum(double d1,double d2){
		System.out.println("2");
	}
	
	public void getSum(String s ,int i){
		System.out.println("3");
	}
	
	public void getSum(int i,String s){
		System.out.println("4");
	}
	
	//如下的3个方法不能与上述4个方法构成重载
//	public int getSum(int i,int j){
//		return 0;
//	}
	
//	public void getSum(int m,int n){
//		
//	}
	
//	private void getSum(int i,int j){
//		
//	}

以第一个方法作为参照 ,前4个方法彼此构成了方法的重载,而后面三个注释掉的方法与第一个方法相比不是方法的重载.

方法重载的判断

严格遵循两同一不同的原则,前四个方法与第一个方法相比,其参数列表不同,后3个方法错在参数列表相同,与有无返回值,返回值类型,权限修饰符,形参的变量名无关.

重载时的自动类型提升

代码如下

package com.atguigu.java1;
/*
 * 方法的重载(overload)  loading...
 * 
 * 1.定义:在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
 * 	
 *  "两同一不同":同一个类、相同方法名
 *            参数列表不同:参数个数不同,参数类型不同
 * 
 * 2. 举例:
 *    Arrays类中重载的sort() / binarySearch()
 * 
 * 3.判断是否是重载:
 *    跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系!
 *    
 * 4. 在通过对象调用方法时,如何确定某一个指定的方法:
 *      方法名 ---> 参数列表
 */
public class OverLoadTest {
	public static void main(String[] args) {
		
		OverLoadTest test = new OverLoadTest();
		test.getSum(1,2);
		
		
	}
	
	//如下的4个方法构成了重载
	public void getSum(int i,int j){
		System.out.println("1");
	}
	
	public void getSum(double d1,double d2){
		System.out.println("2");
	}
	
	public void getSum(String s ,int i){
		System.out.println("3");
	}
	
	public void getSum(int i,String s){
		System.out.println("4");
	}
	
	//如下的3个方法不能与上述4个方法构成重载
//	public int getSum(int i,int j){
//		return 0;
//	}
	
//	public void getSum(int m,int n){
//		
//	}
	
//	private void getSum(int i,int j){
//		
//	}
	
	
}

参数列表为(1,2),默认int类型,采用方法1,输出结果为

1

如果把第一个方法注释掉,参数类型提升到double类型,此时采用的是方法2
输出结果为

2

可变个数的形参

可变个数的形参具有一些特点

  • 其类型一般为:参数类型 … 变量名
  • 在同一类中,可变个数形参的方法与其他方法依然可以构成重载

代码如下

package come.atguigu.java;

public class MethodArgsTest {
	public static void main(String[] args) {
		MethodArgsTest test = new MethodArgsTest();
		test.show(12);
		test.show("hello");
		test.show("hello","world");
		test.show();   //show()依然被传入可变个数形参列表中,当作参数个数为0的情况
		
	}
	
	public void show(int i){
		
		
	}
	
	public void show(String s){
		System.out.println("show(String)");
		
	}
	
	public void show(String ...strs){
		
		System.out.println("show(String ... strs)");
	}

}

其运行结果为

show(String)
show(String … strs)
show(String … strs)

与String[] 的比较

在java8的环境中,如果同时有

	public void show(String ...strs){
		
		System.out.println("show(String ... strs)");
	}
	
	public void show(String[] strs){
		
		
	}
	//这两种方法,构不成方法的重载,编译器会将他们视作一种方法,报错。
 

采用String[]时,调用该方法时得采用

test.show(new String[]{"hello","world"});

采用

test.show("hello","world");
test.show();

会报错
故采用可变参数类型时,不用区new一个匿名对象,更为方便。两种方法本质上是一样的,只是表示法不一样,比如,在可变个数形参列表中,若要遍历每个参数,依然采用的是数组的方法。

package come.atguigu.java;

public class MethodArgsTest {
	public static void main(String[] args) {
		MethodArgsTest test = new MethodArgsTest();

		test.show("hello");
		test.show("hello","world");
//		test.show();
//		test.show(new String[]{"hello","world"});
		test.show(new String[]{"aa","bb"});
	}
	
	public void show(String s){
		System.out.println("show(String)");
		
	}
	
	public void show(String ...strs){
		for(int i=0;i<strs.length;i++){
			System.out.println(strs[i]);
		}
		System.out.println("show(String ... strs)");
	}
	
//	public void show(String[] strs){
//		
//		
//	}
}

结果为

show(String)
hello
world
show(String … strs)
aa
bb
show(String … strs)

可变个数形参还必须要求

  • 可变个数形参必须声明在参数的末尾
  • 可变个数形参的声明在参数列表中只能有一个
//	public void show(String ... strs,int i){
//		
//		
//	}   
//这样使用编译器会报错   

综上,在使用可变个数形参时,采用参数类型…变量名的方法,相较于数组的方法,有更高的容错性和更高的效率,尽管他们本质上是一样的,但推荐使用类型…变量名的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值