当前位置: 首页 > 面试题库 >

覆盖方法和字段的不同行为

田远
2023-03-14
问题内容

我刚刚注意到,覆盖方法的行为与覆盖字段的行为不同。考虑以下代码段:

public class Bar {
  int v =1;

  public void printAll(){
    System.out.println(v);
    printV();
  }

  public void printV(){
    System.out.println("v is " + v);
  }
}

public class Foo extends Bar {
  int v = 4;

  public static void main(String[] args) {
    Foo foo = new Foo();
    foo.printAll();
 }

 public void printV() {
   System.out.println("The value v is  " + v);
 }
}

结果为:
1
值v为4

因此,似乎bar中的方法printV被foo.printV覆盖,而字段v中的方法并未被bar覆盖。有人知道这种差异的原因吗?

谢谢。


问题答案:

我刚刚注意到,覆盖方法的行为与覆盖字段的行为不同。

没有“覆盖字段”之类的东西。您可以 阴影
字段,但不能覆盖它们。字段不是多态的。有关更多详细信息,请参见Java语言规范的6.4.1节。

请注意,一般而言,字段几乎 总是 应该是私有的,这意味着您一开始就不会意识到这一点。



 类似资料:
  • Swagger用相同的路径和方法但不同的参数覆盖方法 我有一个带有Spring Boot 2.3.5.RELEASE,webflux和springfox 3.0.0的应用程序。我开发了两个具有相同路径但参数不同的GET方法,一个不接收参数并返回list,另一个返回findAll。 情况是,Swagger只生成其中一种方法的文档,有时是列表,有时是分页。我怎么能告诉swagger他们是不同的方法,并

  • 问题内容: 在Java中重写equals方法以比较多个字段的最佳方法是什么?例如,我在类中有4个对象,分别为o1,o2,o3,o4,我想将所有这些对象与传递给equals方法的对象进行比较。 这段代码的问题在于它不清楚,如果我们有更多字段,就很难轻易修改。有没有更好的方法来实现这一目标? 问题答案: 一种便宜的方法是:

  • 问题内容: 我正在浏览Kathe sierra编写的SCJP 6,并遇到了有关以重写方法引发异常的解释。我真的不明白。有人可以向我解释吗? 覆盖方法不得抛出比被覆盖方法声明的异常新的或更广泛的检查异常。例如,声明FileNotFoundException的方法不能被声明SQLException,Exception或任何其他非运行时异常的方法覆盖,除非它是FileNotFoundException的

  • 问题内容: 我有一个抽象类,应该实现一个公共字段,该字段是一个接口或另一个抽象类。 像这样的东西: 现在我有另一个专门的类容器: Java的让我编译这个,和我想象的领域中被自动重载领域的......这些问题是:我是对这个?孩子的自动“超载”会发生吗? 而且,更重要的问题是,如果我还有另一个这样的课: 会返回1还是2?我的意思是容器字段将称为通用字段还是特殊字段?还有,如果特殊的prop1被声明为S

  • 问题内容: 我想为 isEmpty 方法添加自定义行为。 当我从 我应该重写序列化方法,因为它是抽象的。 我想按原样保留序列化方法,并仅覆盖isEmpty方法。 问题答案: 为了修改行为但保持默认的序列化,您可以利用 serializer修饰符 。您仍然必须实现自定义序列化程序,但是可以非常干净地利用默认序列化程序。 使用默认的序列化器创建一个自定义序列化器 将变量插入到您的自定义序列化器类中。当

  • 问题内容: 考虑以下代码: 现在,更改方法的可见性,我得到: (for ,for ) (看起来像)。 我期望所有东西都像声明时一样。但是,尽管和本质上是同一件事,但根据in 和的可见性,它们会产生不同的结果。为什么会这样? 问题答案: 继承/覆盖私有方法 在PHP中,子类中的方法(包括私有方法)为: 复制;保留原始功能的范围。 已替换(如果需要,则为“覆盖”)。 您可以使用以下代码查看此内容: 现