Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中遇到子类问题_Java_Class_Subclass - Fatal编程技术网

在java中遇到子类问题

在java中遇到子类问题,java,class,subclass,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

我在复习课本上的一个问题,我有点困惑。代码是:

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;
    }
问题是:

a。编写覆盖它的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;
}

非常感谢您的帮助,谢谢

下面是正确的。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是不正确的。我只是想说这就是覆盖的工作原理。我没有看这个方法的有效性

应该是

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);
}
用于在父类中调用print的实现。如果调用前面没有
super.
,它将调用派生类的同一个print方法,该方法将再次进行相同的调用,并迅速导致堆栈溢出错误

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

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

在这里,
super.
set
调用之前是可选的,因为唯一名为
set
的方法正好接受一个参数,它在基类中,并且不被重写(仅)。但是,包括
super.
更清楚。

x
在基类中声明为
private
。这意味着在派生类中,您无法访问它来设置它或打印它。但是,基类确实有公共方法来做这两件事。这些方法对派生类可见,因此您可以/必须使用这些方法

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

public void print()
{
    super.print();
    System.out.print(" and " + y);
}
用于在父类中调用print的实现。如果调用前面没有
super.
,它将调用派生类的同一个print方法,该方法将再次进行相同的调用,并迅速导致堆栈溢出错误

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

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


在这里,
super.
set
调用之前是可选的,因为唯一名为
set
的方法正好接受一个参数,它在基类中,并且不被重写(仅)。但是,包含
super.
会更清楚。

任何时候如果要重写方法,请使用
@override
对其进行注释。类继承其父类的可访问方法。正确,您不能直接在子类中访问
x
,因为它在父类中声明为
private
。我知道子类继承了其父类的可访问方法。但是我可以在子类的set方法中使用父类中的set方法吗?不清楚你在问什么。。。就好像你没试过一样。。。由于访问问题,您发布的代码无法编译。任何时候,如果要重写方法,请使用
@override
对其进行注释。类继承其父类的可访问方法。正确,您不能直接在子类中访问
x
,因为它在父类中声明为
private
。我知道子类继承了其父类的可访问方法。但是我可以在子类的set方法中使用父类中的set方法吗?不清楚你在问什么。。。就好像你没试过一样。。。由于访问问题,您发布的代码无法编译。A也不正确;你不能在子类中直接访问
x
。哦,现在这很有意义。那么我应该把X去掉吗?只要它改变了就意味着它被覆盖了,对吗?这里不需要
super
。它还没有被覆盖。这个方法可以是
最终的
。非常感谢,我真的很感激!真的为我澄清了。A也是不正确的;你不能在子类中直接访问
x
。哦,现在这很有意义。那么我应该把X去掉吗?只要它改变了就意味着它被覆盖了,对吗?这里不需要
super
。它还没有被覆盖。这个方法可以是
最终的
。非常感谢,我真的很感激!真的帮我弄清楚了。谢谢你花时间!我不知道超级警察的事。真的很有帮助!谢谢你抽出时间!我不知道超级警察的事。真的很有帮助!