0

是否可以直接从子类访问变量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?
    }

}

谢谢。

4

7 回答 7

2

你的subclass类不是子类化main,所以它不能直接访问abc。称它为令人困惑subclass,因为它只是Object(隐式)子类。

它需要对main类的一个实例有一个引用,然后才能abc通过该实例进行访问。这将起作用,因为abcis public

更新

例子:

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;
    }
}
于 2013-10-08T19:28:04.140 回答
1

您的代码有很多问题。

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

    main m = new main();
    public subclass() {
    
       m.abc = true;
    }
    
  3. 您还必须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);
    }
    
于 2013-10-08T19:38:15.823 回答
0

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

于 2013-10-08T19:32:28.230 回答
0

如果您要访问abc,那么您必须有一个main类的实例:

Main m = new Main();
m.abc = "something";
于 2013-10-08T19:33:12.360 回答
0

如果您不将 abc 设为静态,它将仅存在于“main”的实例(或对象)中。因此,要访问它,您需要引用该对象。因此,您可以做的一件事是在 SubClass 的构造函数中请求 Main(您应该遵循java 约定),例如:

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

(子类命名在这里有点奇怪,我认为您可能想了解更多关于对象/实例或一般 OOP 的知识。)

于 2013-10-08T19:33:51.293 回答
0

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

  m.abc= true

将是一个不错的选择。

于 2013-10-08T19:38:54.890 回答
0

如果它扩展了主类,您可以在子类中访问 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
于 2013-10-08T19:47:37.553 回答