方法重写:
子类方法可以定义新的特征,当子类修改父类的方法进行扩展,增大功能,就需要进行方法重写的操作,重写建立在继承关系上,子类既可以隐藏和访问父类的方法,又可以覆盖继承父类的方法,覆盖继承父类的方法就是通过方法的重写来实现的。
所谓的方法重写:子类中的方法与父类中继承的方法有完全相同的返回值类型,方法名,参数个数以及参数类型。
package javatest;
class Parent {
public void print(){
System.out.println("parent class");
}
}
class Child extends Parent{
public void print(){
System.out.println("Child class"); //输出Child class
}
}
public class TestOverwrite{
public static void main(String args[]){
Child c = new Child();
c.print();
}
}
输出结果:
Child class
子类重写过父类的方法后,使用c调用的方法一定是子类的方法, 父类中的方法被覆盖, 那么,如果现在想要调用父类的方法需要怎么做呢?
通过使用super关键字来实现。
package javatest;
class Parent {
public void print(){
System.out.println("parent class");
}
}
class Child extends Parent{
public void print(){
super.print(); //输出parent class
System.out.println("Child class"); //输出Child class
}
}
public class TestOverwrite{
public static void main(String args[]){
Child c = new Child();
c.print();
}
}
输出结果:
parent class
Child class
总结重写规则:
1、父类方法的参数列表必须与被子类重写的方法的参数列表完全相同;
2、父类方法的返回类型必须与被子类重写的方法的返回类型完全相同;
3、java中规定,被子类重写的方法不能拥有比父类方法更严格的访问权限。
父类中的方法并不是任何时候都可以进行重写的,当父类方法的访问权限修饰符为private时,该方法只能被自己的类访问,不能被外部的类访问,在子类是不能被重写的。如果定义父类的方法为public,在子类定义为private,程序运行时会报错。
或者比被重写方法声明更加宽泛的检查型异常。例如,父类的一个方法申明了一个检查异常IOException,在重写这个方法时就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。
方法重载:
多态。
所谓的方法重载,在一个类中方法的名称相同,但是参数列表不同。参数列表不同指的是参数个数,参数类型或者参数顺序不同。
package javatest;
class Person{
String name;
int age;
void print(){
System.out.println("姓名:" + name + " 年龄:" + age);
}
void print(String a,int b){
System.out.println("姓名:" + a + " 年龄:" + b);
}
void print(String a,int b,int c){
System.out.println("姓名:" + a + " 年龄:" + b + " ID:" + c);
}
}
public class TestOverload {
public static void main(String args[]){
Person p = new Person();
p.name = "初始";
p.age = 12;
p.print();
p.print("lucy", 23);
p.print("toto", 33, 12890);
}
}
输出结果:
姓名:初始 年龄:12
姓名:lucy 年龄:23
姓名:toto 年龄:33 ID:12890
在方法重载时,方法之间需要存在一定的联系,因为这样可以提高程序的可读性,一般只重载功能相似的方法重载规则。重载是指我们可以定义一些名称相同的方法,通过定义不同的参数来区分这些方法,然后再调用时,Java虚拟机就会根
据不同的参数列表来选择合适的方法执行。也就是说,当一个重载方法被调用时,Java用参数的类型和.. (或)个数来决定实际调用的重载方法。因此,每个重载方法的参数的类型或个数必须是不同。虽然每个重载方法可以有不同的返回类型,
但返回类型并不足以区分所使用的是哪个方法。当Java调用一个重载方法是,参数与调用参数匹配的方法被执行。在使用重载要注意以下的几点:
1.在使用重载时只能通过不同的参数列表,必须具有不同的参数列表。例如,不同的参数类型,不同的参数个数,不同的参数顺序。当然,同一方法内的几个参数类型必须不一样,例如可以是 fun(int,float),但是不能为 fun(int,int)。
2.不能通过访问权限、返回类型、抛出的异常进行重载。
3.方法的异常类型和数目不会对重载造成影响。..
4.可以有不同的返回类型,只要参数列表不同就可以了。
5.可以有不同的访问修饰符。
6.可以抛出不同的异常。
区别点 | 重载 | 重写(覆写) |
英文 | Overloading | Overiding |
定义 | 方法名称相同,参数的类型或个数不同 | 方法名称、参数类型、返回值类型全部相同 |
对权限没有要求 | 被重写的方法不能拥有更严格的权限 | |
范围 | 发生在一个类中 | 发生在继承类中 |