繁体   English   中英

在Java中遇到子类问题

[英]Having trouble with Subclasses in java

我正在审阅教科书中的一个问题,我有些困惑。 代码是:

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打印方法的定义。

b。 编写类DClass的方法集的定义。

对于a,我是否正确地说,将以下内容放入子类将是成功的替代?

public void print()
{
  System.out.print(x + " and " + y);
}

我对b也有麻烦。 因为有了后置条件,所以很明显我应该将y(子类中的实例变量)设置为b。 我面临的问题是如何将x设置为a。 因为实例变量x属于父类,这是否使其无法直接访问? 还是我被允许这样做:

public void set(int a, int b)
{
  x = a;
  y = b;
}

非常感谢您的帮助,谢谢!

下面是正确的。 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;
}

x在基类中声明为private 这意味着在派生类中,您将无法访问它进行设置或打印。 但是,基类确实具有公共方法来完成这两种操作。 这些方法在派生类中可见,这样你就可以/必须使用的。

在DClass.print中,调用基类的print方法来打印x

public void print()
{
    super.print();
    System.out.print(" and " + y);
}

super关键字用于在父类中调用print的实现。 没有super. 在调用之前,它将调用派生类的相同打印方法,这将再次进行相同的调用,并由于堆栈溢出错误而迅速崩溃。

在DClass.set中,您同样需要调用基类的set方法:

public void set(int a, int b)
{
    super.set(a);
    y = b;
}

在这里, super. set调用之前是可选的,因为唯一名为set方法仅接受1个参数,该方法位于基类中,并且不会被覆盖(仅重载 )。 但是,包括super. 使其更清晰。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM