java_多态
一、什么是多态性?
父类的引用指向子类的对象
public class A
class B extends A
class C extends A
A a = new B();
Person p = new Studend();
二、虚拟方法的调用
有了对象多态性后,我们在编译期,只能调用父类中声明的方法,但是实际运行的是子类中重写的方法。
如果调用子类特有的方法,则编译不通过。
A a = new B();
因为在编译时a就会被认为是A的,如果调用B独有的方法,编译报错,但是在运行时执行的是B重写A的方法
class A{
public void method(){
System.out.println("这是父类方法");
}
}
class B extends A{
public void method(){
System.out.println("这是子类重写的父类方法");
}
}
public static void main(String[] args) {
OverTest overTest = new OverTest();
overTest.fun(new B());//这是子类重写的父类方法
public void fun(A a){
a.method();
}
}
三、多态使用的前提
①类的继承关系
②方法的重写
四、对象的多态性只适用于方法,不适用于属性。(在堆空间中会有两个属性)
class A { int id = 111; } class B extends A{ int id = 222 } main(){ A a = new B(); System.out.println(a.id);//111 }
五、多态是在编译时行为还是运行时行为
运行时。证明

根据传入的参数来判断到底new 谁
六、问题:有了对象的多态性后,内存中实际上是加载了子类特有的属性和方法,但是由于变量声明为父类类型,导致编译时只能调用父类的方法和属性,子类特有的属性和方法不能调用。
怎样才能调用子类特有的属性和方法?
向下转型,使用强制类型转换符-----
向上转型就是多态
注意:使用强转时,可能会出现类型转换异常。
Person 是 Man的父类
Person p = new Man();
此时如果需要调用Man独有的方法,需要向下转型
Man m = (Man) p ;
浙公网安备 33010602011771号