为了账号安全,请及时绑定邮箱和手机立即绑定

用Java覆盖成员变量(变量隐藏)

用Java覆盖成员变量(变量隐藏)

临摹微笑 2019-06-25 14:59:42
用Java覆盖成员变量(变量隐藏)我正在研究用Java重写成员函数,并考虑尝试重写成员变量。所以,我定义了类public class A{     public int intVal = 1;     public void identifyClass()     {         System.out.println("I am class A");     }}public class B extends A{     public int intVal = 2;     public void identifyClass()     {         System.out.println("I am class B");     }}public class mainClass{     public static void main(String [] args)     {         A a = new A();         B b = new B();         A aRef;         aRef = a;         System.out.println(aRef.intVal);         aRef.identifyClass();         aRef = b;         System.out.println(aRef.intVal);         aRef.identifyClass();     }}产出如下:1I am class A1I am class B我不明白为什么Aref设置为b intVal仍然属于A类?
查看完整描述

3 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

Java中的字段没有多态性。

Variables决策总是在编译时发生。基类变量(不是子变量的继承变量)将被访问。

所以,每当向上转换发生时,请记住

1)将访问基类变量。

2)子类方法(如果重写发生了其他继承的方法,则调用父方法)。


查看完整回答
反对 回复 2019-06-25
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

Java函数中覆盖的概念将取决于对象类型,变量将在引用类型上访问。

  1. 重写函数:在本例中,假设父类和子类的名称与自己的定义相同。但是,哪个函数将执行它取决于对象类型,而不是运行时的引用类型。

例如:

Parent parent=new Child();parent.behaviour();

这里parent是父类的引用,但持有子类的对象,因此在这种情况下将调用子类函数。

Child child=new Child();child.behaviour();

这里child保存子类的对象,因此将调用子类函数。

Parent parent=new Parent();parent.behaviour();

这里parent保存父类的对象,因此将调用父类函数。

  1. 覆盖变量:Java支持重载变量。但实际上,这是两个同名的不同变量,一个在父类中,一个在子类中。这两个变量可以是相同的数据类型,也可以是不同的数据类型。

当您试图访问变量时,它依赖于引用类型对象,而不是对象类型。

例如:

Parent parent=new Child();System.out.println(parent.state);

引用类型是父类型,因此可以访问父类变量,而不是子类变量。

Child child=new Child();System.out.println(child.state);

在这里,引用类型是子类型,因此访问的是子类变量,而不是父类变量。

Parent parent=new Parent();System.out.println(parent.state);

在这里,引用类型是父类型,因此访问父类变量。


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 622 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信