如下面两个类 class Father 
{ int i=1; } public class Son extends Father 

int i=2; 
void test(){System.out.println(“TEST!”);
}
public static void main(String[] args) 

Father f=new Son(); 
System.out.println(f.i); } 打印出来的结果是:1。这是由引用决定的。有的书上说java对于属性是静态绑定,对于方法是静态绑定,所以调用方法是看对象而不是看类的引用。但是,如果我现在调用f.test().编译器就会显示找不到该方法。但是如果Father有一个set方法。然后Son重写了这个方法。 
Father f=new Son(); f.set(参数); 
这样调用的就是Son的set方法了。。 
请问Java为什么要这样设定呢?我看了书,但是我还是没看出来原理。。 

解决方案 »

  1.   

    举个例子:两个类class 人{
      吃饭();
    }//算日本人是人
    class 日本人 extends 人{
      吃饭();
      拍片();
    }另外有个函数:void doSomething(参数:一个人){
       一个人.拍片();//这里就会编译出错,因为编译器只知道参数类型是人,而人的通用行为里只有吃饭,没有拍片
       一个人.吃饭();//这里没有编译错,因为编译器知道人有吃饭的行为。具体的行为是日本人吃饭还是中国人吃饭,就看传的是什么人了,靠运行时函数的晚绑定实现。
    }
      

  2.   

    在子类中重写父类的方法是java 多态性的一种表现。
      

  3.   


    属性是静态绑定 方法是动态绑定
    多态的条件:
    1.要有继承      //public class Son extends Father
    2.要有方法的重写  //void test(){System.out.println("Son"); 
    3.父类引用指向子类对象  //Father f=new Son(); 
    所以第一个打印结果是1,而不是2第二个是调用son重写的方法。
      

  4.   

    P.S.Java为什么对属性要采取静态的绑定方法?静态绑定是有很多的好处,它可以让我们在编译期就发现程序中的错误,而不是在运行期,这样就可以提高程序的运行效率;对方法采取动态绑定是为了实现多态,多态是Java的一大特色。多态也是面向对象的关键技术之一,所以Java是以效率为代价来实现多态,这也是很值得的。
      

  5.   

    给你推荐本书吧,java编程思想,很不错的一本书,上面对动态邦定介绍的很详细。
      

  6.   

      Java运用多态,最大的优点有利于可扩展性达到了极致,多态表现做多的应该是运用在方法上,实际你new哪个对象,就调用哪个对象的方法,你的题目是继承了父类,
    父类引用指向了子类对象吗,f.i,它首先会到父类里去找,看有没有,然后在到子类里去
      

  7.   

    父类引用指向子类对象,OOP中的动态绑定问题