1.静态绑定
使用父类类型储存子类对象,返回父类属性。使用子类类型储存子类对象,返回子类属性。这样属于静态绑定
先定义两个类:
class Father{
int age=48;
}
class Son extends Father{
id=13;
}
使用父类类型储存一个子类对象son1:
Father son1=new Son();
System.out.print(son1.age);
此时输出的年龄为48,使用了父类的属性。
使用子类类型储存一个子类对象son1:
Son son2=new Son();
System.out.print(son2.age);
此时输出的结果为24,显然使用了子类的属性。
综上属性是属于静态绑定的,即属于什么类型就使用谁的属性。
那么使用父类储存子类对象,访问子类独有属性id,按照静态绑定的定义来说,应该使用父类的该属性,由于父类无此属性,所以应当报错才对。
显然访问了子类的id属性,编译不通过,问题为id不属于此中的属性。所以无法找到。
2.动态绑定
父类和子类都有同样的方法 , 子类类型 存储 子类对象 , 调用的方法是 子类 的方法。 父类和子类都有同样的方法 , 父类类型 存储 子类对象 , 调用的方法是 子类 的方法。这样属于动态绑定。
class Father{
int age=48;
void say(){
System.out.println("这是父类")
}
}
class Son extends Father{
id=13;
void say(){
System.out.println("这是子类")
}
}
父类与子类中都定义了同样的方法say(),创建的对象为son1,son2如上所示:
这两个对象分别调用两个方法:
son1.say();
son2.say();
执行的结果为:
全都是执行了子类的方法,属于动态绑定,即根据对象而不是根据对象所属类型来调用方法。
那么调用静态方法呢?
将say()属性设置为static,执行结果为:
这个结果符合静态绑定的定义,所以当方法为静态方法时,采用的时静态绑定。