是否可以直接从子类访问变量 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?
}
}
感谢。
答案 0 :(得分:2)
您的subclass
课程不是main
的子类,因此无法直接访问abc
。称之为subclass
令人困惑,因为它只是Object
(隐式)的子类。
它需要引用main
类的实例,然后它才能通过该实例访问abc
。这可行,因为abc
是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;
}
}
答案 1 :(得分:1)
您的代码存在许多问题。
Bus extends Vehicle
扩展另一个类(默认情况下,所有类都在
java只扩展Object)。 您已将abc
声明为公开,此为
意味着每个拥有该类实例的人都可以访问它
主要通过在实例上使用点运算符。您可以通过在main
subclass
的实例来实现此目的
main m = new main();
public subclass() {
m.abc = true;
}
您还必须从main中删除public subclass subclass1 = new subclass();
。你使这些类子类的方式需要主要需求子类需要主要需要子类....循环引用。
由于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