2012-08-22 188 views
3

我很努力去理解变量被覆盖的方法覆盖用Java继承的概念。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这样工作请。

回答

11

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

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

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

请注意,如果您的变量是私人的,因为它们几乎总是应该是这样的,这种情况永远都不可见。 “

+3

+1”注意,如果你的变量是私人的,因为他们几乎总是应该的,情况永远不可见“ – kosa

+0

因此,为什么变量不是多态处理的概念并不重要,因为它们应该始终通过处理多态的方法? – Quinma

1

在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指速比在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 
}