【问题标题】:Having trouble with Subclasses in java在java中遇到子类问题
【发布时间】:2014-03-27 01:57:25
【问题描述】:

我正在复习我的教科书的一个问题,我有点困惑。代码是:

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

b.写出类DClass的方法集的定义。

对于一个,我是否正确地说将以下内容放入子类中将是一个成功的覆盖?

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

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

【问题讨论】:

  • 任何时候你想重写一个方法,用@Override注释它。
  • 一个类继承其父类的可访问方法。
  • 正确,您不能在子类中直接访问x,因为它在父类中声明为private
  • 我了解子类继承了其父类的可访问方法。但是我可以在子类的set方法中使用父类的set方法吗?
  • 不清楚你在问什么......这几乎就像你没有尝试过......你发布的代码由于访问问题而无法编译.

标签: java class subclass


【解决方案1】:

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 的方法只需要一个参数,并且它没有被覆盖(只有overloaded)。但是,包含super. 会更清楚。

【讨论】:

  • 感谢您抽出宝贵时间!我不知道超级。真的有帮助!
【解决方案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;
}

【讨论】:

  • A 也不正确;你不能直接在子类中访问x
  • 哦,这很有意义。所以我应该把X换成A吗?只要它改变了就意味着它被覆盖了,对吧?
  • 这里不需要super。它没有被覆盖。方法可以设为final
  • 非常感谢,非常感谢!真的为我清除了它。
猜你喜欢
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多