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