【Java方法覆盖009】

一、方法覆盖

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、实现方法的覆盖(修饰符,方法名,数据类型,参数一致)

猜你喜欢

转载自www.cnblogs.com/frankruby/p/12808686.html
今日推荐