我正在审查我的一本教科书问题而且我有点困惑。代码是:
public class BClass
{
private int x;
public void set(int a)
{
x=a;
}
public void print()
{
System.out.print(x);
}
}
public class DClass extends BClass
{
private int y;
public void set(int a, int b)
{
//Postcondition: x = a; y = b;
}
问题是:
一个。写出覆盖它的DClass的print方法的定义。
湾写出DClass类的方法集的定义。
对于a,我是否正确地说在子类中放入以下内容会成功覆盖?
public void print()
{
System.out.print(x + " and " + y);
}
我也遇到麻烦了。因为我给了后置条件,所以我应该设置y,即子类中的实例变量,等于b。我面临的问题是如何将x设置为等于a。因为实例变量x属于父类,这是否使它无法直接访问?或者我被允许这样做:
public void set(int a, int b)
{
x = a;
y = b;
}
真的很感激一些帮助,谢谢!
答案 0 :(得分:2)
以下是正确的。 A不正确。我只是想说这是覆盖如何工作。我没有看这个方法的有效性。
应该是
public void print() {
super.print();
System.out.print(" and " + y);
}
对于B,您需要调用super方法
public void set(int a, int b) {
super.set(a);
y = b;
}
答案 1 :(得分:2)
x
在基类中声明为private
。这意味着在派生类中,您无法访问它来设置它或打印它。但是,基类确实有公共方法来执行这两项操作。这些方法 对派生类是可见的,因此您可以/必须使用这些方法。
在DClass.print中,调用基类的print方法来打印x
:
public void print()
{
super.print();
System.out.print(" and " + y);
}
super
keyword用于在父类中调用print的实现。如果在调用之前没有super.
,它将调用派生类的相同打印方法,这将再次进行相同的调用,并因堆栈溢出错误而快速崩溃。
在DClass.set中,您同样需要调用基类的set方法:
public void set(int a, int b)
{
super.set(a);
y = b;
}
这里,super.
在set
调用之前是可选的,因为名为set
的唯一方法只需要1个参数,它在基类中,并且不会被覆盖(只有overloaded)。但是,包括super.
使其更清晰。