如果子类调用超类方法,将使用其字段的 Java
Posted
技术标签:
【中文标题】如果子类调用超类方法,将使用其字段的 Java【英文标题】:Java Whose Field Will be Used, if Subclass Calls Superclass Method 【发布时间】:2013-06-13 15:15:57 【问题描述】:我正在编写一些需要利用继承功能的 android 代码。以下代码 sn -p 是让我感到困惑的部分:
超类:
public class Foo
public int length = 1;
public int width = 2;
public int height = 3;
public Foo(int len, int wid, int hei)
length = len;
width = wid;
height = hei;
public int getVolume()
return length * width * height;
这是子类:
public class Bar extends Foo
int extraVolume = 4;
public Bar(int len, int wid, int hei, int extra)
super(len, wid, hei);
length = len;
width = wid;
height = hei;
this.extraVolume = extra;
@Override
public int getVolume()
return (super.getVolume() + this.extraVolume);
如果我以这种方式使用它们:
Bar bar = new Bar(1, 1, 1, 4);
System.out.println("The bar volume is : " + bar.getVolume());
由于在 getVolume() 方法中,SubClass Bar 使用了 super.getVolume(),我想知道答案是 1 * 2 * 3 + 4 = 10 还是 1 * 1 * 1 + 4 = 5 ?
一般来说,如果子类调用超类的方法需要访问类中的某些字段,那么会使用哪个类字段?就像在这个例子中,如果 super.getVolume() 使用 SuperClass Foo 中的字段,那么它将返回 1 * 2 * 3 = 6,如果它使用 SubClass Bar 中的字段,它将返回 1 * 1 * 1 ?
有人可以帮我澄清一下并详细解释原因吗?提前致谢。
【问题讨论】:
那是编译错误,仅此而已。您的子类构造函数不调用超类参数化构造函数。 1 * 1 * 1 + 4 = 5,虽然这里确实有错误:Bar bar = new Bar(1, 1, 1, 4); 好吧,你必须考虑到,在运行时你将拥有一个扩展 Foo 的 Bar 类的对象,而不是两个对象,因此这些字段是在 Foo 类中声明的,但你可以访问它们通过您的 Bar 实例。 谢谢 Bob,你的意思是参数化的构造函数不会被隐式调用? 【参考方案1】:首先会创建超类(如果你确定调用了 super(,,))然后超类中的字段的内部化发生,最后超类的字段将被设置为值在子类中分配所以
1*1*1+4=5
这也不会创建字段的两个实例,一个在 super 中,一个在 sub 中,只会有一个实例,所以说哪个实例将被访问是错误的。
【讨论】:
以上是关于如果子类调用超类方法,将使用其字段的 Java的主要内容,如果未能解决你的问题,请参考以下文章