面向对象中的多态

在说多态之前,我们先看一段代码:
package JavaInterview;
class A {
        int i;
    public A() {
        i = 3;
        System.out.println(i);
    }
        void display() {
            System.out.println(i);
    }
}    
class B extends A {
    int j;
    public B() {
        j = 4;
        System.out.println(j);
    }
    void display() {
        System.out.println(j);
    }
    
}    
public class InheritanceDemo {
    public static void main(String[] args)
    {
        A obj = new B();
        obj.i=1;
        obj.j=2; // can't reach it
        obj.display();     
    }
}

分析这段程序的输出是什么。如果在eclipse中运行这段代码,是编译不过的,问题在于obj为A类型的,它不可以访问它的子类中的成员变量j,也就是obj.j = 2这一句是错误的。如果把这句删除之后输出结果是什么呢。答案为:3, 4, 4。如果和你想的一样那么你可以越过这篇文章了。如果不一样就看一下。首先当我们new B()的时候,程序首先调用的是父类的构造函数,然后在调用子类的构造函数。输出3,4。最后一个4是因为子类中重写了父类中的display()方法,obj虽然是A类型的,但是运行的时候,它调用的是子类中的方法。这其实就是多态的体现,满足三个条件,1. 继承,2. 重写, 3. 父类的引用变量指向子类的对象。

猜你喜欢

转载自kickcode.iteye.com/blog/2275086