• Java学习笔记17---成员方法的重载与重写


    重载是指,一个类中定义了一个成员方法后,通过修改参数个数、参数类型或参数顺序,重新实现该方法,则这两个方法互为对方的重载方法。

    重写是指,子类重新实现父类的成员方法。

    重载后的方法,与原方法相比:

    (1).方法名相同,参数个数、参数类型及参数顺序至少有一个不同;

    (2).返回值类型与访问权限修饰符可以相同也可以不同,只修改这两项不能算重载;

    (3).静态成员方法也可以重载,重载后的方法也可以是非静态成员方法;

    (4).可以有多个重载方法。

    子类重写后的方法,与父类的方法相比:

    (1).方法名、参数个数、参数类型及参数顺序必须一致;

    (2).返回值类型为基本数据类型时,不可以修改,返回值为类类型时,可以修改,具体参见笔记13

    (3).访问权限修饰符可以修改也可以不修改,如果修改的话,必须要大于父类方法的访问范围;

    (4).静态成员方法也可以重写,但重写后的方法只是被隐藏,并未覆盖父类的方法,具体参见笔记12

    (5).一个子类只能重写父类的某个成员方法一次,否则,子类就会出现重名方法,会报错。

     重载是同一个类内部的多个成员方法互为重载方法,重写是子类的成员方法重写了父类的成员方法;重载一般是为了创建一组要完成相似任务的成员方法,重写的目的是为了实现多态,实现多态有3个条件:继承、重写、向上转型,缺一不可

    作者: 蝉蝉

    请尊重作者劳动成果,转载请在标题注明“转载”字样,并标明原文链接:

     http://www.cnblogs.com/chanchan/p/7906876.html 

    下面是简单的程序示例。

    Person类是Student类的父类,TestMain类是测试类,具体代码如下:

    Person类的代码:

    package human;
    
    public class Person {
        String name;
        int age;
        String gender;
    
        public Person() {
            
        }
        
    //笔记17:重载:方法名不变,参数的个数、类型及顺序至少与原方法有一个不同
    //可以更改返回值类型及访问权限修饰符,但不是必须的,只修改这两项也不算重载    
        public int overLoadP(int i, String s) {
            System.out.println("i = " + i + ", " + s);
            return i+1;
        }
    
    //    public char overLoadP(int i, String s) {
    //        return i+1;
    //    }
    
        //可以更改返回值类型及访问权限修饰符
        protected char overLoadP(int i) {
            System.out.println("i = " + i);
            return (char)(i+2);
        }
    
        public int overLoadP(int i, int n) {
            System.out.println("i = " + i + ", n = " + n);
            return i+n;
        }
    
        public int overLoadP(String s, int i) {
            System.out.println(s + ", i = " + i);
            return i;
        }
    
        static void overLoadPS() {
            System.out.println("静态成员方法可以重载吗");
        }
    
        void overLoadPS(int i) {
            System.out.println("静态成员方法可以重载");
        }
        
    }

    Student类的代码:

    package human;
    
    public class Student extends Person {
        String stuNumber;
        int score;
    
        public Student() {
            
        }    
        
    //笔记17:重写:方法名、参数的个数、类型及顺序都要与父类方法一致
    //子类重写时,只有返回值为类类型时,才可以更改返回类型,且只能改为返回值类型的子类
    //子类访问权限修饰符的范围要大于父类的
    //    public char overLoadP(int i, String s) {
        public int overLoadP(int i, String s) {
            System.out.println("子类重写:i = " + i + ", " + s);
            return i+1;
        }
    
    }

    TestMain类的代码:

    package human;
    
    public class TestMain {
        public static void main(String[] args) {
            
            Person per = new Person();
            Student stu = new Student();
            
            per.overLoadP(1);
            per.overLoadP(1, 2);
            per.overLoadP(1, "bokeyuanchanchan");
            per.overLoadP("bokeyuanchanchan", 1);
            per.overLoadPS(2);
            per.overLoadPS();
            
            stu.overLoadP(1,"博客园蝉蝉");
    }

    输出结果如下:

    1 i = 1
    2 i = 1, n = 2
    3 i = 1, bokeyuanchanchan
    4 bokeyuanchanchan, i = 1
    5 静态成员方法可以重载
    6 静态成员方法可以重载吗
    7 子类重写:i = 1, 博客园蝉蝉

    分析如下:

    关于重载:

    (1).最先定义了public int overLoadP(int i, String s)这个方法,方法名为overLoadP,有两个参数,分别为int型和String型,返回值为int型。

    (2).随后又定义了3个重名的方法,分别为:

    protected char overLoadP(int i)

    public int overLoadP(int i, int n)

    public int overLoadP(String s, int i)

    这3个方法与原方法的参数不同点分别在于,参数个数不同、参数类型不同、参数顺序不同,这3个方法都是原方法的重载方法,这4个方法互为对方的重载方法。

    其中protected char overLoadP(int i),返回值类型与访问权限修饰符也与原方法不同,可见这两项是可以修改的,但只修改这两项并不能算重载,见(3)。

    (3).Person类中下面注释掉的代码行,与第1个方法仅返回值不同,会出现“Duplicate method voerLoadP(int, String) in type Person”的错误。也就是说,仅返回值类型不同是不能算重载的。

    // public char overLoadP(int i, String s) {

    // return i+1;

    // }

    (4).由结果可知,静态成员方法也可以重载。

    关于重写:

    (5).子类重写了父类的public int overLoadP(int i, String s),方法名、参数个数、参数类型、参数顺序及返回值类型都与父类一致。

    对于代码中注释掉的行,不注释的话会提示返回值类型与父类返回值不一致的错误。

    // public char overLoadP(int i, String s) {

  • 相关阅读:
    Backbone源码解析(六):观察者模式应用
    NodeJs 开发微信公众号(五)真实环境部署
    NodeJs 开发微信公众号(四)微信网页授权
    NodeJs 开发微信公众号(三)微信事件交互
    NodeJs 开发微信公众号(二)测试环境部署
    NodeJs 开发微信公众号(一)准备工作
    Css 动画的回调
    GIT常用命令笔记
    论如何在手机端web前端实现自定义原生控件的样式
    Box-sizing:小身材,大拳头!
  • 原文地址:https://www.cnblogs.com/chanchan/p/7906876.html
Copyright © 2020-2023  润新知