如下面两个类 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为什么要这样设定呢?我看了书,但是我还是没看出来原理。。
{ 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为什么要这样设定呢?我看了书,但是我还是没看出来原理。。
吃饭();
}//算日本人是人
class 日本人 extends 人{
吃饭();
拍片();
}另外有个函数:void doSomething(参数:一个人){
一个人.拍片();//这里就会编译出错,因为编译器只知道参数类型是人,而人的通用行为里只有吃饭,没有拍片
一个人.吃饭();//这里没有编译错,因为编译器知道人有吃饭的行为。具体的行为是日本人吃饭还是中国人吃饭,就看传的是什么人了,靠运行时函数的晚绑定实现。
}
属性是静态绑定 方法是动态绑定
多态的条件:
1.要有继承 //public class Son extends Father
2.要有方法的重写 //void test(){System.out.println("Son");
3.父类引用指向子类对象 //Father f=new Son();
所以第一个打印结果是1,而不是2第二个是调用son重写的方法。
父类引用指向了子类对象吗,f.i,它首先会到父类里去找,看有没有,然后在到子类里去