我原来看C++的书籍,始终没能理解什么是多态,多态有什么好处
有些书上把对象和实例混为一潭,更有甚者把对象和类都一起讲了。
后来学java,看了UML相关书,设计模式等,才真正想明白了多态C++实现多态靠虚函数,会生成虚函数表
依靠继承,虚拟类与java的接口很类似java 有继承和实现接口两种方法比如
interface A{void f();}
class B implements A{
    public void f(){
        System.out.println();
    }
}你可以定义
A a=new B();
依赖倒转原则中也推荐这样用
这里的a既是B的实例,也是A的实例
a.f()方法就要动态绑定到B的f()方法。

解决方案 »

  1.   

    这个就叫做动态绑定嘛!!
    抽象编程就是这个道理 针对interface 或者 abstract 来编程
    在java中所有超类的引用都可以直接引用子类的资源 无需其他申明
    就像水果类
    interface Fruit{
    public void f();
    }
    class Apple implements Fruit{
    public void f(){
    这里打印苹果(代码从略)}
    }
    class Orange implements Fruit{
    public void f(){
    这里打印"桔子"(代码从略)
    }
    }你可以通过这样做法
    Fruit apple =new Apple();
    Fruit orange =new Orange();现在你调用 
    apple.f();//打印就是"苹果"
    orange.f();//打印的就是"橙子"虽然 apple orange都是申明的 Fruit类型 但是执行的时候 jvm会根据 他具体的类型进行判定,这个就是所谓的面对对象的机制中 面对接口的编程 ,在java中abstract和interface的编程 都是面对接口的编程
      

  2.   

    上面大虾的Fruit apple =new Apple(); 机制说得很好﹐但关键是drawLine到底是在哪具体实现的呢?
      

  3.   

    抽象方法当然不可以直接调用(它的方法体是空的,执行有意义吗?)
    abstract类也不能直接被实例化为对象,抽象类必须被继承,被子类实现了其定义的抽象方法(所有的)后,才可以对把子类实例化为对象对于 public void paint(Graphics g)来说:
    Graphics g确实是类Graphics的一个实例(对象),只不过这个对象是浏览器(继承Graphics后)创建并传递给paint()的,所以这个g运行时已经是一个对象,g.drawLine()也已经有了方法体
      

  4.   

    其实呢,drawline方法是由抽象类的具体子类(实现类)实现的,在通过抽象类调用时会通过继承机制决定调用哪一个子类的drawline实现。建议楼主看一些设计模式或oo的书理解为什么我们需要抽象类
      

  5.   

    List list = new ArrayList();
      

  6.   

    可以调用抽象方法,如下事例。abstract class Base{  public abstract void f();  public void test(){
        f(); // f是抽象方法,但可以使用。因为外部调用test方法时,f方法已经实现了。
      }
    }