概念:
1.是建立在继承机制之上,继承机制允许对象看成所属类,也可以看作是超类;
2.当子类重写父类方法,由同一个对象调用产生不同的行为,这种现象就叫多态
3.无继承就无多态
父Hero hero=new Hero();//将某个对象看成其所属类
子HanBing hb=new HanBing();//将某个对象看成其所属类
子ManWang mw=new ManWang();//将某个对象看成其所属类
hero=hb;//把对象看成超类
hero=mw;//把对象看成超类
2.三要素:
1.继承
2.重写
3.将子类的实例赋给父类类型(父类引用指向子类实例)
3.语法:
父类 引用=new 子类();
Father f=new Son1();
Father f=new Son2();
4.方法调用
父有子有,调子类
父有子无,调父类
父无子有,将其转换成其本类对象就可以调用,否则就编译错误
((YaSe)hero).fun();
//hero.fun();编译错误
用父类对象调用静态方法和属性,如果子类有,父类有,都是调父类的
Hero hero=new HanBing();
HanBing hb=(HanBing)hero;//因为父类指向的是寒冰对象,然后将父类对象转换寒冰,是类型匹配的,所以不会出错
//为了保证转换进不出现类转换异常,java提供了一个关键字instanceof,用于判断对象是否是某种类型的实例
//ManWang mw=(ManWang)hero;//将父类对象强制转换成子类,编译期不会出异常,但是运行时会出现ClassCastException 类转换异常
//可以将一个父类强制转换成子类对象,如果父类所指向的对象是要转的成的对象类型,那么就不会报错,如果转换成的类型原对象类型不一致,出现类转换异常
hero=new YaSe();
if(hero instanceof HanBing){
System.out.println("这个对象是寒冰");
}else if(hero instanceof ManWang){
System.out.println("这个对象是蛮王");
}
System.out.println(hero.value);
System.out.println(((YaSe)hero).value);
5.调用次序:
方法先调子类,属性先调父类
6.为什么要使用多态?
1.提高代码的阅读性和减少代码的冗余。
2.提高代码的灵活性和降低代码的维护成本。
7.如何实现多态?
案例:学生要回家,可以选择火车,地铁,汽车,飞机的方式回家,通过面向对象的思想来实现此功能。
1.通过属性来实现多态:
public class Jtgj {//父类
public void run() {
System.out.println("..........");
}
}
public class Hc extends Jtgj {//子类1
@Override
public void run() {
System.out.println("正在从火车,火车以200KM/h的速度飞速行驶....");
}
}
public class Qc extends Jtgj {//子类2
@Override
public void run() {
System.out.println("正在坐汽车,以100KM/H的速度快速行驶.....");
}
}
public class Student {
private String name;
public Jtgj jtgj=null;//多态实现,将父类作为属性的数据类型
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void goHome() {
System.out.println("张三要回家了...");
jtgj.run();//实现多态效果
}
}
public class Test {
public static void main(String[] args) {
Student stu=new Student();
stu.setName("张三");
//stu.jtgj=new Hc();//创建不一样的子类对象,则实现不一样的效果。
stu.jtgj=new Qc();
stu.goHome();
}
}
2.通过方法传参实现多态
public class Student2 {
public String name;
//将父类作为参数传入
public void goHome(Jtgj jtgj) {
System.out.println("张三要回家了...");
jtgj.run();
}
}
public static void main(String[] args) {
Student2 stu=new Student2();
stu.name="张三";
stu.goHome(new Qc());//创建子类对象
}
8.instanceof关键字
作用:判断对象是否为指定类型的对象,如果是则为true,否则为false
案例:
public static void main(String[] args) {
Person person = new Teacher();
person.name = "张三";
person.age = 20;
person.sayHi();
if (person instanceof Student) {// 判断此对象是否为学生对象
Student stu = (Student) person;//将父类强制转换成子类。
stu.play();
}
}
注意事项:
如果无instanceof判断,当类型不匹配时,Student stu = (Student) person;在运行的时候会出现类转换异常。
Exception in thread "main" java.lang.ClassCastException: cn.znsd.oop3.Teacher cannot be cast to cn.znsd.oop3.Student
at cn.znsd.oop3.Test.main(Test.java:12)