package com.superqwy.polymorphismdemo1;
public class People {
public String name = "父类中people的名字";
public void run(){
System.out.println("people an run");
}
}
package com.superqwy.polymorphismdemo1;
public class Teacher extends People{
public String name = "子类中Teacher的名字";
@Override
public void run(){
System.out.println("teacher run slower");
}
//独有功能
public void teach(){
System.out.println("老师需要教书");
}
}
package com.superqwy.polymorphismdemo1;
public class Student extends People{
public String name = "子类中Student的名字";
@Override
public void run(){
System.out.println("student run faster");
}
//独有功能
public void test(){
System.out.println("学生需要考试");
}
}
package com.superqwy.polymorphismdemo1;
import java.time.Period;
public class Test1 {
public static void main(String[] args) {
//认识多态,对象多态,行为多态
//1 对象多态 识别技巧:编译看左边,运行看右边
//多态好处1:可以实现解耦合,右边对象可以随时切换,后续业务随时改变
People p1 = new Student();
p1.run();
People p2 = new Teacher();
p2.run();
System.out.println(p1.name);
System.out.println(p2.name);
/* result:
student run faster
teacher run slower
父类中people的名字
父类中people的名字
*/
//多态好处2:可以使用父类的变量作为形参,可以接受一切子类对象
Student s1 = new Student();
go(s1);
Teacher t1 = new Teacher();
go(t1);
//多态弊端:无法直接调用子类独有功能,但是可以使用强制类型转化解决
//p1.test();
//Cannot resolve method 'test' in 'People'
//强制转换
Student s = (Student) p1;
s.test();
//强制类型转换可能存在的问题:编译阶段有继续或者实现 关系就可以强制转换,但是运行时可能出现类型强制转换异常
//Teacher t = (Teacher) p1;
if(p1 instanceof Student){
Student s2 = (Student) p1;
}else {
Teacher t2 = (Teacher) p1;
t2.teach();
}
//Student cannot be cast to class com.superqwy.polymorphismdemo1.Teacher
}
public static void go(People p){
//当在方法中接收子类对象时,并且要调用子类独有方法时,建议先进行类型检验
if(p instanceof Student){
Student s2 = (Student) p;
}else {
Teacher t2 = (Teacher) p;
t2.teach();
}
System.out.println("可以接受子类形参对象");
}
}