【问题标题】:Java Variables Shadowed Methods overridden conceptJava 变量被覆盖的方法被覆盖的概念
【发布时间】:2012-08-22 17:54:51
【问题描述】:

我很难理解 Java 继承的变量阴影方法覆盖概念。

案例一:

class Car{
   public int gearRatio = 8;
   public String accelerate() {  return "Accelerate : Car";  }
}
class SportsCar extends Car{
   public int gearRatio = 9;
   public String accelerate() {  return  "Accelerate : SportsCar";  }
   public static void main(String[] args){
      Car c = new SportsCar();
      System.out.println( c.gearRatio+"  "+c.accelerate() );
   }
}

输出:8 加速:跑车。

案例 2:

public class TestClass{
   public static void main(String args[ ] ){
      A o1 = new C( );
      B o2 = (B) o1;
      System.out.println(o1.m1( ) );
      System.out.println(o2.i );
   }
}
class A { int i = 10;  int m1( ) { return i; } }
class B extends A { int i = 20;  int m1() { return i; } }
class C extends B { int i = 30;  int m1() { return i; } }

输出:30、20

因此,如果我理解正确,则始终调用超类变量,除非显式调用子类变量。但是对于调用子类重写方法的方法,则相反,除非显式调用超类。

我认为变量和方法应该工作相同,否则在创建具有相同变量的子类时应该会出现编译错误。

谁能解释一下这是否正确以及为什么 java 会这样工作。

【问题讨论】:

    标签: java variables inheritance overriding shadowing


    【解决方案1】:

    我认为变量和方法应该工作相同,否则在创建具有相同变量的子类时应该会出现编译错误。

    嗯,这根本不是 Java 的工作方式。

    变量不以多态方式处理 - 没有“覆盖”变量的概念。然而,方法是以多态方式处理的。 行为可以特化,但不能状态。

    请注意,如果您的变量是私有的(它们几乎总是应该是私有的),那么情况甚至都不可见。

    【讨论】:

    • +1 表示“请注意,如果您的变量是私有的,因为它们几乎总是应该是私有的,那么情况甚至都不可见”
    • 那么为什么不以多态方式处理变量的概念并不重要,因为它们应该始终通过多态方法来处理?
    【解决方案2】:

    在 java 中没有 Instance variable overriding concept 并且变量不是多态的方法。

    所以在你的情况下,如果你使用:

    Car c = new SportsCar();  // c is Object reference of type Car
    System.out.println( c.gearRatio+"  "+c.accelerate() );
    

    c.gearRatio 指的是Car 和not from SportsCar 中的齿轮比。在c.accelerate()方法的情况下,SportsCar中的方法被覆盖,它是SportsCar对象,所以SportsCar.accelerate()被调用。

    public static void main(String args[ ] ){
      A o1 = new C( );  // object reference is of type A and object is C
      B o2 = (B) o1;   // object of C can be type casted to B as B is parent to C
      System.out.println(o1.m1( ) ); // C.m1() will be called.  
      System.out.println(o2.i );   // o2 is type B, so B.i will be printed
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 2011-12-13
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      相关资源
      最近更新 更多