1. 动态绑定
将一个方法调用同一个方法主体关联起来被称作绑定。
在运行时根据对象的类型进行绑定,叫做后期绑定或运行时绑定。Java中除了static方法和final
例如,下面定义了一个Shape类型的变量,这是个Shape引用,由于后期绑定,赋予其子类Circle的一个对象引用,最终调用的是Circle.draw()方法。
package com.khlin.binding.test; public class App {
public static void main(String[] args) {
Shape shape = new Circle();
shape.draw();
}
} class Shape {
public void draw() {
System.out.println("i m a shape...");
}
} class Circle extends Shape {
public void draw() {
System.out.println("i m a circle...");
}
}
输出:i m a circle...
2.没有动态绑定的缺陷
任何域都将由编译器解析,因此不是多态的。
静态方法也不是多态的。
来看下面的例子:
package com.khlin.binding.test; public class App {
public static void main(String[] args) {
// Shape shape = new Circle();
// shape.draw(); Shape shape = new Triangel();
/** 直接访问域,得到的是0,说明域无法动态绑定 */
System.out.println("shape field[degreeOfAngels]:"
+ shape.degreeOfAngels);
/** 调用方法,得到180,说明是动态绑定 */
System.out.println("shape [getDegreeOfAngels() method]:"
+ shape.getDegreeOfAngels());
/** 静态方法无法动态绑定 */
shape.print();
/** 静态域同样无法动态绑定 */
System.out.println("shape field[lines]:" + shape.lines);
}
} class Shape {
/** 内角之和 */
public int degreeOfAngels = 0; /** 共有几条边 */
public static final int lines = 1; public int getDegreeOfAngels() {
return degreeOfAngels;
} public void draw() {
System.out.println("i m a shape...");
} public static void print() {
System.out.println("printing shapes...");
}
} class Triangel extends Shape {
/** 内角之和 */
public int degreeOfAngels = 180; /** 共有几条边 */
public static final int lines = 3; public int getDegreeOfAngels() {
return degreeOfAngels;
} public void draw() {
System.out.println("i m a triangel...");
} public static void print() {
System.out.println("printing triangel...");
}
}
输出结果是:
shape field[degreeOfAngels]:0
shape [getDegreeOfAngels() method]:180
printing shapes...
shape field[lines]:1