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

问题是:

a。编写覆盖它的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,你需要调用超级方法,这样

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

最新更新