在java中遇到子类问题

时间:2014-02-25 03:43:44

标签: java class subclass

我正在审查我的一本教科书问题而且我有点困惑。代码是:

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;
}

真的很感激一些帮助,谢谢!

2 个答案:

答案 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.使其更清晰。