2012-10-22 72 views
0

我知道在java中被稱爲field hiding的概念。但是,我仍然對實例變量沒有被過度佔用感到困惑。在java中說「實例變量沒有被覆蓋」是什麼意思?

根據我目前的知識,覆蓋超類的方法意味着JVM將調用子類的覆蓋方法,儘管超類的方法可用於子類。

而且我通過鏈接閱讀field hiding了類似的事情: - Hiding Fields

所以,在任何情況下我們都過度擺脫的情況下,如果我們改變在子類繼承的實例變量的值。

我很困惑請幫忙。


我使用下面的超一流: -

public class Animal{ 
File picture; 
String food; 
int hunger; 
int width, height; 
int xcoord, ycoord; 

public void makeNoise(){ 
......... 
} 

public void eat(){ 
............. 
} 

public void sleep(){ 
.......... 
} 

public void roam(){ 
............. 
} 

}

它的子類,如虎,貓,狗,河馬等子類的過騎makeNoise(),吃和漫遊()方法。

但是,每個子類還爲實例變量使用了一組不同的值。根據我的困惑,我很重視所有的實例變量和3種超類動物的方法;並且我仍然使用super關鍵字爲子類提供了超類實例變量。

+2

請給我們看一些代碼,以便我們能夠理解您在做什麼 – alestanis

+0

您的意思是說**重寫**而不是**重載**? (這是兩回事)。 – Jesper

+0

是的,先生,我說的是重寫而不是重載。 – Ankit

回答

1

這意味着如果您調用超類中的方法,它將解析爲子類中的覆蓋版本(如果您的實例是子類)。但是,對成員變量的引用將被綁定到調用該類的該變量的聲明。

1

那麼,overloading通常是指功能/方法重載

允許創建幾種方法與從 不同彼此在輸入的類型和函數的輸出相同的名稱。它被簡單地定義爲一個功能執行不同的 任務的能力。

你看,這個術語與函數/方法有關 - 不是實例變量(字段)。後者不能超載也不能重載。見例如this question

對於你的例子:其實,你是不是首要祖先的領域,但隱藏他們。

一個例子:

class Human { 
    String name; 
    int age; 

    public Human(String n, int a) { 
     this.name = n; 
     this.age = a; 
    } 

    public void tell_age() { 
     System.out.println("I am "+this.age); 
    } 
} 

class Female extends Human { 
    // We want to HIDE our real age ^^ 
    String age = 'not too old'; 

    public Female(String n, int a) { 
     this.name = n; 
     super.age = a; 
    } 

    // We override the parent's method to cloak our real age, 
    // without this, we would have to tell our true age 
    public void tell_age() { 
     System.out.println("I am "+this.age); 
    } 

    // Ok, we give in, if you really need to know 
    public void tell_true_age() { 
     System.out.println("I am "+super.age); 
    } 
} 
public static void main(String[] args) { 
    Female Jenna = new Female('Jenna', 39); 

    Jenna.tell_age(); // => I am not too old 
    Jenna.tell_true_age(); // I am 39 
} 
+0

是的,我讀過隱藏,(在一個類中,與超類中的字段具有相同名稱的字段隱藏了超類的字段,即使它們的類型不同)。但是我的困惑是,像我們改變子類中方法的定義(over-riding)一樣,我們也可以改變實例變量的值;那爲什麼說實例變量沒有被覆蓋。 – Ankit

+1

噢,好的,你用*覆蓋*這個詞有問題。當然,從外行的角度來說,可以說這些字段被傳遞給實例方法的參數所覆蓋;畢竟他們的價值正在改變。但是從編程意義上來說,重寫*這個術語被用來指代多態中的一個特徵。 – aefxx

0

一般情況下,我們使用override描述的方法,但並不領域。但是你會說他們有類似的行爲。

    當他們有相同的字段名稱/方法簽名
  • 的子類,除非你使用super一個總是會覆蓋超一個