提高代码质量 — 覆写变长方法也循规蹈矩

public class Parent {
	public void changedParamMethod(String... names){
		for(String name : names){
			System.out.println("hello parent: " + name);
		}
	}
	
	public void hello(String[] names){
		for(String name : names){
			System.out.println("hello son: " + name);
		}
	}
}

public class Son extends Parent {
	@Override
	public void changedParamMethod(String[] names){
		for(String name : names){
			System.out.println("hello son: " + name);
		}
	}
	@Override
	public void hello(String[] names){
		for(String name : names){
			System.out.println("hello son: " + name);
		}
	}
}

// 提高代码质量 -- 覆写变长方法也循规蹈矩
		Parent parent = new Son();
		parent.changedParamMethod("sss");
		parent.hello("sss");
		Son son = new Son();
		son.changedParamMethod("sss");

parent.changedParamMethod(“sss”);没有问题

son.changedParamMethod(“sss”);编译错误

parent.hello(“sss”);编译错误

按理说parent.changedParamMethod(“sss”)引用是son,调用son的方法发现是String[]应该有编译错误,但是这里JVM比较智能,能通过Parent将”sss”向上转型成{“sss”},但是son.changedParamMethod(“sss”)就不行了,parent.hello(“sss”)由于父类也是String[],所以当然会报错。

所以在重写的时候需要满足如下:

  • 重写方法修饰符访问权限不能缩小
  • 参数列表必须与重写方法相同
  • 返回类型必须与父类的返回相同或者是他的子类
  • 不能抛出新异常,可以少抛出异常

提高代码质量 — 避免null和空值威胁变长方法

public void changedParamMethod2(Integer... name){
		System.out.println("hello single: " + name);
	}
	public void changedParamMethod2(String... name){
		System.out.println("hello single: " + name);
	}

String[] strs = null;
		//baseService.changedParamMethod2(null);
		baseService.changedParamMethod2(strs);

因为JVM无法知道null的类型,而有多个变长方法满足所以系统无法找到相应的方法,baseService.changedParamMethod2(null);报错,要尽量避免多个符合的方法,不管是否有编译错误

提高代码质量 — 避免变长参数的方法重载

// 提高代码质量 -- 避免变长参数的方法重载
	public void changedParamMethod(String name){
		System.out.println("hello single: " + name);
	}
	public void changedParamMethod(String... name){
		System.out.println("hello complex: " + name);
	}
	
	public static void main(String[] args) {
		CodePromotingService1_30 baseService = new CodePromotingService1_30();
		baseService.changedParamMethod("aaa");
	}

baseService.changedParamMethod(“aaa”);两个方法都满足,JVM会根据简单原则先找到单一String参数的方法,虽然不会报错,但是变长参数对单一参数方法有覆盖的含义,在方法复杂的情况容易产生歧义。