Java多态的使用注意事项
Java多态是如何实现的? 复制代码 代码如下: class shape { public void draw() { print("shape"); print("triangle"); 结果是triangle s是一个shape引用,但是在运行时因为是triangle对象,所以还是调用了triangle的draw方法。 Java多态中的一些陷阱 重写私有方法? 复制代码 代码如下: public class Polymorphism { private void show() { print("show parent"); print("show derived"); 结果是 show parent 字段和静态方法的多态? 复制代码 代码如下: class shape { protected int perimeter=1; public void draw() { print("shape"); return perimeter; int perimeter=3; print("triangle"); return perimeter; return super.perimeter; 以下是运行结果: 1.triangle对象向上转型成shape后字段直接访问都是由编译器确定的,因此不会表现出多态性,返回的是1。 2.triangle对象向上转型成shape后调用方法访问字段是根据运行时对象类型延时绑定调用了triangle的getperimeter方法,返回的是3 3.t对象中包含了两个perimeter字段,一个来自于他本身,一个来自于他的父类。同时用字段名去调用该字段时默认返回的是他本身的perimeter字段,要调用从父类继承的该字段,要用super.perimeter的方法。 这个结果看起来多多少少让人有些疑惑,为了避免这种情况出现,我们一般都把字段声明为private(子类就无法继承),同时我们在子类中声明的字段最好不要与从父类继承的字段同名。 静态方法是没有多态性的,因为静态方法是和类绑定的,不会存在不知道具体类型的情况。 构造函数的多态性? 现在假设如果在第二步中,我们在父类的构造函数里调用了某个方法,这个方法是不是多态的?还是来看一个具体的例子: 复制代码 代码如下: class shape { protected int perimeter=1; public shape() { draw(); print("shape created"); print("draw shape "+perimeter); int perimeter=3; public triangle() { print("triangle created"); } print("draw triangle "+perimeter); return perimeter; public class Polymorphism { 运行结果:
我们可以看到虽然triangle对象还没有构造完毕,draw方法仍是动态绑定到了triangle的draw方法。同时注意到perimeter的值还没有初始化为3,而是0。 这样的结果就是我们在triangle对象还没有被初始化之前就访问了其中的字段。因此我们在实际应用中要避免在构造函数中调用其他方法,或者只调用私有方法(不会被继承,因此不会引发该问题) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |