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