java 方法重写和重载

方法重写:

    子类方法可以定义新的特征,当子类修改父类的方法进行扩展,增大功能,就需要进行方法重写的操作,重写建立在继承关系上,子类既可以隐藏和访问父类的方法,又可以覆盖继承父类的方法,覆盖继承父类的方法就是通过方法的重写来实现的。

    所谓的方法重写:子类中的方法与父类中继承的方法有完全相同的返回值类型,方法名,参数个数以及参数类型。

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,程序运行时会报错。

    4、在继承中如果父类中的方法抛出异常, 那么在子类中重写该方法时,也要抛出异常,而且抛出的异常不能多余父类中抛出的异常,换句话说,重写方法,一定不能抛出新的检查异常,或者比被重写方法声明更加宽泛的检查型异常。例如,父类的一个方法申明了一个检查异常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

定义

方法名称相同,参数的类型或个数不同

方法名称、参数类型、返回值类型全部相同

对权限没有要求

被重写的方法不能拥有更严格的权限

范围

发生在一个类中

发生在继承类中

 



猜你喜欢

转载自blog.csdn.net/zhengshengnan123/article/details/72876367