深入理解对象的上转型和动态绑定机制

文章详细阐述了Java中的上转型概念,即父类引用指向子类对象,强调了编译类型和运行类型的差异。动态绑定机制在方法调用中的作用被突出,说明了属性不具有动态绑定,而方法调用会根据运行时的对象类型决定。文中通过一个例子解释了如何在上转型对象上调用方法和访问属性,展示了如何影响父类和子类成员的访问和行为。
摘要由CSDN通过智能技术生成
  1. 上转型本质:是一种多态的体现,父类的引用指向了子类的对象。
  2. 语法:父类类型引用名=new子类类型();
  3. 特点:

1)编译类型看左边,运行类型看右边。
2)可以调用父类中的所有成员(需遵守访问权限),

3)不能调用子类中特有成员;

4)最终运行效果看子类的具体实现!

5)成员变量的隐藏:只要子类与父类的成员变量同名即可,类型可改变

6)方法的覆盖:子类方法的名字、返回类型、参数个数和类型与父类完全相同

举例:

4.两个概念:编译类型和运行类型,前者是在编译阶段就确定的类型,后者是在实际运行时的类型。要明确的是一个对象的编译类型和运行类型是同时具有的,简单来讲,=左边是编译类型,=右边是运行类型。 

5.动态绑定机制

1)调用对象方法时,该方法会和该对象的内存地址,也就是运行类型绑定

2)调用对象属性时,没有动态绑定机制,哪里声明哪里调用。

5.属性看编译,方法看运行

举例

 说明:可以看出,第一行输出10,因为count是属性,属性看编译类型,编译类型是Base,所以会访问Base中的count,是10;

第二行输出20,编译类型是Sub,就访问Sub中的count,是20;

6.一个上转型的综合例子!!!(看懂这个,上转型的语法你就完全理解了)

父类是People,子类是GoodPeople,子类隐藏了父类的age属性,覆盖了父类的getAge方法,但是没有覆盖父类的setAge,因为参数类型不一样,子类是double,父类是int,所以就可以认为,子类的setAge是子类特有的方法,而对于上装型对象来说,是无法调用子类特有的方法的。

public class test02 {
    public static void main(String[] args) {
        People gp=new GoodPeople();
        gp.setAge(50);//这里调用的是父类的setAge()方法,而不是子类的!一定注意!
        System.out.println(gp.age);//这里打印出是父类的age,因为已经提到,属性看编译,age是属性,所以得看gp的编译类型,编译类型看=左边,是People,所以修改了父类的age
        System.out.println(gp.getAge());//getAge由于动态绑定机制,当gp调用方法时,已经和运行类型绑定了,运行类型是=右边的GoodPeople也就是子类,所以会找到子类的getAge(),这里return的age是父类的age,还是子类的age呢?我们说了,属性没有动态绑定机制,哪里声明,哪里使用,在子类声明的,那就是子类的age,
    }
}
class People{
    int age=30;
    public void setAge(int age) {
        this.age=age;
    }
    public double getAge() {
        return age;
    }
}
class GoodPeople extends People{
    double age=40;//变量(属性)隐藏
    public void setAge(double age) {//实际上并未覆盖父类的setAge,因为参数类型不一样,是double
        this.age=age;
    }
    public double getAge() {//方法覆盖
        return age;
    }
}

上面注释的三个语句非常重要,我单独放到下面, 

        gp.setAge(50);//这里调用的是父类的setAge()方法,而不是子类的!一定注意!所以就把父类的age改成50了。
       System.out.println(gp.age);//这里打印出是父类的age,因为已经提到,属性看编译,age是属性,所以得看gp的编译类型,编译类型看=左边,是People,所以访问了了父类的age,打印出50
        System.out.println(gp.getAge());//getAge由于动态绑定机制,当gp调用方法时,已经和运行类型绑定了,运行类型是=右边的GoodPeople也就是子类,所以会找到子类的getAge(),这里return的age是父类的age,还是子类的age呢?我们说了,属性没有动态绑定机制,哪里声明,哪里使用,在子类声明的,那就是子类的age,也就是40.0,打印出40.0

综上,这段代码打印出50,40.0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.别止步春天.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值