Java的隐藏属性

Java的隐藏属性

Java中绝对没有所谓的属性重写,但是我们可以定义与父类相同的属性名的属性。具体细节如下。

public class FieldHidden {
	public static void main(String[] args) {
		Sup sub1 = new Sub();//父类指针指向子类对象
		Sub sub2 = new Sub();
		System.out.println(sub1.num); //100
		System.out.println(sub2.num); //10
	}
}
class Sub extends Sup{//子类
	int num = 10;
	String str = "sub";
	public int getNum() {
		return this.num;
	}
	public void add() {
		num+=10;
	}
}
class Sup{//父类
	int num = 100;
	String str = "sup";
	public int getNum() {
		return this.num;
	}
	public void add() {
		num+=100;
	}
}

从上面实例可以看出:

1、成员变量不能像方法一样被重写

2、当子类定义一个跟父类相同名字的字段,子类就定义了一个新的字段。

3、当我们使用子类指针访问子类对象,就可以访问到子类中与父类属性名相同的属性变量;当我们使用父类指针访问父类对象时,就可以访问到父类中与子类属性名相同的属性变量;

public class FieldHidden {
	public static void main(String[] args) {
		Sup sub1 = new Sub();//父类指针指向子类对象
		sub1.add();
		System.out.println(sub1.num);//100
		System.out.println(((Sub)sub1).num);//20
	}
}
class Sub extends Sup{//子类
	int num = 10;
	String str = "sub";
	public int getNum() {
		return this.num;
	}
	public void add() {
		num+=10;
	}
}
class Sup{//父类
	int num = 100;
	String str = "sup";
	public int getNum() {
		return this.num;
	}
	public void add() {
		num+=100;
	}
}

当我们调用sub1.add()时,我们调用的是子类本身的方法,因为动态绑定原理。即jvm会调用对象本身的方法。(具体虚实函数,动态绑定知识请自行百度,本文不再赘述)。

1、sub1.add()调用的是子类(Sub)的add();故其sum增加的也应该是子类(Sub)中的sum。

2、sub1.sum 因为sum是属性,没有动态绑定原理,则显示的是父类(Sup)的sum。

3、((Sub)sub1).num 将sub1的指针先强制转换为子类(Sub)的,再打印sum属性,即打印子类(Sub)的属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值