多态

一、子类引用指向自身的对象

1.调用父类的方法时,父类方法中使用的this.属性调用的是父类的属性,而不是子类自身的属性

示例1:

public class TestWork1 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.introduce();
    }
}
public class Pet {
    private String name;
    public void introduce() {
        System.out.println("我是一个" + this.name);
    }
}
public class Dog extends Pet {
    private String name = "这是子类的狗";

    @Override
    public String getName() {
        return name;
    }
}

结果:我是一个null

在创建Dog类对象的时候,先初始化父类,而父类的name属性并没有赋值,因此默认为null,然后初始化子类。在调用dog的introduce方法时,由于Dog类没有重写introduce方法,因此调用父类的该方法,而父类的introduce方法中使用的this.name则是父类本身的name属性,因此为null

 

2.若子类重写了父类的方法,则父类方法中的this.方法调用的是子类的方法(动态连接、动态调用) ,若子类没有重写父类的方法,则使用的是父类本身的方法

示例2:

将上例中的Pet类的introduce方法修改如下

public class Pet {
    private String name;
    public void introduce() {
        System.out.println("我是一个" + this.getName());
    }
}

结果:我是一个这是子类的狗

此时调用dog对象的introduce方法,由于Dog类没有重写该方法,所以依然使用父类的该方法,此时父类的该方法中使用的是this.getName方法,而子类重写了该方法,因此在该方法中使用的是子类的该方法,即获取到的是子类的name属性值。

3.变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错

 

二、父类引用指向子类对象

1.父类类型的引用可以调用父类中定义的所有属性和方法

2.对于子类中定义而父类中没有的属性或方法,父类引用无法调用

3.子类重定义父类已有的方法时,父类引用调用的是子类重写过的方法

4.子类重定义父类已有的属性,父类引用调用的还是本类的属性值

 

多态性:发送消息给某个对象,让该对象自行决定响应何种行为。 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值