多态--动态绑定

动态绑定机制(简答题)

1、当调用对象方法的时候,该方法会和该对象的运行类型绑定,如果在运行类型中没找到该方法,那么触发继承机制,去运行类型的父类去找方法。

2、当调用对象属性时,没有动态绑定机制,属性在哪里声明,就在哪里使用,不是看编译类型

1、
class A{
    public int 1 = 10;
    public int sum(){
        return getI() + 10;
    }
    
    public int sum1(){
        return i + 10;
    }
    
    public int getI(){
        return i;
    }
}
​
==================================
    
class B extends A{
    public int i = 20;
    public int sum(){
        return i + 20;
    }
    public int getI(){
        return i;
    }
    public int sum1(){
        return i + 10;
    }
}
​
==================================
  
public class Test{
    psvm{
        A a = new B();//向上转型
        sout(a.sum());//运行类型是B,所以这里走b的方法sum(),输出40
        sout(a.sum1());//运行类型是B,所以这里走b的方法sum1(),输出30
    }
}
    
2、※

注意:编译类型为父类,运行类型为子类 的对象,不能直接去运行子类的方法

class A{
    public int 1 = 10;
    public int sum(){
        return getI() + 10;
    }
    
    public int sum1(){
        return i + 10;
    }
    
    public int getI(){
        return i;
    }
}
​
==================================
    
class B extends A{
    public int i = 20;
   /*
    public int sum(){
        return i + 20;
    }
    */
    
    public int getI(){
        return i;
    }
    
   /*
   public int sum1(){
        return i + 10;
    }
    */
}
​
==================================
  
public class Test{
    psvm{
        A a = new B();//向上转型
        sout(a.sum());//30
        //运行类型B中的sum方法消失了。触发继承机制,找父类A中的sum()方法,A中sum方法getI()方法触发了动态绑定机制,去找运行类型B的getI()方法,B中getI()方法的i在B中声明,那么i的值就是20。总结下来,这里用A中的sum()=20++10方法,B的getI()=20,B的i=20,输出30
        sout(a.sum1());//20
        //运行类型B中sum1()方法消失了。触发机制,找父类A中的sum1()方法,A中sum1()方法中的i在父类A中被声明,那么这里的i=10。总结下来,这里用A中的sum()1=10+10,A的i=10,输出20
    }
}

 

posted on 2021-12-09 22:08  老菜农  阅读(33)  评论(0编辑  收藏  举报

导航