一、方法的重载
1.方法名相同
2.方法参数不同(个数、类型)
3.方法的返回值类型不影响重载
为了更直观的了解 我举一个代码的例子
class Test{
public static void main(String[] args) {
int a = 10;
int b = 20;
int ret = add(a, b);
System.out.println("ret = " + ret);
double a2 = 10.5;
double b2 = 20.5;
double ret2 = add(a2, b2);
System.out.println("ret2 = " + ret2);
double a3 = 10.5;
double b3 = 10.5;
double c3 = 20.5;
double ret3 = add(a3, b3, c3);
System.out.println("ret3 = " + ret3);
}
//下面三个方法构成了重载
// 1.他们的方法名字都相同
// 2.方法里的参数个数不一样,参数类型也不一样(有int 有double)
// 3.可以看到第一个返回值是int类型,第二个和第三个是double类型但不影响重载
public static int add(int x, int y) {
return x + y;
}
public static double add(double x, double y) {
return x + y;
}
public static double add(double x, double y, double z) {
return x + y + z;
}
}
二、重写
首先要清楚 重写发生在不同类当中,且是继承关系
1.方法名相同
2.参数列表相同
3.返回值相同
class AA{
public String name;
public AA(String name) {
this.name = name;
}
public void eat(){
System.out.println("我是AA的" + this.name + "正在吃东西");
}
@Override
public String toString() {
return "AA{" +
"name='" + name + '\'' +
'}';
}
}
class BB extends AA{
public BB(String name) {
super(name);
}
// @Override
// public void eat(){
// System.out.println(“我是BB的” + this.name + “正在吃东西”);
// }
}
public class Test {
public static void main(String[] args) {
AA aa = new BB("小狗");
aa.eat();
}
}
首先我们要知道父类是不能调用子类的属性或者方法的,我们可以看到BB是继承AA的,先屏蔽BB类中重写的eat()方法,此时在Test的main方法中发生向上转型,父类调用自己的eat方法 aa.eat();
输出结果:我是AA的小狗正在吃东西
当我们解除屏蔽重写BB类中的eat()方法时,还是执行代码 aa.eat();发生运行时绑定,此时eat就是BB类重写的而不是AA父类里面的eat方法
执行结果:我是BB的小狗正在吃东西
注意:
1.如上面eat方法不能被private修饰
2.访问修饰限定符不一定相同(子类的限定要大于等于父类的)
3.静态的方法不能被重写