「Java」为什么“多态”
简述:多态( polymorphism
)在 OOP
( object-oriented programming
,面向对象编程)很常见,但却不好理解。窝以为窝懂了,后来发现自己原来不太懂。
这一刻,窝还在盲人摸象,希望通过分析多态的优缺点来了解它。我自己摸索着去理解它,所以这些内容不一定是对的。
1 多态
简单地说,多态就是:
- 父类引用指向子类对象。
1 | Animal a = new Cat(); // Animal 是 Cat 的父类。 |
- 子类要重写(
Override
)父类的方法。
如果不了解多态,可以点这里。
2 优点
鉴于参考内容的示例代码非常不错,窝就抄过来用了,见谅见谅。这里是出处。
多态当然是有它的优点,才会被引入的嘛。
通过继承和重写(
Override
)非静态方法,对父类进行特定的改写。虽然引用变量
a
引用的是子类Cat
的对象,但a
能访问的是Animal
的成员变量/常量Animal
的静态方法Animal
中未被子类Cat
重写的非静态方法-
Cat
中重写的非静态方法。
简单地说,就是不能访问
Animal
中那些被重写的非静态方法。但是,经过强制转型(
((Cat) a)
),就又变了个样,比较魔幻了。看不懂不要紧,看代码就好了。总结:父类引用指向子类对象,等于指向一个改变了(在子类中重写的)某些非静态方法的父类的对象。
1 | public class Test { |
- 复用代码
1 | public void test(Animal a) { |
调用 test
函数时,传入参数可以是 Animal
的对象,也可以是 Animal
的子类的对象。
不需要针对 Animal
子类的对象重载( Overload
)test
函数,如 public void test(Cat c)
。
- 其他。。。
代码撸得不够多,想不出来了。
3 缺点
- 父类引用指向子类对象,无法通过父类引用访问子类的成员变量与静态方法。
1 | public class Test { |
输出: 找不到对象的方法 catchMouse()
和 成员变量 name
。
1 | Error:(5, 10) java: cannot find symbol |
原因:父类 Animal
中没有方法 catchMouse()
和成员变量 name
。
4 参考
- JAVA的多态用几句话能直观的解释一下吗? - zhihu
- Creating object with reference to Interface - StackOverflow
- Diving Deeper into Polymorphism and its Benefits in Java - developer
以上
「Java」为什么“多态”