多态是继封装、继承之后,面向对象的第三大特性。
现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态。
Java作为面向对象的语言,同样可以描述一个事物的多种形态。如Student类继承了Person类,一个Student的对象便既是Student,又是Person。
多态的定义与格式
- 前提条件
1、子父类的继承关系
2、方法的重写
3、父类引用指向子类对象
4、动态绑定:运行期间调用的方法,是根据其具体的类型
- 案例情况
A、普通类多态定义的格式
// 父类 变量名 = new 子类();classFu {} classZiextendsFu {} // 类的多态使用Fuf=newZi();
B、抽象类多态定义的格式
// 抽象类 变量名 = new 抽象类子类();abstractclassFu { publicabstractvoidmethod(); } classZiextendsFu { publicvoidmethod(){ System.out.println(“重写父类抽象方法”); } } // 类的多态使用Fufu=newZi();
C、接口多态定义的格式
// 接口 变量名 = new 接口实现类();interfaceFu { publicabstractvoidmethod(); } classZiimplementsFu { publicvoidmethod(){ System.out.println(“重写接口抽象方法”); } } // 接口的多态使用Fufu=newZi();
多态的向上 / 下转型
多态的转型分为向上转型与向下转型两种
A、向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。
使用格式
父类类型变量名=new子类类型(); 如:Personp=newStudent();
B、向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的
使用格式
子类类型变量名= (子类类型) 父类类型的变量; 如: Studentstu= (Student) p; // 变量 p 实际上指向 Student 对象
多态的成员特点(重点)
/*** @author Lux Sun* @date 2021/4/18*/publicclassPerson { publicStringname; publicstaticIntegerage; publicvoidplay() { System.out.println("ping-pong..."); } publicstaticvoideat() { System.out.println("apple..."); } } /*** @author Lux Sun* @date 2021/4/18*/publicclassStudentextendsPerson { publicStringname="Bob"; publicstaticIntegerage=12; publicvoidplay() { System.out.println("basketball..."); } publicstaticvoideat() { System.out.println("banana..."); } }
/*** @author Lux Sun* @date 2021/4/18*/publicclassTest { publicstaticvoidmain(String[] args) { Personstu=newStudent(); // 普通属性System.out.println(stu.name); // 普通方法stu.play(); // 静态方法stu.eat(); // 静态属性System.out.println(stu.age); } }
输出结果
nullbasketball... apple... null
总结
- 成员变量:编译/运行=>看左边
- 成员方法:编译看左边,运行看右边
- 静态变量:编译/运行=>看左边
- 静态方法:编译/运行=>看左边
Ps1:很好记,只有第 2 点比较特殊噢~,还有这里的“看”指的是是否编译/运行成功,“取决于”(看)的意思!
Ps2:在 IDEA 中,实例化对象是没有提示代码直接访问静态方法或静态属性的,只能自己手动补全噢~
多态的优缺点
- 优点:可以提高可维护性(多态前提所保证的),提高代码的可扩展性
- 缺点:无法直接访问子类特有的成员(上面例子足以表明)