抽象类的对象作上转型对象可以“操作”子类新增的对象:
abstract class A{
abstract void getM();
}
class B extends A{
int n = 10;
void getM(){
System.out.println(n);
}
}
class E{
public static void main(String args[]){
A a = new B();
a.getM();
// System.out.println(a.n);(报错:找不到符号)
}
}
而抽象类的对象作上转型对象可以通过重写的方法操作新增的变量,那么普通的上转型对象可不可以?
对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原对象的一些属性和功能(上转型对象相当于子类对象的一个简化对象)。上转型对象具有如下特点:
- 上转型对象不能操作子类新增的成员变量(失掉了这部分属性),不能调用子类新增的方法(失掉了一部分行为)。
- 上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类重写的方法。
- 上转型对象操作子类继承的方法或子类重写的实例方法,其作用等价于子类对象去调用这些方法,因此如果子类重写了父类的某个实例方法后,当对象的上转型对象调用这个实例方法时一定是调用了子类重写的实例方法。
但通过以下例子,我们发现上转型对象实际上可以“操作”子类新增的成员变量:
class A{
void getM(){
}
}
class B extends A{
int n = 10;
void getM(){
n = 20;
System.out.println(n);
}
}
class E{
public static void main(String args[]){
A a = new B();
a.getM();
// System.out.println(a.n);(报错:找不到符号)
// a.n = 20;(报错:找不到符号)
}
}
输出结果:20
实验表明:对象的上转型对象实际上可以通过重写方法来“操作”成员新增的变量,而不能直接操作子类新增的变量。