方法重载Overload
重载定义
同一个类中(本类声明的或继承自父类的)的方法,方法名相同,参数列表不同的情况,这就叫方法重载。
重载要求
1.与返回值类型无关。
2.参数列表不同指的是,参数个数不同,类型不同,顺序不同。
3.调用方法时,多个方法都匹配,找最匹配的方法来调用。
重载举例
class Demo6 {
//求两个整数的和
public int sum(int a,int b){
return a+b;
}
//求两个小数的和
public double sum(double a, double b){
return a+b;
}
//求三个整数的和
public int sum(int a, int b, int c){
return a+b+c;
}
//求一个小数与一个整数的和
public double sum(double a, int b){
return a+b;
}
}
class Demo08 {
public static void main(String[] args) {
Demo6 d = new Demo6();
System.out.println(d.sum(2, 3));
System.out.println(d.sum(2, 3, 8));
System.out.println(d.sum(3.7, 2.5));
System.out.println(d.sum(1.7, 4));
System.out.println(d.sum(1, 3.5));
}
}
方法重写(Override)
当子类继承了父类的某个方法之后,发现这个方法并不能满足子类的实际需求,那么可以通过方法重写,覆盖父类的方法。
重写定义
子类中定义与父类中相同的方法,一般方法体不同,用于改造并覆盖父类的方法。
重写要求
1.必须保证父子类之间重写方法的名称相同。
2必须保证父子类之间重写方法的参数列表也完全相同。
3.子类方法的返回值类型必须【小于等于】父类方法的返回值类型(小于其实就是是它的子类,例如:Cat< Animal)。注意:如果返回值类型是基本数据类型和void,那么必须是相同。
4.子类方法的权限必须【大于等于】父类方法的权限修饰符。
5.子类方法声明的异常不能比父类大。
重写举例
class Super {
Super s;
protected int get() {
return 4;
}
public Super getS() {
return s;
}
}
class Sub extends Super {
// 子类重写 父类 gets(),返回值为 父类的子类,编译通过,
@Override
public Sub getS() {
return new Sub();
}
/*编译失败:原因分析
方法重写 返回值为基本数据类型的 或者 void 类型的,不可改变返回值,
*/
// public long get() {
// return 5;
// }
//该方法报错原因,方法的权限为 缺省 权限小于 protecte
// int get() {
// return 5;
// }
//重写方法权限大于 父类方法权限
@Override
public int get(){
return 6;
}
public static void main(String[] args) {
Super s = new Sub();
System.out.println(s.get());
}
}
注意事项:
面试题:
class Super {
int i = 0;
public Super(String s) {
i = 1;
}
}
class Demo extends Super {
public Demo(String s) {
i = 2;
}
public static void main(String[] args) {
Demo d = new Demo("yes");
System.out.println(d.i);
}
}
//编译失败,因为父类中缺少空参数的构造器。
//或者子类应该通过super语句指定要调用的父类中的构造器。
子类对象实例化时一定会调用父类构造器,如果父类提供了带参的构造器(无参的构造器就会省略,不在提供),子类在调用时 如果不显示调用父类的有参构造,n那么就会报措,同理,子类提供了无参构造器,父类提供有参构造器的同时一定要提供无参构造器。
总结
重载、重写都是java多态的表现。方法重写是java子父类间的多态,方法重载 是java单类内部的多态表现。