在同一作用域下,有一组具有相同函数名,不同参数表的函数,这组函数被称为重载函数
注意:
例子:
public class Test{ public static void main(String[] args){ reload(1); reload(1, 2); reload(1, "str"); } public static void reload(int a){ System.out.println(a); } public static void reload(int a, int b){ //函数名相同,参数个数不同 System.out.println(a); System.out.println(b); } public static void reload(int a, String b){ //函数名相同,参数个数相同,但是其中一个参数类型不同 System.out.println(a); System.out.println(b); } }
以上三个reload均为重载,但下面这个例子则不是重载
public static int reload(int a){ System.out.println(a); }
尽管返回类型由void
改为int
,但参数个数、参数类型都与第一个一致,因此会报错
指两个方法的返回值、方法名、参数的类型和个数相同,方法体不同(子类重写父类的方法)
重写的目的:
子类不一定需要父类的功能,或者父类的功能不能满足子类
注意:
需要有继承关系
方法名必须相同
参数列表必须相同
修饰符:范围可以扩大但不能缩小(即父类的修饰符是Default,则子类的修饰符可以是Public、Protected、Default)
Public > Protected > Default > Private
声明为final的方法不能被重写
声明为Private的方法不能被重写
声明为static的方法不能被重写,但能被再次声明
如果子类和父类在同一个包内,那么子类可以重写父类的所有方法
如果子类和父类不在同一个包内,那么子类只能重写父类中声明为Public、Protected的方法
构造方法也不能重写
例子:
public class Test{ public static void main(String[] args){ A a = new A(); a.test(); //输出A B b = new B(); b.test(); //输出B } } public class A{ public void test(){ System.out.println("A"); } } public class B extends A{ @Override //这个注释可写可不写,写了方便标注方法重写 public void test(){ System.out.println("B"); } }
在上面这个例子中,A的方法如果被声明为Protected,则B重写的方法只能被Protected或Public声明,同时,如果A的方法声明为Private,则无法被B重写,Private为私有,无法重写
重写和重载是java中的两种多态,重写是父类和子类之间的一种多态的表现,而重载是一个类的多态表现。
重载能改变返回值类型。