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 ;

posted @ 2021-03-18 11:13  冷森、  阅读(25)  评论(0)    收藏  举报