是否可以从另一个类访问变量?

时间:2013-10-08 19:23:43

标签: java class variables

是否可以直接从子类访问变量 abc

我知道将 abc 更改为静态是可能的,但我不想这样做。

主:

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?
    }

}

感谢。

7 个答案:

答案 0 :(得分:2)

您的subclass课程不是main的子类,因此无法直接访问abc。称之为subclass令人困惑,因为它只是Object(隐式)的子类。

它需要引用main类的实例,然后它才能通过该实例访问abc。这可行,因为abcpublic

<强>更新

示例:

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;
    }
}

答案 1 :(得分:1)

您的代码存在许多问题。

  1. 子类不是任何子类,为了它是一个 子类它必须通过使用关键字extends,Bus extends Vehicle扩展另一个类(默认情况下,所有类都在 java只扩展Object)。
  2. 您已将abc声明为公开,此为 意味着每个拥有该类实例的人都可以访问它 主要通过在实例上使用点运算符。您可以通过在main

    中创建subclass的实例来实现此目的
    main m = new main();
    public subclass() {
    
       m.abc = true;
    }
    
  3. 您还必须从main中删除public subclass subclass1 = new subclass();。你使这些类子类的方式需要主要需求子类需要主要需要子类....循环引用。

  4. 由于while(true)的构造函数中的main,您永远无法访问该类的实例。这将永远运行,永远不会允许构造函数完成。您必须删除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);
    }
    

答案 2 :(得分:0)

这是简单继承,因为abc访问修饰符是公共的,所以你应该能够在子类中使用而没有任何问题。

答案 3 :(得分:0)

如果您要访问abc,那么您必须拥有main课程的实例:

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

答案 4 :(得分:0)

如果不使abc静态,它将只存在于“main”的实例(或对象)中。 因此,要访问它,您需要引用该对象。 所以你可以做的一件事是在SubClass的构造函数中要求Main(你应该遵循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);
}

或者如果SubClass实际上仅供Main使用,那么你可以将其作为内部类。

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;
    }
}

(SubClass命名在这里有点奇怪,我想你可能想要了解更多关于对象/实例,或者一般的OOP。)

答案 5 :(得分:0)

如果两个类都相关,则可以使用简单继承。否则,

  m.abc= true

将是一个不错的选择。

答案 6 :(得分:0)

如果扩展类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