对于类的方法(包括从父类中继承的方法)如果有两个方法的方法名相同,但参数不一致,那么可以说,一个方法是另一个方法的重载方法。
重载方法满足以下条件:
1.方法名相同
2.方法的参数签名(参数类型,个数,顺序)至少有一项不相同。
3.方法的返回类型可以不相同。
4.方法的修饰符可以不相同。
!解释:什么叫参数签名:是指参数的类型,个数,顺序。
-作为程序入口的main()方法也可以被重载。
public static void main(String[] args){}
public void main(String[] i, int i){}//重载
覆盖:
覆盖方法必须满足多种约束:
子类方法的名称、参数签名、返回类型与父类一致。
以下注意几点:
*java编译器首先判断子类的方法和父类的方法的参数签名。(无论重载,覆盖。方法名相同是必要的)
两者一致,java编译器认为子类的方法试图覆盖父类的方法,既然如此,子类的方法就必须和被覆盖的方的法具有相同的返回类型。(返回不同,编译错误)- class Father{
- void say(String name, int age){
- System.out.println("i father");
- }
- }
- class Childs extends Father{
-
- @Override//使用Eclipse的注解帮助判断。(如果非覆盖有提示)
- void say(){//非覆盖
- System.out.println("i chlids");
- }
-
- @Override
- void say(String name, int age){//覆盖
- System.out.println("我覆盖father.say");
- }
- }
复制代码 *子类方法不能缩小父方法的访问权限。(例如父类的访问是公共public,而子类的访问权限却是私有private。这是无效的覆盖,发生编译错误。)
原因:如果没有这个限制,将和java语言的多态机制发生冲突。
*子类方法不能拋出比父类更多的异常
子类方法拋出的异常必须和父类方法拋出的异常相同,或者子类方法拋出的异常类是父类拋出的异常类的子类。
为什么子类不允许拋出比父类方法更多的异常呢?
原因:这时因为假如没有这个限制,将会与JAVA语言的多态机制发生冲突(异常没有被捕获,将导致程序异常终止)。
*方法覆盖只存在于子类和父类(包括直接父类和间接父类)之间,在同一个类,方法只能重载,不能被覆盖。
|