2013-10-08 78 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。对不起,如果我不符合你的要求 –