Java变量阴影方法重载的概念(Java Variables Shadowed Methods ov

2019-07-31 03:52发布

我努力理解变量阴影方法重写理念的继承与Java。

情况1:

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的工作原理是这样吧。

Answer 1:

我认为变量和方法应该工作相同或创建子类以相同的变量时,应该有一个编译错误。

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

变量并不多态形式处理-有没有“压倒一切”的变量的概念。 方法, 然而 ,多态形式处理。 行为可以专业化,而不是状态

请注意,如果你的变量是私有的,因为他们几乎总是应该的,这种情况是从来没有看见。



Answer 2:

在java中有没有Instance variable overriding concept和变量并不多态的methds。

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

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

c.gearRatio指速比在Carnot 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
}


文章来源: Java Variables Shadowed Methods overridden concept