• 【Java方法覆盖 09】


    一、方法覆盖

    1、什么时候使用方法覆盖

    如果父类方法中已经无法满足当前子类业务需求

    子类需要将父类中的方法重新写一遍,这个时候发生方法覆盖

    2、子类覆盖掉父类中的方法后,将来子类对象一定调用的是重写之后的方法

    3、发生方法重载(overload)的条件,在同一个类中如果功能相似,有必要使用重载机构。

    第一:在同一个类中

    第二:方法名相同,参数列表不同(顺序,数量,类型)

    第三、和修饰符无关

    第四、和返回值类型无关

    4、发生方法覆盖的条件:

    第一、发生在继承关系的父子类中

    第二、返回值类型一致,方法名一致,参数列表一致

    第三、修饰符的权限不能更低

    第四、抛出的异常不能更多

    第五、构造方法不能被继承,所以不存在覆盖

    第六、私有的方法无法被覆盖(多态后解释)

    第七、静态的方法不存在覆盖(多态后解释)

    第八、覆盖只针对成员方法,和成员变量无关

    package com.JavaStudy.study0429;
    
    public class Animal {
    
        public void move(){
            System.out.println("动物在移动!");
        }
    }
    package com.JavaStudy.study0429;
    
    public class Cat extends Animal {
    
        @Override  //注解,作用是校验是否满足当前的语言
        public void move(){//方法覆盖发生在继承类内,并且方法名,类型都相同
            System.out.println("猫在移动!");
        }
    }
    package com.JavaStudy.study0429;
    
    public class BackCat extends Cat{
    
        public void move(){
            System.out.println("黑猫警长在移动!");
        }
    }
    package com.JavaStudy.study0429;
    
    public class Test {
        public static void main(String[] args){
            Animal a = new Animal();
            a.move();
    
            BackCat b = new BackCat();
            b.move();
        }
    }

    ===执行结果===
    动物在移动!
    黑猫警长在移动!

    练习题:

    程序1
    1)、写一个类,名为Animal,该类有两个私有属性,name(代表动物的名字),和legs(代表动物的腿的条数);要求为两个私有属性提供public的访问方法,并提供两个重载的构造方法,一个需要两个参数,分别用着两个参数给私有属性name和legs赋值为4;另要求在第二个构造方法中调用第一个构造方法,该类还有两个重载move()方法,其中一个无参,在屏幕上输出一行文字:xxx Moving!!(XXX为该动物的名字);领一个需要int参数n,在屏幕上输出xxx Moving n 米!!

    2)、写一个类Fish,继承Animal类,并提供一个构造方法,该构造方法需要一个参数name,并给legs赋默认值0,该类还要求覆盖Animal类中的无参move()方法,要求输出:xxx Swimming!!

    3)、写一个类Bird,继承自Animal类,并提供一个构造方法,该构造方法需要一个参数name,并给legs默认值2,该类还要求覆盖Animal类中的无参move()方法,要求输出:XXX Flying!!

    4)、写一个类Zoo ,定义一个主方法,在主方法中分别生成若干个Animal,Fiah,Bird,并调用他们的属性和方法

    package com.JavaStudy.study0430;
    /*
     【程序1】
     (1)写一个类,名为Animal,该类有两个私有属性,name
     (代表动物的名字),和legs(代表动物的腿的条数);
     要求为两个私有属性提供public的访问方法。并提供
     两个重载的构造方法,一个需要两个参数,分别用这
     两个参数给私有属性name和legs赋值。另一个无参,
     默认给name赋值为AAA,给legs赋值为4;另要求在第二
     个构造方法中调用第一个构造方法。该类还有两个重
     载的move()方法,其中一个无参,在屏幕上输出一行
     文字:XXX Moving!!(XXX为该动物的名字);另一个需
     要一个int参数n,在屏幕上输出 XXX Moving n 米!!
    */
    
    public class Animal {
        private String name;
        private int legs;
    
        public void setName(String name){
            this.name=name;
        }
        public String getName(){
            return name;
        }
    
        public void setLegs(int legs){
            this.legs = legs;
        }
        public int getLegs(){
            return legs;
        }
    
        Animal(String name,int legs){
            this.name = name;
            this.legs = legs;
        }
        Animal(){
            this("AAA",4);
        }
        public void move(){
            System.out.println(getName()+" Movng!!!");
        }
    
        public void move(int n){
            System.out.println(getName()+" Moving "+n+"米");
        }
    
    }
    package com.JavaStudy.study0430;
    
    /*
     (2)写一个类Bird,继承自Animal类,并提供一个构造方法,
     该构造方法需要一个参数name,并给legs赋默认值2;该
     类还要求覆盖Animal类中的无参move()方法,要求输出
     :XXX Flying!!
     */
    public class Bird extends Animal{
        Bird(String name){
            super(name,2);//super(),子类给父类赋值
    
        }
    
        @Override
        public void move() {
            System.out.println(getName()+" swimming! ");
        }
    }
    package com.JavaStudy.study0430;
    
    /*
     (3)写一个类Fish,继承自Animal类,并提供一个构造方法,
     该构造方法需要一个参数name,并给legs赋默认值0;该
     类还要求覆盖Animal类中的无参move()方法,要求输出
     :XXX Swimming!!
     */
    public class Fish extends Animal{
        Fish(String name){
            super(name,0);
        }
    
        @Override
        public void move(){
            System.out.println(getName()+" Flying! ");
    
        }
    
    }
    package com.JavaStudy.study0430;
    
    /*
    (4)写一个类Zoo,定义一个主方法,在主方法中分别生成若
    干个Animal,Fish和Bird.并调用他们的属性和方法。
    */
    public class Zoo {
        public static void main(String[] args){
            Animal a1 = new Animal();
            Animal a2 = new Animal("马",4);
            a1.move();
            a1.move(5);
            System.out.println("----------------");
            a2.move();
            a2.move(5);
    
            System.out.println("----------------");
            Bird bird = new Bird("鹦鹉");
            bird.move();
    
    
            System.out.println("----------------");
            Fish fish = new Fish("鲤鱼");
            fish.move();
    
        }
    }
    
    ====执行结果====
    AAA Movng!!!
    AAA Moving 5米
    ----------------
    马 Movng!!!
    马 Moving 5米
    ----------------
    鹦鹉 swimming! 
    ----------------
    鲤鱼 Flying! 

    考察的知识点:

    1、this()放在构造方法的第一行,实现构造方法的调用,(代码重用)

    2、继承:子类可以复用父类的方法,属性

    3、super()放在成员方法内,实现子类对父类的赋值

    4、实现方法的覆盖(修饰符,方法名,数据类型,参数一致)

  • 相关阅读:
    LUOGU P4113 [HEOI2012]采花
    LUOGU P4251 [SCOI2015]小凸玩矩阵
    bzoj 3230 相似子串——后缀数组
    bzoj 4453 cys就是要拿英魂!——后缀数组+单调栈+set
    洛谷 5061 秘密任务——二分图染色
    bzoj 4104 [Thu Summer Camp 2015]解密运算——思路
    bzoj 4319 cerc2008 Suffix reconstruction——贪心构造
    poj 3415 Common Substrings——后缀数组+单调栈
    CF 504E Misha and LCP on Tree——后缀数组+树链剖分
    bzoj 4278 [ONTAK2015]Tasowanie——后缀数组
  • 原文地址:https://www.cnblogs.com/frankruby/p/12808686.html
Copyright © 2020-2023  润新知