java之多态
Posted 西西嘛呦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java之多态相关的知识,希望对你有一定的参考价值。
多态性:是面向对象中最重要的概念,在java中有两种体现:
- 方法的重载和重写;
- 对象的多态性--可以直接应用到抽象类和接口上;
成员变量调用:
Java的引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明该变量使使用的类型决定,运行时类型由实际赋给该变量的对象决定。若编译时类型和运行时不一致,就会出现多态。
对象的多态性,在Java中,子类对象可以替代父类的对象引用:
- 一个变量只能有一种确定的数据类型;
- 一个引用类型变量可能指向(引用)多种不同类型的对象;
- Perosn p = new Person();
Person e = new Student();
子类可以看作是特殊的父类,所以父类类型的引用可以指向子类的对象:向上转型。
一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法:
Student m = new Student();
m.school = "pku‘;//合法,Student类有school成员变量
Person e = new Student();
e.school = "pku";//不合法,Perosn类没有school成员变量
属性是在编译时确定的,编译时e为Person属性,没有school成员变量,因此编译错误。
虚拟方法调用:
正常的方法调用:
- Person p = new Person();
- p.getInfo();
- Student s = new Student();
- s.getInfo();
虚拟方法调用,多态情况下:
- Perosn e = new Student();
- e.getInfo();//调用Student类的getInfo方法
编译时e为Person类型,而方法的调用是在运行时确定的,所以调用的是Student类的getInfo()方法--动态绑定。
总结:
前提:
- 需要存在继承或者实现关系;
- 需要有覆盖操作;
成员方法:
- 编译时:查看引用变量所属的类中是否有所调用的方法;
- 运行时:调用实际对象所属的类中重写的方法;
成员变量:
- 不具备多态性,只看引用变量所属的类。
以上是关于java之多态的主要内容,如果未能解决你的问题,请参考以下文章