多态:
父类的引用指向子类的对象(向下转型)
场景:
有一个A子类 extends(继承)了父B类 (A类是子类 B类是父类)
声明时: B b1 = new A(); 父类的引用b1 指向了 子类的对象 new A();
此时,如果调用一个A子类中重写了B父类的方法 b1.方法名();
实际执行的时A子类重写父类的方法(虚拟方法调用)
此时,如果调用一个B父类中没有写过的方法(A子类特有的方法) 是不可以编译成功的!
public class Person {
public void speek() {
System.out.println("说话");
}
public void run() {
System.out.println("跑步");
}
}
public class Student extends Person {
public void speek() {
System.out.println("学生上课说话");
}
public void study() {
System.out.println("学习");
}
}
public class Demo {
public static void main ( String[] args ) {
Person p = new Student();//多态的使用
p.study();//编译报错
p.speek();//调用的是studenty类中的方法
p.run();//调用的是父类的
}
}
动态绑定:
这种编译期看父类,运行时才知道编译器需要调用的是父类还是子类的方法称为动态绑定
属性有多态吗?
因为子类不会覆盖父类的属性,所以属性不存在多态性这一说法
虚拟方法:
子类中定义了父类同名同参的方法(重写的方法)
再多态情况下,将此时父类的方法(被重写的方法)称为虚拟方法
那么如何调用子类特有的方法?
将父类向下转型为子类(类似强转)可能会出现ClassCastException异常(类型转换异常)
Person p = new Student();
Student t = (Student) p;
为了避免ClassCastExcption异常
instanceof关键字:
作用:为了向下转型(强转)的时候不出现ClassCastException异常 所以进行一个判断
if( p instanceof Student ){//p所属的类 和 Student类必须是子父类的关系,否则会编译错误
Student t = (Student) p;
//调用B子类中特有的方法
t.study();
}
向下转型能成功一定是new了一个子类对象(它会加载直接、间接父类中所有的属性和方法)
本文详细介绍了Java中的多态概念,包括父类引用指向子类对象的向下转型,以及动态绑定的原理。通过示例代码展示了如何调用子类重写父类的方法,并解释了属性在多态中不具备多态性的原因。同时,讨论了如何通过实例of关键字安全地向下转型来调用子类特有的方法,避免ClassCastException异常。最后,探讨了虚拟方法的概念及其在多态中的作用。
844

被折叠的 条评论
为什么被折叠?



