关于上转型对象能不能操作新增的变量的讨论

抽象类的对象作上转型对象可以“操作”子类新增的对象:

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);(报错:找不到符号)
	}
}

而抽象类的对象作上转型对象可以通过重写的方法操作新增的变量,那么普通的上转型对象可不可以?

对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原对象的一些属性和功能(上转型对象相当于子类对象的一个简化对象)。上转型对象具有如下特点:

  1. 上转型对象不能操作子类新增的成员变量(失掉了这部分属性),不能调用子类新增的方法(失掉了一部分行为)。
  2. 上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类重写的方法。
  3. 上转型对象操作子类继承的方法或子类重写的实例方法,其作用等价于子类对象去调用这些方法,因此如果子类重写了父类的某个实例方法后,当对象的上转型对象调用这个实例方法时一定是调用了子类重写的实例方法。

在这里插入图片描述
但通过以下例子,我们发现上转型对象实际上可以“操作”子类新增的成员变量:

 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

实验表明:对象的上转型对象实际上可以通过重写方法来“操作”成员新增的变量,而不能直接操作子类新增的变量。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值