java多态的理解

一.多态性
  在java语言中,多态性体现在两个方面:由方法重载实现的静态多态性(编译时多态)和方法重写实现的动态多态性(运行时多态)。
  1) 编译时多态
  在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。
  2) 运行时多态
  由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。
  ◇ 重写方法的调用原则(读者朋友请注意此处为重点):java运行时系统根据调用该方法的实例,来决定调用哪个方法。对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法;如果子类继承了父类的方法(未重写),则运行时系统调用父类的方法。

一.对象的类型转换
1、子类转换成父类(经典例题)
class A {
     public void func1() {
          System.out.println("A func1 is calling.");
     }
     public void func2() {
          func1();
     }
}
class B extend A {
     public void func1() {
          System.out.println("B func1 is calling.");         
     }
     public void func3() {
          System.out.println("B func3 is calling.");
     }
}
class C {
     public static void main(String[] args) {
          B b = new B();
          A a = b;
          callA(a);
          callA(new B());
     }
     public void callA(A a) {
          a.func1();
          a.func2();
     }
}
     编译器能够自动将类B的实例对象b直接赋值给A类的引用变量,也就是子类能够自动转换成父类类型。另外,程序可以直接创建一个类B的实例对象,传递给需要类A的实例对象作参数的callA()方法,在参数传递的过程中发生了隐式自动类型转换。子类能够自动转换成父类的道理非常容易理解。

难点剖析:(笔者此前查过很多资料费尽周折理解后与大家共享)


问题:为什么类B从类A继承来的func2里调用的func1变成了子类B的func1?Java多态性



提示:编程的时候眼睛就盯着内存去想问题,而不是盯着程序代码,肯定能想明白这个问题

答案:B类重写了A类的fun1和fun3,所以调用时肯定是子类B的.
而fun2是子类B继承来的,当调用fun2时,是用的父类A的fun2方法,但fun2方法又调用了fun1(这时的fun1就是子类B的了,因为子类B重写了这个方法)
     我认为这类问题就是先从子类去看,只要是子类重写了父类的,那么调用的就是子类的,而没有重写的才是调用父类。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值