一,重写(Override):子类对父类允许访问的方法在不改变返回值和形参的重新编写
public class Father{
public void skill(){
System.out.println("造导弹");
}
}
public class Son extends Father{
public void skill(){
super.skill();//当需要在子类中调用父类的被重写方法时,要使用super关键字
System.out.println("造飞机");
}
}
public class Test{
public static void main(String args[]){
Father a = new Father(); // Father 对象
Father b = new Son(); // Son 对象
a.skill();// 执行 Father 类的方法
b.skill();//执行 Son 类的方法
}
}
规则:
参数列表必须相同,返回类型可以是父类返回值的派生类,否则必须相同
访问权限不能比父类被重写的方法访问权限更低
声明为final,static的方法无法重写,但是static的可再次声明
父类的成员方法只能被其子类重写
同一个包中,子类可以重写父类除了private和final的所有方法,在不同包时只能重写父类声明为public和protected的非final方法
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常
构造方法不能被重写
如果不能继承一个方法,则不能重写这个方法
二,重载(Overload):在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同
public class Overloading {
public int test(){
System.out.println("test1");
return 1;
}
public void test(int a){
System.out.println("test2");
}
//以下两个参数类型顺序不同
public String test(int a,String s){
System.out.println("test3");
return "returntest3";
}
public String test(String s,int a){
System.out.println("test4");
return "returntest4";
}
public static void main(String[] args){
Overloading o = new Overloading();
System.out.println(o.test());
o.test(1);
System.out.println(o.test(1,"test3"));
System.out.println(o.test("test4",1));
}
}
规则:
被重载的方法参数列表不一样(参数个数或类型不一样)
被重载的方法可以改变返回类型,所以无法以返回值类型作为重载函数的区分标准
被重载的方法可以改变访问修饰符
被重载的方法可以声明新的或更广的检查异常
方法能够在同一个类中或者在一个子类中被重载
三,多态:多态是同一个行为具有多个不同表现形式或形态的能力。
好处:
消除耦合性,灵活性,接口性,替代性,扩充性,简化性
多态存在的条件:
1,继承
2,重写
3,父类引用指向子类对象
多态的实现方式:
1,重写
2,接口
3,抽象类和抽象方法