java中子类和父类有相同的成员变量 ,何种取值问题.

java中子类和父类有相同的成员变量 ,何种取值问题

对于java中的父类和子类含有相同的成员变量,数值如何判断:
这里粗略的说一下:

  1. 子类,父类含有相同的成员变量,数值看引用型变量所属的类,即左边
  2. 父类独有方法改变成员变量值,则改变的是父类中的数据
  3. 子类重载父类方法,调用的是子类的方法,改变的是子类数据
  4. 如果在多态,即Parent c = new Child(),子类重载父类方法,则c.方法( ) 调用的是子类的方法,改变的子类变量数据,c.变量 显示的是父类数据,还是未改变的。

测试代码如下

package net.ex;

/**
 * 父类和子类含有同名成员变量赋值问题
 *
 * @author mahao
 * @date: 2019年2月27日 下午7:19:27
 */

public class Demo3 extends Fu {

	int i = 100;
	
	//测试二时,关闭方法
	@Override
	void set() {
		i = 1000;
	}
	
	public static void main(String[] args) {

		Fu f = new Fu();
		Demo3 z = new Demo3();
		Fu zi = new Demo3();
		// 测试一:
		System.out.println("引用型和实例都是fu类型,结果为10--" + f.i);//10
		System.out.println("结果为子类型数据" + z.i);//100
		System.out.println("父类引用型变量持有子类对象时,属性值看应用型变量" + zi.i);//10

/*		// 测试二: 父类有的方法没有,子类数据改变
		z.set();//子类对象调用父类中的方法,改变成员变量的值
		Fu z2 = z;
		System.out.println("子类对象数据没有发生改变"+ z.i);//100
		System.out.println( "父类对象数据发生改变"+z2.i);//20
		//----
		zi.set();
		System.out.println(zi.i);//20   持有的是父类成员属性,所以数据会发生改变
*/		
		//测试三: 子类覆盖父类方法,成员变量属性变化
		z.set();
		Fu z2 = z;
		System.out.println("子类对象数据发生改变"+ z.i);//1000
		System.out.println( "父类对象数据没有发生改变"+z2.i);//10
		
		//测试四:调用的是子类的方法,改变了子类数据,显示的是父类的变量
		zi.set();
		Demo3 d = (Demo3) zi;
		System.out.println(zi.i);//10 
		System.out.println(d.i);//1000 
	/**
	 * 总结:
	 * 	1. 子类对象在初始化时,子类对象和父类对象在两个不同内存区域,子类和父类含有相同的成员变量,
	 * 	成员变量的数值是跟从引用型变量所属的类。当调用方法,改变成员变量数值时,改变的数据是方
	 * 	法所属的类。
	 * 
	 *	2. 当采用多态时,父类持有子类对象 Fu zi = new Demo3(),父类和子类含有相同方法和变量,
	 * 	则zi.方法()调用的是子类的方法,zi.变量显示的是父类的变量
	 * 
	 */
	}
}

class Fu {

	int i = 10;

	void set() {
		i = 20;
	}

}
  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值