一.多态性
在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?
提示:编程的时候眼睛就盯着内存去想问题,而不是盯着程序代码,肯定能想明白这个问题
答案:B类重写了A类的fun1和fun3,所以调用时肯定是子类B的.
而fun2是子类B继承来的,当调用fun2时,是用的父类A的fun2方法,但fun2方法又调用了fun1(这时的fun1就是子类B的了,因为子类B重写了这个方法)
我认为这类问题就是先从子类去看,只要是子类重写了父类的,那么调用的就是子类的,而没有重写的才是调用父类。
java多态的理解
最新推荐文章于 2024-06-25 05:03:58 发布