在Java的继承机制中,提供了方法的重载和重写(覆盖),在日常学习和笔试面试时常常容易混淆,因此,下面我们一起讨论下,有不足给我发评论,立即修改。

       1.方法的重载

           方法的重载必须满足一下条件:

               *方法名相同

               *方法的参数类型、个数、顺序至少有一项不相同

               *方法的返回类型可以不相同

               *方法的修饰符可以不相同

       2.方法的覆盖(重写)

               1.子类的方法的名称、参数类型和返回类型与父类的方法的名称、参数类型和返回类型一致。

               2.子类方法不能缩小父类方法的访问权限。

               3.子类方法不能抛出比父类方法更多的异常。

               4.方法的覆盖(重写)只能存在于子类和父类(包括直接父类和间接父类)之间,在同一个类中方法只能被重载,不能被覆盖(重写)。

               5.父类的静态方法不能被子类覆盖(重写)为非静态的方法。

               6.子类可以定义与父类静态方法同名的静态方法,以便在子类中隐藏父类的静态方法,在编译时,子类定义的静态方法也必须满足与方法覆盖(重写)类似的约束。

               7.父类的静态方法不能被子类覆盖(重写)为非静态方法。

               8.父类的私有方法不能被子类覆盖(重写)。

               9.父类的抽象方法可以通过两种途径覆盖(重写):一是子类实现父类的抽象方法;二是子类重新声明父类的抽象方法。

               10.父类的非抽象方法可以覆盖(重写)为抽象方法。

       3.方法覆盖(重写)和方法重载具有以下不同点:

            *方法覆盖(重写)要求参数签名必须一致,而方法重载要求参数签名必须不一致

               *方法覆盖(重写)要求返回类型必须一致,而方法重载对此不做限制

               *方法覆盖(重写)只能用于子类覆盖(重写)父类的方法,方法重载用于同一个类的所有方法(包括从父类中继承而来的方法)。

               *方法覆盖(重写)对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这力面没有任何限制。

               *父类的一个方法只能被子类覆盖(重写)一次,而一个方法在所在的类中可以被重载多次。

       方法的重载的小例子:

package Work;
public class Test002 {
    public static void main(String[] args) {
        System.out.println(add(3));
        System.out.println(add(3,4));
        System.out.println(add(3.1,4.2));
    }
    public static int add(int a,int b){
        return a+b;
    }
    //一下为方法的重载分别为参数类型不同,参数个数不同
    public static float add(float a,float b){
        return a+b;
    }
    public static double add(double a,double b){
        return a+b;
    }
    public static double add(double a){
        return a;
    }
}

程序运行的结果为:

075654423.jpg



总结:方法的重载都在一个类中,同类中的同名方法都为方法的重载。

方法的重写(覆盖)的小例子:

下面为父类的代码(注意printMessage()方法):

package Work;
public class Father {
    private String name ;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void printMessage(){
        System.out.println("我是Father类中的方法!!");
    }
}

下面是子类的代码(仅含有从父类继承过来的东西和对pringMessage()方法的重写):

package Work;
public class Son extends Father{
    public void printMessage(){
        System.out.println("我是Son类中的方法!!!");
    }
}

   下面是我写的一个测试程序:

package Work;
public class Text {
    public static void main(String[] args) {
        Father son = new Son();
        son.printMessage();
        Father fat = son;//此为Java中的多太
        fat.printMessage();
    }
}

       程序的运行结果又是什么呢????

172650938.jpg

       怎么能够然程序执行父类的printMessage()方法呢????

程序代码:

package Work;
public class Text {
    public static void main(String[] args) {
        Father son = new Son();
        son.printMessage();
        Father fat = son;//此为Java中的多太
        fat.printMessage();
        fat = new Father();
        fat.printMessage();
    }
}

程序的运行结果:

173002634.jpg

总结:在父子类之间的同名方法,一般都为方法的重写(覆盖),如果方法的参数类型、个数和顺序都相同则一定是方法的重写(覆盖)。