2017-05-23 73 views
1

覆蓋實例變量的我知道,當你重載方法,那麼Java解決它編譯階段所以這就是爲什麼當你寫的東西是這樣的:分辨率在Java

public class SomeClass{ 
    private static void someMethod(Object obj){ 
     System.out.println("obj"); 
    } 
    private static void someMethod(String str){ 
     System.out.println("str"); 
    } 
    public static void main(String[] args) { 
     Object obj = new SomeClass(); 
     obj.someMethod(obj); 
    } 
} 

你會得到OBJ,因爲oveloading是在編譯解決,做這樣的事情:

public abstract class Animal { 
       public void careFor() { 
     play(); 
    } 
    public void play() { 
     System.out.println("pet animal"); 
    } 
} 
public class Lion extends Animal { 

    public void play() { 
     System.out.println("toss in meat"); 
    } 

    public static void main(String[] args) { 
     Animal animal = new Lion(); 
     animal.careFor(); 
    } 
} 

你會得到肉折騰在運行時階段解決了beacuse重寫方法。 但我不明白。爲什麼當你重寫實例變量時,你會得到像在編譯階段解決的情況。例如:

public abstract class Animal { 
    String name = "???"; 

    public void printName() { 
     System.out.println(name); 
    } 
} 
public class Lion extends Animal { 
    String name = "Leo"; 

    public static void main(String[] args) { 
     Animal animal = new Lion(); 
     animal.printName(); 
    } 
} 

在這種情況下,我會得到???。所以它看起來像在重寫變量時在編譯階段解決。是這樣嗎?

+0

嗯,是的。變量是基於引用訪問的,而不是實例。概念上沒有「壓倒一切」的變量。 – Mena

回答

4

在Java中只有方法是多態而不是變量。

所以,當你做

Animal animal = new Lion(); 

你得到所有從AnimalLion變量和方法被執行。