重写与多态

重写

重写(Override)
概念:在继承关系中,方法的名称一样,参数列表也一样。
(重载:方法的名称一样,参数列表不一样)
方法的覆盖重写特点:创建的是子类对象,则优先用子类方法。

方法覆盖重写的注意事项
1.必须保证父子类之间方法的名称相同,参数列表也相同。
@Override:写在方法前面,用来检测是不是有效的正确覆盖重写。
2.子类方法的返回值必须【小于等于】父类方法的返回值范围。
3.子类方法的权限必须【大于等于】父类方法的权限修饰符。
public>protected>(default)>private
4.父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法。
5.子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)。
6.父类的私有方法不能被子类覆盖。
7.不能抛出比父类方法更多的异常。
例如:重写equal方法

public boolean equals(Object obj){
    if(this==obj){
        return true;
    }
    if(obj instanceof Pet){
        Pet p=(Pet)obj;
        //自定义比较规则
        //如果宠物的名称相同,则认为是同一个对象
        if(this.name!=null && this.name.equals(p.name) ){
            return true;
        }   
    }   
    return false;
}   

多态

什么是多态?
就是父类引用,指向子类对象。
格式:
父类名称 对象名=new 子类名称();
或者:
接口名称 对象名=new 实现类名称();
在多态的代码当中,成员方法的访问规则是:看new的是谁,就优先用谁,没有则向上找。
(编译看左边,运行看右边)

1.对象的向上转型,其实就是多态写法
格式:父类名称 对象名=new 子类名称();
含义:右侧创建了一个子类对象,把它当作父类来看待使用。
注意事项:向上转型一定是安全的,从小范围转向了大范围。但这时不能使用子类特有的属性和方法。
2.对象的向下转型,其实是一个【还原】的动作(要用instanceof关键字来判断类型)。
格式:子类名称 对象名=(子类名称)父类对象;
含义:将父类对象,【还原】成为本来的子类对象。
注意事项:
a.必须保证对象本来创建的时候,比如就是猫,才能向下转型成为猫。
b.如果对象创建的时候本来不是猫,现在非要向下转型成为猫,就会报错(ClassCastException)。

抽象类abstract关键词修饰类
抽象类不能被实例化(不能创建对象)
抽象方法:
抽象方法必须在抽象类中
抽象方法没有结构体
子类继承抽象类的时候,必须实现父类的抽象方法,除非这个子类也是抽象类

你可能感兴趣的:(笔记)