1.什么是多态?
多态是在继承/实现情况下的一种现象,表现为:对象多态,行为多态。
2.多态的前提
有继承/实现的关系;存在父类引用子类对象;存在方法重写。
3.多态的注意事项
多态是对象、行为的多态,java中的属性(成员变量)不谈多态。
package com.web201.poly;
public class People {
String name = "父类";
public void run() {
System.out.println("I can run.");
}
}
package com.web201.poly;
public class Student extends People {
String name = "学生类";
@Override
public void run() {
System.out.println("学生跑得快···");
}
}
package com.web201.poly;
public class Teacher extends People {
String name = "老师类";
@Override
public void run() {
System.out.println("老师跑得慢");
}
}
package com.web201.poly;
public class Main {
public static void main(String[] args) {
People p1 = new Student();
p1.run();
System.out.println(p1.name);
People p2 = new Teacher();
p2.run();
System.out.println(p2.name);
}
}
4.使用多态
在多态的形式下,右边对象是解耦合的,更加便于扩展和维护。
定义方法时,使用父类类型的形参,可以接收一切子类对象,扩展性更强,更便利。
5.使用多态存在的问题
多态下不能使用子类独有的功能。
要解决这种办法就只能使用类型转换。
类型转化 :
自动类型转换:父类 变量名 = new 子类();
强制类型转换:子类 变量名 = (子类) 父类名称;
强制类型转换的注意事项:
存在继承/实行关系就可以在编译阶段进行强制类型转换,编译阶段不会报错。
运行时,如果发现对象的真实类型与强制转换后的类型不同,就会报类型转换异常(ClassCastException)的错误出来。
所以在强制转换前,应该使用instanceof关键字,判断当前对象的真实类型,再进行强制转换。
package com.web201.poly;
public class Student extends People {
String name = "学生类";
@Override
public void run() {
System.out.println("学生跑得快···");
}
public void study() {
System.out.println("学生正在学习···");
}
}
package com.web201.poly;
public class Teacher extends People {
String name = "老师类";
@Override
public void run() {
System.out.println("老师跑得慢");
}
public void teach() {
System.out.println("老师正在讲课");
}
}
package com.web201.poly;
public class People {
String name = "父类";
public void run() {
System.out.println("I can run.");
}
}
package com.web201.poly;
public class Main {
public static void main(String[] args) {
People p1 = new Student();
p1.run();
System.out.println(p1.name);
People p2 = new Teacher();
p2.run();
System.out.println(p2.name);
Student s = new Student();
use(s);
}
public static void use(People people) {
System.out.println("--------开始------------");
people.run();
if(people instanceof Student){
Student s = (Student) people;
s.study();
}else if(people instanceof Teacher){
Teacher t = (Teacher) people;
t.teach();
}
System.out.println("--------结束------------");
}
}