今日所学:在继承方面的隐藏、覆盖和动态绑定
1>隐藏: 对于成员变量和静态方法 如果子类和父类一样 子类隐藏父类的
2>覆盖: 对于实例函数 如果子类和父类一样 子类覆盖父类的
3>上转型对象调用子类覆盖父类的实例方法时 调用的是子类的方法 动态绑定
如下代码截图和源代码有对上述的实际操作和详细注释
package updownshift;
//隐藏 覆盖和动态绑定
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Suberclass sub=new Suberclass();
Superclass sup=sub;//由于子类对象 is a 父类对象 所以,可以将父类的引用指向子类实例 即:子类对象赋值给父类 称为 上转型
//子类对象是父类对象 父类对象不是子类对象 例如:学生是人 人不一定是学生
Superclass sup1=new Superclass();
// Suberclass sub1=sup1; 说明:父类对象不是子类对象 错误信息:- Type mismatch: cannot convert from Superclass to
//System.out.println((sub instanceof Superclass));
// System.out.println((sup instanceof Superclass)); //instanceof : 判断前面实例是否为后面的对象
// System.out.println((sup1 instanceof Suberclass));
System.out.println(sub.str);
System.out.println(sup.str);//上转型 对于成员变量 子类隐藏父类的 上转型对象引用的是父类的
sub.staticsubfunction(); //子类对象调用自己的静态函数
sup.staticsupfunction(); //上转型对象调用父类的静态方法
sub.staticsupfunction(); //子类调用了继承自父类的静态方法
sub.function();//子类实例调用它的实例方法
sup.function();//上转型对象 调用实例方法 当子类覆盖父类的同名方法时 上转型对象调用的仍然是子类的实例方法 称为动态绑定
sub.staticfunction();//子类调用静态方法
sup.staticfunction();//上转型对象调用静态方法 当子类覆盖父类静态方法时,上转型对象调用的是父类的静态方法 称为静态绑定
}
}
class Superclass{
int supint;
String str="父类的实例字符串变量";
public Superclass(){
System.out.println("执行父类无参构造函数");
}
void function(){
System.out.println("调用父类的实例函数");
}
public static void staticfunction(){
System.out.println("调用父类的静态方法——--staticfunction()");
}
public static void staticsupfunction(){
System.out.println("调用父类的静态函数");
}
}
class Suberclass extends Superclass{ //继承是一种“is a”的关系。即:子类对象也是一个父类对象
int subint;
String str="子类的实例字符串变量"; //子类实例变量和父类实例变量 名称和类型完全一样 子类的隐藏父类的变量
public Suberclass(){
System.out.println("执行子类无参构造函数");
}
void function(){//子类覆盖父类的实例方法
System.out.println("调用子类的实例函数");
}
public static void staticfunction(){//子类覆盖了父类的静态方法
System.out.println("调用子类的静态方法——--staticfunction()");
}
public static void staticsubfunction(){
System.out.println("调用子类的静态函数");
}
}