美文网首页
重写&重载

重写&重载

作者: 竹鼠不要中暑 | 来源:发表于2019-02-14 22:55 被阅读29次

    重写(Override)和重载(Overload)的区别

    区别点 重载方法 重写方法
    参数列表 必须修改 一定不能修改
    返回类型 可以修改 一定不能修改
    异常 可以修改 可以减少或删除,一定不能抛出新的或者更广的异常
    访问 可以修改 一定不能做更严格的限制(可以降低限制)

    所以重写就是方法内的逻辑改变,但方法名、参数列表、返回值类型等都不能变;而重载则是方法名不变,其他都可以变,其中参数列表必须改变。

    总结:

    方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,方法重载一个类多态性表现,而方法重写子类与父类的一种多态性表现。

    • 方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同;
    • 方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法。

    举例

    学习了这一节,我发现我在上一节“继承”中写的例子实际上就使用了重写和重载:

    // 父类
    public class Wolf {
        private int age;
        private double weight;
        protected String name = "wolf";
    
        public Wolf(int age) {
            this.age = age;
        }
    
        public Wolf(int age, double weight) {
            this(age);
            this.weight = weight;
        }
    
        public void eat() {
            System.out.println("Wolf: eat");
        }
    }
    

    Wolf类中写了两个构造函数,它们的参数列表不同,这就是重载,体现了一个类的多态性;

    // 子类
    public class Dog extends Wolf {
        protected String name = "dog";
    
        public Dog(int age, double weight) {
            super(age, weight); // 调用父类的构造方法
        }
        @Override
        public void eat() {
            System.out.println("Dog: eat");
        }
    
        public void eatTest() {
            super.eat(); // 调用与父子同名的父类成员方法
            this.eat();
        }
    
        public void printNameTest() {
            System.out.println("Father's name: " + super.name);
            System.out.println("My's name: " + name);
        }
    }
    

    Dog类中也有一个eat方法,和它的父类Wolf的eat方法参数列表和返回值类型相同(都无),只是输出的具体内容不同,这就是重写,体现了父类和子类的多态性。并且,如eatTeat方法中所示,在子类中可以通过super关键字调用父类被重写的方法。

    相关文章

      网友评论

          本文标题:重写&重载

          本文链接:https://www.haomeiwen.com/subject/tupyeqtx.html