一、方法的重载
1.1定义:
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
- “两同一不同”:同一个类、相同方法名
- 参数列表不同:参数个数不同,参数类型不同
- 【我的理解:先要满足同一个类和满足同一个方法名,是否是方法的重载?最后看参数列表:看参数个数和看参数类型,只要满足其中一个就肯定是方法的重载。这是在同一个类、相同方法名的前提下,如果连前提都不满足,那肯定不是方法的重载。】
1.2举例:
Arrays类中重载的sort() / binarySearch()
忘记什么类了中重载的println(),就是方法的重载,里面的参数列表有int a,String a,double a,…等等好多好多。
1.3判断是否是重载:
跟方法的权限修饰符(public、pravite …)、返回值类型(int、void、String …)、形参变量名(int x、int y …)、方法体(就是方法里面的内容)都没有关系!!!
只和方法名,还有参数列表有关系。
1.4. 在通过对象调用方法时,如何确定某一个指定的方法:
方法名 ---> 参数列表<br />如果方法名错了会编译错误;<br />如果方法名对啦,参数列表错了也会编译报错。
二、可变形参的方法
2.1jdk 5.0新增的内容
2.2具体使用:
可变个数形参的格式:数据类型 … 变量名
当调用可变个数形参的方法时,传入的参数个数可以是:0个,1个,2个,。。。
可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载。换句话说,二者不能共存。
可变个数形参在方法的形参中,必须声明在末尾
可变个数形参在方法的形参中,最多只能声明一个可变形参。 ```java 这两个只能二选一:存在其中一个 public void show(String … strs){System.out.println("show(String ... strs)");
for(int i = 0;i < strs.length;i++){
System.out.println(strs[i]);
}
} //不能与上一个方法同时存在 public void show(String[] strs){
} ```
三、方法参数的值传递机制(重要)
- 形参:方法定义时,声明的小括号内的参数
- 实参:方法调用时,实际传递给形参的数据
值传递机制:
如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值。 如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的地址值。
详细理解可以参考内存解析里的 值传递机制
内存解析
四、递归方法
五、方法的重写(override / overwrite)
5.1重写:
子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作。
5.2应用:
重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法。
5.3重写的规定:
方法的声明:权限修饰符 返回值类型 方法名([形参列表]) throws 异常的类型{ 方法体 }
约定俗称:子类中的叫重写的方法,父类中的叫被重写的方法
:::tips
- ① 子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同
- ② 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符
特殊情况:子类不能重写父类中声明为private权限的方法
- ③ 返回值类型:
父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void
父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A类的子类
父类被重写的方法的返回值类型是基本数据类型(比如:double),则子类重写的方法的返回值类型必须是相同的基本数据类型(必须也是double)
- ④ 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型(具体放到异常处理时候讲)
:::
子类和父类中的同名同参数的方法要么都声明为非static的(考虑重写),要么都声明为static的(不是重写)。
六、方法重写和重载的区别
区分方法的重写和重载?
答:
① 二者的概念:
② 重载和重写的具体规则
③ 重载:不表现为多态性。
重写:表现为多态性。