动态联编与静态联编
联编类型
JAVA中联编有两种,一种是动态联编,一种是静态联编。
- 动态联编:也叫多态联编、迟后联编、晚联编,因为到底要调用哪一个函数,在编译时不能确定,而要推迟到运行中确定。也就是说,要等到程序运行时,确定了指针所指向对象的类型时,才能够确定。
- 静态联编:静态联编是指联编工作出现在编译连接阶段,这种联编又称作早期联编,因为这种联编工作是程序开始运行之前完成的。
- 静态联编条件:静态类方法,静态类变量。
//基类
public class Test {
//static variable
public static int i=4;
//无参构造
public Test() {
System.out.println("Test initialzed");
}
//动态联编
public void smile() {
System.out.println("Test smile and i = "+i);
}
//静态联编 -> static
public static void smile_static() {
System.out.println("Test smile_static and i = "+i);
}
}
//子类
public class Chi_Test extends Test {
public static int i = 5;
//构造函数
public Chi_Test() {
System.out.println("Chi_Test initialized ");
}
//动态联编
public void smile() {
System.out.println("Chi_Test smile and i = " + i);
}
//静态联编
public static void smile_static() {
System.out.println("Chi_Test smile_static and i = " + i);
}
}
public class Demo {
public static void main(String[] args) {
Test test = new Chi_Test(); //测试初始化构造函数顺序
test.smile(); //动态联编
test.smile_static(); //静态联编
}
}
由整个程序最终的运行结果可以看出:
- 在构造一个子类对象时,先调用其父类的构造函数,再执行本类构造函数。
- 对于一般的方法即使把子对象强制转换成父类对象,程序运行时执行子类中的方法。
- 对于静态方法,因为在编译时就决定了它的执行顺序,所以程序运行时执行强制转换后对象的静态方法。
动态联编与静态联编的本质区别在于对static关键字的运用与变换,这将使得整个程序拥有更强的灵活性。
评论区