关于重写变量java继承的说明

时间:2017-10-21 12:01:51

标签: java polymorphism

有人可以解释为什么函数从super而不是从子类打印变量?无法在Java中覆盖类变量?

 class A {
  int i = 1;
  int fun() {
   return i;
  }
 }

 class B extends A {
  int i = 2;
 }

class Main {
 public static void main(String[] args) {
  System.out.println(new B().fun());
 }
}

这打印出1而不是2

2 个答案:

答案 0 :(得分:1)

因为在子类中声明的字段永远不会覆盖超类的字段。

覆盖方法 如果您想使用当前类的i值,可以引入getI()方法来提供i值:

 class A {
  int i = 1;
  int fun() {
   return getI();
  }
  int getI(){
    return i;
  }
 }

并在子类中覆盖它:

 class B extends A {
  int i = 2;

  int getI(){
    return i;
  }
 }

答案 1 :(得分:0)

您将从i函数返回fun()的值。如果要从类B返回override变量的值,则需要覆盖该方法,因为fun方法是超类的一部分,它仅指超类的i

但是永远记得在java中覆盖变量总是一个坏主意,它可能会给你带来意想不到的结果。

如果您仍然希望您可以使用这种方式。

class A {
  int i = 1;
  int fun() {
   return i;
  }
 }

 class B extends A {
  int i = 2;
  int fun() {
       return i;
      }
 }
 class Main {
 public static void main(String[] args) {
 System.out.println(new B().fun()); // this will refer the override i 
}
}