/*
- 方法的重载:
- 1在同一个类中允许存在一个以上的同名方法,前提是他们的参数个数或者参数类型不同
- (两同一不同:类相同,名相同,参数列表不同)
- 2重载特点: 与返回值的类型无关,只看参数列表,参数列表必须不同(参数个数与参数类型)
- 调用时,根据方法参数列表的不同区分方法
- 3判断是否重载:跟方法的权限修饰符,返回值类型,形参的变量名,方法体都无关。
- 只用两同一不同判断
- 4在通过对象调用方法时,如何确定调用的是什么方法:
- 看方法名
- 看参数列表
- 例:
- int add(int x,int y){//计算两个参数的和
- return x + y;
- }
- int add(int x,int y,int z){//计算三个参数的和
- return x + y +z;
- }
- double add(double x,double y){//计算两个浮点型参数的和
- return x + y;
- }
*/
/*
- 可变个数形参
- javaSE5.0提供了Varargs(variable number of arguments)机制
- 允许直接定义能和多个实参相匹配的形参。从而可以使用更简单的方式传递个数可变的实参
- JDK5.0 以前使用数组形参来定义方法,传入多个同一类型的变量
- public static void test(int a ,Sting[] books){}
- JDK5.0 以后使用可变个数形参来定义方法,传入多个同一类型变量
- public static void test(int a ,Sting…books){}
- 可变形参的使用
- 1,格式 :(数据类型 … 变量名)
- 2,当调用有可变个数形参的方法时,传入参数的个数可以是0个,1个或者多个。
- 3,当可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载。
- 4,当可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载,二者不能共存
- 5,一个方法中,可变个数形参最多只能有一个,且声明在参数列表的末尾。(如果在前面,或有多个可变形参,编译器不知道之后输入的参数是否属于可变形参,属于哪个可变形参,使用数组方式无此问题)
*/
package com.atguigu.contact;
import java.util.*;
public class Object5 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//测试重载
Count c = new Count();
c.sum(1, 2);//输出1
//注意:如果sum(int i,int j)方法被注释掉,则因为自动类型提升会执行
//sum(double i,double j),输出2
OverLoad o = new OverLoad();
o.MathTest(11, 22);
o.Max(3.1, 1.2, 9.2);
//测试可变形参
Argu a = new Argu();
a.show("AA");
a.show("AA","BB");
//a.show();//两个方法都用可变形参,编译器不确定使用哪个方法
a.show(1);
a.show(23,56,12,45);
a.show(new int[] {});//可变形参方法可以直接填入数组
}
}
class Count{
public void sum(int i,int j) {
System.out.println("1");
}
public void sum(double i,double j) {
System.out.println("2");
}
public void sum(int i,double j) {
System.out.println("3");
}
public void sum(double j,int i) {
System.out.println("4");
}
public void sum() {
System.out.println("5");
}
// public int sum(int i,int j) { //与是否返回无关,不能构成重载
// return 0;
// }
// public void sum(int m,int n) { //与形参名无关,不能构成重载
// System.out.println("5");
// }
// private void sum(int i,int j) {//与修饰符无关,不能构成重载
// System.out.println("5");
// }
// private void sum(int i,int j) {//与方法体无关,不能构成重载
// System.out.println();
//}
}
class OverLoad{
public void MathTest(int i) {
System.out.println(i * i);
}
public void MathTest(int i,int j) {
System.out.println(i * j);
}
public void MathTest(double i) {
System.out.println(i);
}
public void Max(int i,int j) {
int max;
max = (i >= j)?i:j;
System.out.println(max);
}
public void Max(double i,double j) {
double max;
max = (i >= j)?i:j;
System.out.println(max);
}
public void Max(double i,double j,double l) {
double max;
max = (i >= j)?i:j;
max = (max >= l)?max:l;
System.out.println(max);
}
}
class Argu{
public void show(String s) {
System.out.println("传入了一个数据" + s);
}
public void show(String ... s ) {//实际还是创建一个String类型的数组,数组名s,只是语法改变
System.out.println("又传入了一个数据" + s);//会输出数组s 的首地址值。在方法使用时输入完变量后确定数组地址值与长度
for (int i = 0; i < s.length; i++) {//遍历输出,其他功能与数组的操作相同
System.out.println("又传入了一个数据" + s[i]);
}
}
// public void show(String[] s) { //与可变形参重复,不构成重载
// System.out.println("又传入了一个数据" + s);
// }
public void show(int s) {
System.out.println("传入了一个数据" + s);
}
public void show(int ... s) {
int sum = 0;
if(s.length != 0) {
for (int i = 0; i < s.length; i++) {
sum += s[i];
}
System.out.println("传入数据总和是" + sum);
}else {
System.out.println("没有传入数据");
}
}
}