关于绑定见 http://blog.csdn.net/nyzhl/archive/2007/05/27/1627601.aspx
我们知道,Java中默认是晚绑定(late binding) ,这个叫法比较混乱,有人叫静态绑定(static binding),还有人叫运行时绑定(runtime binding),他们说的都是一回事。
但凡事都有例外。final关键字声明的就是早绑定。因为final方法不允许重写(override),他想晚绑定也没方法可以晚绑定。
还有一个关键字是private,私有成员,他的子类看不到,当然没法晚绑定了。
另外static方法是不是也是晚绑定呢?严格来说,static方法是属于类的,应该是早绑定。但是它也可以写成对象调用的样子。
如Thread.currenThread(); //获得当前线程
也可以这么写:
Thread t = new Thread();
t.currenThread();
这样写严格来讲在逻辑上是错误的。但是Java编译器并不报错,t.currenThread(); 相当于Thread.currenThread();
那么如果用对象来调用静态方法,会不会晚绑定呢?写个程序试一下就好了
class
A
...
{
static void display() ...{
System.out.println("Method of Class A !");
}
}
class B extends A ... {
static void display() ...{
System.out.println("Method of Class B !");
}
}
class C extends A ... {
static void display() ...{
System.out.println("Method of Class C !");
}
}
public class StaticBinding ... {
public static void main(String[] args) ...{
A b = new B();
A c = new C();
b.display();
c.display();
}
}
static void display() ...{
System.out.println("Method of Class A !");
}
}
class B extends A ... {
static void display() ...{
System.out.println("Method of Class B !");
}
}
class C extends A ... {
static void display() ...{
System.out.println("Method of Class C !");
}
}
public class StaticBinding ... {
public static void main(String[] args) ...{
A b = new B();
A c = new C();
b.display();
c.display();
}
}
运行结果:
Method of Class A !
Method of Class A !
由此得到验证,static方法是早绑定。