其实也就是两种绑定状态:动态绑定(也称后期绑定),静态绑定(也称前期绑定).
1 实例方法: 实例方法与引用所实际引用的对象绑定.(动态绑定).
2 静态方法: 静态方法与引用所实际声明的类型绑定.(静态绑定).
3 成员变量(静态或非静态): 成员变量与引用所实际声明的类型绑定.(静态绑定).
- /**
- * 多态的演示
- * @author fhd001
- */
- public class DtTest {
- public static void main(String[] args) {
- ChildClass c1 = new ChildClass();
- c1.aaa();
- c1.bbb();
- System.out.println(c1.n);
- System.out.println(c1.str);
- parentClass p1 = new parentClass();
- p1.aaa();
- p1.bbb();
- System.out.println(p1.n);
- System.out.println(p1.str);
- parentClass p2 = new ChildClass();
- p2.aaa(); //aaa()是实例方法,它与实际引用的对象绑定
- p2.bbb(); //bbb()是静态方法,它与实际声明的类型绑定
- System.out.println(p2.n); //n是变量,它与声明的类型绑定
- System.out.println(p2.str); //str变量,它与声明的类型绑定.
- }
- }
- // 父类
- class parentClass {
- int n = 12;
- static String str = "abc";
- void aaa(){
- System.out.println("parentClass------>aaa");
- }
- static void bbb(){
- System.out.println("parentClass------>bbb");
- }
- }
- //子类
- class ChildClass extends parentClass{
- int n = 18;
- static String str = "efg";
- void aaa(){
- System.out.println("ChildClass-------->aaa");
- }
- static void bbb(){
- System.out.println("ChildClass-------->bbb");
- }
- }
例子2:
import java.util.*;
class Shape {
public void draw() {
}
public void erase() {
}
}
class Circle extends Shape {
public void draw() {
System.out.println("Circle.draw()");
}
public void erase() {
System.out.println("Circle.erase()");
}
}
class Square extends Shape {
public void draw() {
System.out.println("Square.draw()");
}
public void erase() {
System.out.println("Square.erase()");
}
}
class Triangle extends Shape {
public void draw() {
System.out.println("Triangle.draw()");
}
public void erase() {
System.out.println("Triangle.erase()");
}
}
class RandomShapeGenerator {
private Random rand = new Random(47);
public Shape next() {
switch (rand.nextInt(3)) {
default:
case 0:
return new Circle();
case 1:
return new Square();
case 2:
return new Triangle();
}
}
}
public class Shapes {
private static RandomShapeGenerator gen = new RandomShapeGenerator();
public static void main(String[] args) {
Shape[] s = new Shape[9];
for (int i = 0; i < s.length; i++)
s[i] = gen.next();
for (Shape shp : s)
shp.draw();
}
}
运行结果为:
Triangle.draw()
Triangle.draw()
Square.draw()
Triangle.draw()
Square.draw()
Triangle.draw()
Square.draw()
Triangle.draw()
Circle.draw()