📅  最后修改于: 2020-03-22 13:30:49             🧑  作者: Mango
静态绑定: 可以在编译时由编译器解析的绑定称为静态绑定或早期绑定。所有静态,私有和最终方法的绑定都在编译时完成。
为什么绑定静态,最终和私有方法始终是静态绑定?
静态绑定是更好的性能选择(不需要额外的开销)。编译器知道所有此类方法都不能被覆盖,并且始终由本地类的对象访问。因此,编译器确定类的对象(肯定是本地类)没有任何困难。这就是此类方法的绑定是静态的原因。
让我们看一个例子
public class NewClass {
public static class superclass {
static void print()
{
System.out.println("父类.");
}
}
public static class subclass extends superclass {
static void print()
{
System.out.println("子类.");
}
}
public static void main(String[] args)
{
superclass A = new superclass();
superclass B = new subclass();
A.print();
B.print();
}
}
在向下滚动之前,猜猜上面程序的输出吗?
输出:
父类.
父类.
如您所见,在两种情况下都将调用超类的打印方法。让我们看看这是怎么发生的
作为练习,读者可以将对象B的引用更改为子类,然后检查输出。
动态绑定: 在动态绑定中,编译器不会确定要调用的方法。重写是动态绑定的完美示例。在重写中,父类和子类都具有相同的方法。让我们看一个例子
public class NewClass {
public static class superclass {
void print()
{
System.out.println("父类.");
}
}
public static class subclass extends superclass {
@Override
void print()
{
System.out.println("子类.");
}
}
public static void main(String[] args)
{
superclass A = new superclass();
superclass B = new subclass();
A.print();
B.print();
}
}
输出:
父类.
子类.
这里的输出不同。但为什么?让我们分解代码并彻底理解它。
重要事项