java隐藏输出_Java隐藏字段

在Java中有方法的重写,没有属性/字段的重写,准确的来说,是隐藏字段代替了重写。

先让我们看一下下面这个例子,new两个子类对象,一个指向子类类型的引用,一个指向父类类型的引用。

public class HideField {

public static void main(String[] args) {

SubB subB = new SubB();

System.out.println(subB.s);

SuperA superA = new SubB();

System.out.println(superA.s);

}

}

class SuperA{

String s = "父类中的s";

}

class SubB extends SuperA{

String s = "子类中的s";

}

输出结果:

820460813621

结果.jpg

我们创建了两个Sub对象,但是为什么第二个对象打印出来的结果是"Super"呢?

隐藏字段代替了重写

在java官方提供的tutorial有一段关于隐藏字段的明确定义:

Within a class, a field that has the same name as a field in the superclass hides the superclass’s field, even if their types are different. Within the subclass, the field in the superclass cannot be referenced by its simple name. Instead, the field must be accessed through super. Generally speaking, we don’t recommend hiding fields as it makes code difficult to read.

从上面这段解释中,我们可以看出成员变量不能像方法一样被重写。当一个子类定义了一个跟父类相同名字的字段时,子类就是定义了一个新的字段,即使他们的类型不同。这个字段在父类中是被隐藏的,所以说子类不可以进行重写。

如何访问隐藏字段

采用父类的引用类型,这样隐藏的字段就能被访问了,像上面所给出的例子一样。

将子类强制类型转化为父类类型,也能访问到隐藏的字段。

SubB subB = new SubB();

System.out.println(((SuperA)subB).s);

小结:

这个主要涉及到java里面一个字段隐藏的概念,父类和子类定义了一个同名的字段,不会报错*但对于同一个对象,用父类的引用去取值(字段),会取到父类的字段的值,用子类的引用去取值(字段),则取到子类字段的值。

所以在实际的开发中,要尽量避免子类和父类使用相同的字段名,否则很容易引入一些不容易发现的bug。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值