Java笔记整理——再谈方法(重载、值传递机制及重写)
- 方法的重载
- 可变形参的方法
- 方法参数的值传递机制
- 递归方法
重载——OverLoad
- 重载的概念:
在同一个类中,允许存在一个以上同名方法,只要他们的参数个数或者参数类型不同即可。
两同一不同:
同一个类、相同方法名
参数列表不同:参数个数不同,参数类型不同 - 重载的特点:
与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型)。调用时,根据方法参数列表的不同来区别。 - 重载示例
// return sum about two int value
int add(int x,int y){return x+y;}
// return sum about three int value
int add(int x, int y,int z){return x+y+z;}
// return sum about two float value
double add(double x,double y){return x+y;}
- 小白可能会疑惑的点牢记两同一不同及其重载特点
// method 1
public int getSum(int x,int y){return x+y;}
// method2
public int getSum(int m,int n){return m+n;}
// 上边这个错误的列子表明形参列表我们关注的是参数列表的形参类型,而与参数的变量名称无关,
// 这个很好理解,我们调用方法时很明显是同一个方法
// method 1
public void getSum(int x,String y){}
// method 1
public void getSum(String y,int x){}
// 上边这个列子表明形参列表是有顺序的,上边例子是正确的表达形式
// method 1
public void getSum(int x,double y){ }
// method 1
public double getSum(int x,double y){return x+y;}
// 错误的示例,上述不是方法的重载
判断是否重载
跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系!!!
重载方法由方法名和参数列表决定了调用对象
通过一个类和方法我们进行说明
public class OverLoadDemo{
public static void main(String[] args){
OverLoadDemo demo = new OverLoadDemo();
// 说明,我们直接执行这个代码的时候,结果输出为1,
// 就是说我们调用了getSum(int i, int j)这个方法
// 如果我们注释了方法1 ??思考是否会报错,如果不会,输出的结果是多少?
demo.getSum(1,2);
}
// 定义如下4个方法构成重载
public void getSum(int i, int j){
System.out.println("1");
}
public void getSum(double i, double j){
System.out.println("2");
}
public void getSum(String s, int i){
System.out.println("3");
}
public void getSum(String s, int i){
System.out.println("1");
}
}
验证一下思考和你的答案
我们在上述中将getSum(int i, int j)这个方法 注释,思考下代码的运行。思考点:自动类型转换
通过对象调用方法的时候,如何确定一个指定的方法:
方法名
⟹
\Longrightarrow
⟹ 参数列表
⇑
\Uparrow
⇑ 由对象调用方法的唯一性才有了方法重载的定义
可变个数形参的格式
- jdk 5.0之后的新内容,具体使用:
可变个数形参的格式:数据类型 … 变量
当调用可变个数形参的方法时,传入的参数个数可以是:0,1,2, … \ldots …
可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载。二者不能共存
可变个数形参在方法的形参中,可变参数必须放在参数列表最后
public void show(String ... str){
for(int i=0;i<str.lenght;i++){
System.out.println(str[i]);
}
}
方法参数的值传递机制
-
方法,必须由其所在的类中
-
变量的值传递机制
-
方法形参的传递机制:值传递
形参:方法定义时,声明在小括号内的参数
实参: 方法调用时,实际传递给形参的数据
- 如果参数是基本数据类型,此时实参赋给形参的值是实参真是存储的数据值。
- 如果参数是引用数据类型,此时实参赋给形参的值是实参存储数据的地址值。
JVM中内存对象的加载和处理
栈:存放变量
堆:存放new的对象
⇑
\Uparrow
⇑我们可以先简单理解成上述这样简单。
方法的重写(override/overwrite)
定义:在子类中可以根据需要对从父类继承的方法进行改造,也称为方法的重置、覆盖。(发生在子父类的继承性中)
要求:
- 子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表;
- 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型(基本数据类型的返回值必须一致)
- 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
- 子类不能重写父类中声明为private权限的方法
- 子类方法抛出的异常不能大于父类被重写方法的异常
注意:
子类与父类中同名同参数的方法必须同时声明为static的(即为重写),或者同时声明为static的 (不是重写)。因为static方法时属于类的,子类无法覆盖父类的方法。
方法的结构
权限修饰符 返回值类型 方法名(参数列表) throw 异常的类型{
//方法体
pass
}