簡體   English   中英

Java變量被遮擋的方法被覆蓋的概念

[英]Java Variables Shadowed Methods overridden concept

我正在努力用Java了解Variables Shadowed Methods Overriden繼承概念。

情況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會像這樣工作。

我認為變量和方法應該相同,或者在創建具有相同變量的子類時應該存在編譯錯誤。

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

變量不是多態處理的 - 沒有“覆蓋”變量的概念。 然而,方法多態的。 行為可以是專門的,但不是狀態

請注意,如果您的變量是私有的,因為它們幾乎總是應該是,那么情況永遠不可見。

在java中沒有Instance variable overriding concept ,變量不像methd那樣是多態的。

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

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

c.gearRatio指的是Car的gearRatio,而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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM