java记录-重写(覆盖)和重定义(隐藏)的区别

一句话:对象现在是什么类型调用的就是什么类型的静态成员,但它调用的实例成员都是它自己的东西(因为它就是那个实例)不用考虑它现在是不是被转换成了父类类型。

隐藏和覆盖的区别
重定义(隐藏)这个操作只发生在子类有一个和父类相同的静态方法/变量时,父类的同名的属性或者方法形式上不见了,实际是还是存在的。
重写(覆盖)是子类有与父类相同的方法,子类的返回类型可以是父类返回类型的子类(称为协变)

被隐藏的属性,在子类被强制转换成父类后,访问的是父类中的属性,在无强制转换时子类要访问父类的属性使用super关键字。

public class keji extends Dog{
    static void eat(){
        System.out.println("柯基吃了");
    }
}


public class Tony extends keji{
    public static void main(String[] args) {
        keji tony = new Tony();
        System.out.println("tony是否是keji类型:"+String.valueOf(tony instanceof keji));
        System.out.println("tony是否是Tony类型:"+String.valueOf(tony instanceof Tony));
        tony.eat();
    }

    static void eat(){
        System.out.println("Tony吃了");
    }
}

//tony是否是keji类型:true
//tony是否是Tony类型:true
//柯基吃了

被覆盖的方法,在子类被强制转换成父类后,调用的还是子类自身的方法,这是多态的一部分

public class keji extends Dog{
    void eat(){
        System.out.println("柯基吃了");
    }
}

public class Tony extends keji{
    public static void main(String[] args) {
        keji tony = new Tony();
        System.out.println("tony是否是keji类型:"+String.valueOf(tony instanceof keji));
        System.out.println("tony是否是Tony类型:"+String.valueOf(tony instanceof Tony));
        tony.eat();
    }

    @Override
    void eat(){
        System.out.println("Tony吃了");
    }
}

//tony是否是keji类型:true
//tony是否是Tony类型:true
//Tony吃了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值