运行时多态和编译时多态

多态:多态的概念比较简单,就是同一操作作用于不同的对象,可以有不同的解释,产生不同

的执行结果。

运行时多态:重写就是一种运行时多态。只有在运行过程中才能清楚调用的是具体的那个方法。

重写的情况:

public class Dog {

        public void bark(){

            System.out.println("woof ");

        }

  private static  class Hound extends Dog{

        public void sniff(){

            System.out.println("sniff ");

        }

        public void bark(){

            System.out.println("bowl"); }

    }

    public static void main(String [] args){

            Dog dog = new Hound();

            dog.bark();

            Dog dog1=new Dog();

            dog1.bark();

        }

    }

输出结果是:

bowl

woof

父类引用指向子类对象情况:

public class Parent{

public void call(){

sout("im Parent");

}

}

public class Son extends Parent{// 1.有类继承或者接口实现

public void call(){// 2.子类要重写父类的方法

sout("im Son");

}

}

public class Daughter extends Parent{// 1.有类继承或者接口实现

public void call(){// 2.子类要重写父类的方法

sout("im Daughter");

}

}

public class Test{

public static void main(String[] args){

Parent p = new Son(); //3.父类的引用指向子类的对象

Parent p1 = new Daughter(); //3.父类的引用指向子类的对象

p.call();

p1.call();

}

}

输出结果是:

im son

im Daughter

同样是 Parent 类的实例,p.call 调用的是 Son 类的实现、p1.call 调用的是 Daughter 的实现。这里因为是自己定义的,所以可以在new对像的过程中就能明白p是son,p1是daughter。但是有的时候,我们无法直观看到new对象的过程。比如说工厂模式、Spring的ioc。所以只有在程序运行的过程才能够清楚具体调用的是谁的方法。

编译时多态:Java中重载就是一种编译时多态。程序处在编译期间,通过参数的不同来决定具体调用的是那个方法。

思考:重载一定是发生在同一个类中吗?子类是否可重载父类的方法?

你可能感兴趣的:(运行时多态和编译时多态)