首先楼主作为小白一个,某日在学习中遇到了这样一段程序。
package com.bishi2;
class Base
{
int num = 1;
public Base(){
this.print();
num=2;
}
public void print(){
System.out.println("Base.num="+num);
}
}
class Sub extends Base{
int num= 3;
public Sub(){
this.print();
num=4;
}
public void print(){
System.out.println("Sub.num="+num);
}
}
public class Test1 {
public static void main(String[] args)
{
Base b = new Sub();
System.out.println(b.num);
}
}
程序的运行结果如下:
Sub.num=0
Sub.num=3
2
由此引发了一些关于Java中多态问题相关的思考,在此处做以总结。
1.首先的一个与多态无关的问题就是,Jav针对一些未赋值的变量会自动赋一些初值,具体见
2.
Base b = new Sub();
该条语句在执行时,在调用调用子类的构造方法之前,会首先调用父类的构造方法。因而程序
首先转跳至父类的构造方法,
public Base(){
this.print();
在该构造方法执行的时候首先调用了print();方法,根据多态此处的调用,应该调用的是子类的
print()方法,因而执行子类方法:
public void print(){
System.out.println("Sub.num="+num);
}
由于此时num未曾赋值(Sub中的int num=3还未执行),因而被系统赋予默认初始值0;
因而首先运行出第一行结果。
接着父类的构造方法中会将num初始化为2.然后调用子类的构造方法,在子类构造方法执行之前,
非静态的变量会先执行初始化动作,所以此时子类sub的num值为3.而属性没有多态的概念,会输出
父类的属性值因而b.num=2.
ps:Java程序初始化可以在不同的代码块中执行,它们的执行顺序如下:父类静态变量,父类静态
代码块,子类静态变量,子类静态代码块,父类非静态变量,父类非静态代码块,父类构造方法,
子类非静态变量,子类非静态代码块和子类构造函数。