一、多态性:
超类(即基类或父类)引用在运行时既能代表超类本身的对象,
也能代表其子类(即派生类)的对象的能力。
类的一个成员若想表现多态必须可以被覆盖:
对于成员变量而言,不会发生覆盖现象(会隐藏),在子类出现相同变量的定义时只会隐藏父类变量,
因此不会表现多态。同时变量调用在编译时就会解析,不符合动态绑定的特征;
在成员方法中,静态方法和final方法,private方法 也不会发生覆盖现象(会隐藏),因此也不会表现多态性。
因此只有除静态方法和final,private 方法以外的方法才会表现多态性
二、向上类型转化时:
丢失添加的方法和字段,剩余的为:
基类字段
基类静态方法或final方法 //前二者为不能被覆盖的成员,因此保留,无多态性
基类其他方法(若被子类覆盖则为子类覆盖的新方法)
下边看一个例子:
/**
* 父类
* @author LIMING
*/
public class fa {
public int filed = 0;
public int getFiled() {
return filed;
}
public int getfaFiled() {
return 99;
}
}
/**
* 子类
* @author LIMING
*/
public class son extends fa {
public int filed = 1;
public int sonfiled = 22;
//覆盖父类方法
public int getFiled() {
return filed;
}
public int getsonFiled() {
return 88;
}
public static void main(String[] args) {
fa fa = new son();//上溯造型
System.out.println(fa.filed);//调用父类的字段 输出结果为父类的内容 不是子类的
System.out.println(fa.getFiled());//调用父类的方法 但是子类有覆盖 所以这里的输出是1 也就是动态 调用的是子类的方法
System.out.println(fa.getfaFiled());//这个是调用的父类的方法 子类没有覆盖
//上溯之后子类的方法会丢失 所以不能调用子类的方法
}
}
//共勉!