2013-07-10 50 views
-7

我對Java完全陌生...... :(在Java中傳遞從父類到子類的變量

我需要將父類的變量傳遞給子類,但我不知道如何要做到這一點。 變量位於父類的方法,我想在子類中的方法之一來使用它。

如何做到這一點?

public class CSVData { 
    private static final String FILE_PATH="D:\\eclipse\\250.csv"; 

    @Test 
    public static void main() throws IOException { 
//some code here 
String firstname1 = array.get(2).get(1); 

    } 
} 

,然後其他職業

public class UserClassExperimental3 extends CSVData { 
    public static void userSignup() throws InterruptedException { 
    //some code here 
    String firstname= firstname1; //and here it doesnt work 
    } 
} 

其實我覺得我成功這樣做是這樣的:

加入這裏的變量:

public static void userSignup(String firstname1) 

然後在這裏用它:

String firstname=firstname1; 
    System.out.println(firstname); 

但現在我無法通過它需要它的方法。

+2

您能告訴我們您嘗試過什麼嗎?請給出一個代碼示例。 –

+0

除非您從父級方法實例化子類,否則即使您有父級引用,也無法訪問父類的私有方法成員(反射除外)。 可以將孩子的變量設置爲公共和/或靜態,並直接以'myChildInstance.myVar'或'MyChildClass.myVar'的形式訪問,或者實例化子類並通過構造函數傳遞變量,有點像'new MyChildClass(myVar );' – Shark

+0

只是仔細檢查這個http://stackoverflow.com/questions/3564663/parent-package-class-accessible-from-child-packge-class-in-java?rq=1 – hellzone

回答

2

變量firstname1是一個局部變量。您無法在其範圍之外訪問它 - 方法。

你可以做的是將引用的副本傳遞給你的子類。

既然你調用一個靜態方法,最簡單的方法是通過參考作爲參數傳遞給方法調用:

@Test 
public static void main() throws IOException { 
//some code here 
    String firstname1 = array.get(2).get(1); 
    UserClassExperimental3.userSignup(firstName1); 
} 


public class UserClassExperimental3 extends CSVData { 
    public static void userSignup(String firstNameArg) throws InterruptedException { 
    //some code here 
    String firstname = firstnameArg; // Now it works 
    } 
} 

這就是說,由於您使用的繼承,則可能發現使用實例方法很有用。從方法中刪除「靜態」。在main()中,構造一個類的實例,爲其提供名稱,並調用實例上的方法。

@Test 
public static void main() throws IOException { 
//some code here 
    String firstname1 = array.get(2).get(1); 
    UserClassExperimental3 instance = new UserClassExperimental3(firstName1); 
    instance.userSignup(); 
} 

public class UserClassExperimental3 extends CSVData { 
    private String m_firstName; 
    public UserClassExperimental3(String firstName) { 
     m_firstName = firstName; 
    } 
    public void userSignup() throws InterruptedException { 
    //some code here 
    String firstname = m_firstname; // Now it works 
    } 
} 

如果您還將userSignup()添加到CSVData類中,則只能在創建時引用特定的子類。這樣可以更輕鬆地切換實現,並且無論使用哪個子類,它都可以更輕鬆地編寫適用的代碼。

String firstname1 = array.get(2).get(1); 
    CSVData instance = new UserClassExperimental3(firstName1); 
    instance.userSignup(); 
+0

非常感謝!4天我一直在爲這個而戰工作,感謝你! –

+0

我是否需要爲需要轉移的4個變量做同樣的事情? –

+0

不客氣!你可以用相同的方式傳遞另外四個變量注意,隨着參數數量的增加要確保所有的調用者以正確的順序傳遞它們變得更加困難當發生這種情況時,另一種方法是通過像setFirstName()這樣的setter方法來傳遞數據,如果你希望數據在一生中保持不變該類使用** Builder模式**,使用相同的setter,但在一個單獨的類中。 –