2013-10-08 138 views
0

是否可以直接從子類訪問變量abc是否可以從另一個類訪問變量?

我知道它可能通過將abc更改爲Static,但我不想這樣做。

主:

public class main { 

    public subclass subclass1 = new subclass(); 
    public boolean abc = false; 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     main menu1 = new main(); 
    } 

    public main(){ 
     while(true){ 
      if(abc = true){ 
       System.out.println("true"); 
      } 
     } 
    } 

} 

子類:

public class subclass { 

    public subclass(){ 
     .abc = true; //possible to access abc of main? 
    } 

} 

感謝。

+1

'如果(ABC =真){'應該是'如果(ABC ){'。使用正確的運算符是'==',但在這種情況下它是多餘的。 –

+0

是的,抱歉。或者abc == true – GerardMT

+0

繼承......? :P – user2339071

回答

2

您的subclass類不是子類main,所以它不能直接訪問abc。將它稱爲subclass是令人困惑的,因爲它僅暗含Object(隱含地)。

它需要對main類的實例有一個引用,那麼它可以通過該實例訪問abc。這將工作,因爲abcpublic

UPDATE

例子:

public class Main 
{ 
    public subclass subclass1; 
    public boolean abc = false; 

    public static void main(String[] args) 
    { 
     Main menu1 = new Main(); 
     menu1.subclass1 = new Subclass(menu1); 
     System.out.println(menu1.abc); 
    } 
} 

public class Subclass 
{ 
    private Main myMain; 
    public Subclass(Main main) 
    { 
     myMain = main; 
     myMain.abc = true; 
    } 
} 
+0

你能舉個例子嗎? – GerardMT

0

這是簡單的繼承和ABC因爲訪問修飾符是公共的,你應該能夠在子類中使用沒有任何問題。

0

如果你要訪問abc,那麼你就必須有你main類的一個實例:

Main m = new Main(); 
m.abc = "something"; 
0

如果你不把農行靜態只會在一個實例存在(或對象)「主」。 所以要訪問它,你需要有一個對象的引用。 這麼一件事,你可以做的是在子類的構造函數要求主(你應該遵循java conventions),如:

public class SubClass { 
    private final Main main; 
    public SubClass(Main main) { 
     this.main = main; 
     main.abc = true; 
    } 
} 

public class Main { 
    public SubClass subClass1 = new SubClass(this); 
} 

,或者如果子類真的只對主要的使用,你可以把它的內部類。

public class Main { 
    public class SubClass { 
     public SubClass() { 
      //You can access Main's variables here and in case of ambiguity by doing 
      Main.this.abc = true; 
     } 
    } 
} 

或者,您可以在SubClass中創建一個Main。

public class SubClass { 
    public SubClass() { 
     Main main = new Main(); 
     main.abc = true; 
    } 
} 

(子類命名是有點怪在這裏,我想你可能想了解更多的關於對象/實例,或OOP一般。)

1

有事情錯了衆多的碼。

  1. 子類是不是任何一個子類,以便它是一個 子類必須通過使用關鍵字的擴展另一個類擴展,Bus extends Vehicle(默認情況下在 Java中所有類只繼承對象)。
  2. 您已經聲明abc爲public,這 意味着它是大家誰擁有一流的 通過對實例使用點操作的主要的一個實例訪問。你可以在你的subclass

    main m = new main(); 
    public subclass() { 
    
        m.abc = true; 
    } 
    
  3. 創造main實例您還必須從主刪除public subclass subclass1 = new subclass();實現這一目標。你做這些類的子類的方式需要主要需求子類需要的主要需求子類....循環引用。

  4. 由於main的構造函數中的while(true),您將永遠無法訪問類的實例。這將永遠運行,永遠不會讓構造函數完成。你將不得不刪除while(true)語句,可以檢查是否abc確實已經改變通過執行以下操作

    main m = new main(); 
    public subclass() { 
        System.out.println("Value of abc? "+m.abc); 
        m.abc = true; 
        System.out.println("Value of abc? "+m.abc); 
    } 
    
+0

+1在構造函數中發現循環 – Alowaniak

0

您可以使用簡單的繼承,如果這兩個類是相關的。否則,

m.abc= true 

將是一個不錯的選擇。

0

如果擴展class main,則可以在子類中訪問abc。請找一個樣本

public class Test { 
Boolean abc = false; 
Test() 
{ 
    if(abc) 
    { 
     System.out.println("Test():True"); 
    } 
    else 
    { 
     System.out.println("Test():False"); 
    } 
} 
void method() 
{ 
    if(abc) 
    { 
     System.out.println("Method():True"); 
    } 
    else 
    { 
     System.out.println("Method():False"); 
    } 
} 

public static void main(String[] args) 
{ 
    Test1 child= new Test1(); 
    child.method();//Parent method (abc change will reflect) 
    Test parent = new Test();//Directly calling parent constructor so abc is false 

} 

}

子類下面

public class Test1 extends Test 
{ 
    Test1() 
    { 
     this.abc=true; 
    } 

} 

輸出中會

Test():False 
Method():True 
Test():False 
+0

Srry,我無法使用擴展,因爲我從另一個類擴展 – GerardMT

+0

無法創建主類的對象,因此無法訪問子類中的變量abc。一旦你在子類中創建主類對象,你可以調用abc,比如main m = new main();. m.abc。對不起,如果我不符合你的要求 –