方法重载与方法覆写

1. 方法重载(overload):

定义:若干个方法名称相同,参数的类型或个数不同(即参数列表不同)的方法,与方法返回值无关!

public class FangFaChongZai {
    public static void main(String[] args) {
      System.out.println(add(10, 20));
      System.out.println(add(10, 20, 30));
      System.out.println(add(10.1, 20.1));
    }
    public static int add (int x, int y) {
        return x + y;
        }
    // 方法重载
    public static int add (int x, int y, int z) {
        return x + y + z;
        } 
    // 又重载
    public static double add (double x, double y) {
        return x + y;
        }  
}

 

  • 问题:能否定义两个方法名称相同,参数个数、类型也相同但是返回值不同的方法?
public class FangFaChongZai {
    public static void main(String[] args) {
      System.out.println(add(10, 20));
      System.out.println(add(30, 40));
    }
    public static int add (int x, int y) {
        return x + y;
        }
    // 就光是返回值不同
    public static double add (int x, int y) {
        return x + y;
        } 
}

 

编译出错,所以坚决不能!!!

2. 方法覆写(override):

子类定义了与父类方法名称、参数、返回值完全一样的方法(没提权限!)。被覆写的方法不能拥有比父类更严格的方法访问权限(即

子类方法权限 >= 父类方法权限)

class Person {
    public void print() {
        System.out.println("1.Person类的print方法");
    }
}
class Student extends Person {
    // 方法覆写
    public void print() {
        System.out.println("2.Student类的print方法");
    }
}
public class FangFaFuXie {
    public static void main(String[] args) {
        new Student().print();
    }
}

这里的 new Student().print() 这句是先产生了一个 Student 类的对象,然后再调用 print 方法,Student 类又继承了 Person 类,

所以这里到底是会执行哪个类的 print 方法???

显然结果是执行了 Student 类的 print 方法。

结论:当前调用方法是通过哪个类new的并且此方法也被子类所覆写,调用的一定是覆写后的方法!!!

我们可以接着做个对比,下面的是通过 Person 类产生了一个对象。

class Person {
    public void print() {
        System.out.println("1.Person类的print方法");
    }
}
class Student extends Person {
    public void print() {
        System.out.println("2.Student类的print方法");
    }
}
public class FangFaFuXie {
    public static void main(String[] args) {
        new Person().print();
    }
}

 

结果就变成了执行了 Person 类的 print 方法。

  • 那么还存在一个权限的问题,被覆写的方法不能拥有比父类更严格的方法访问权限,这句的意思又是什么呢?

现在已经接触了三种访问控制权限:private < default < public。那么也就意味着如果父类使用public进行方法声明,那么子类必

须也使用public;如果父类使用default,那么子类可以使用default或者public。

错误的覆写:

class Person {
    public void print() {
        System.out.println("1.Person类的print方法");
    }
}
class Student extends Person {
    // 更严格的访问控制权限,错误
    void print() {
        System.out.println("2.Student类的print方法");
    }
}
public class FangFaFuXie {
    public static void main(String[] args) {
        new Person().print();
    }
}

 

  • 问题:如果现在父类方法使用private定义,子类中使用public覆写,对吗?
class Person {
    private void print() {
        System.out.println("1.Person类的print方法");
    }
}
class Student extends Person {
    public void print() {
        System.out.println("2.Student类的print方法");
    }
}
public class FangFaFuXie {
    public static void main(String[] args) {
        new Person().print();
    }
}

 

 原因:如果父类方法使用了 private 定义,那么就表示该方法只能被父类使用,子类无法使用。换言之,子类根本就不知道父类

有这样的方法。这个时候子类中的该方法只是子类定义的新方法而已,并没有和父类的方法有任何关系。

结论:private方法无法被覆写!!!

 

*** 下面这张图可以充分说明二者之间的区别与联系:

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值