You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java类对象内部访问类变量及跨类访问成员变量问题

Hey there! Let's tackle your two Java questions step by step.

问题1:在Java类的对象内部访问类变量

首先要明确:类变量是用static关键字修饰的变量,属于整个类而非单个对象。在对象内部访问它有两种常用方式:

  • 推荐方式:使用类名直接访问
    这是最清晰、最规范的写法,不管对象内部有没有同名的实例变量,都不会产生歧义。
  • 简化方式:直接使用变量名
    如果当前对象内部没有和类变量同名的实例变量,也可以直接写变量名访问,但这种方式可读性较差,不推荐在复杂代码中使用。

举个代码例子:

public class DemoClass {
    // 定义类变量(静态变量)
    public static String staticVar = "I'm a class-level variable";

    public void accessStaticVar() {
        // 方式1:类名.类变量名(推荐)
        System.out.println(DemoClass.staticVar);
        
        // 方式2:直接使用变量名(仅当无同名实例变量时可用)
        System.out.println(staticVar);
    }
}
问题2:类B内部访问类A的变量a

看你给出的代码,当前B的实例并没有持有A的引用,所以直接访问A的a变量是做不到的。解决思路是让B持有一个A的实例引用,具体有两种实现方式:

方式1:通过构造器传递A的实例

在创建B对象时,把A的当前实例(用this关键字)传入B的构造器,同时在B中保存这个引用:

public class A {
    int a = 20; // 包访问权限:同包下的B可以直接访问
    B b = new B(this); // 创建B时传入当前A的实例
}

public class B {
    private A aInstance; // 保存A的实例引用

    // 构造器接收A的实例
    public B(A aInstance) {
        this.aInstance = aInstance;
    }

    public void getAValue() {
        // 访问A的变量a
        System.out.println("A的a变量值:" + aInstance.a);
    }
}

方式2:通过Setter方法传递A的实例

如果不想在构造器中传递,也可以给B添加一个Setter方法,在A的构造器中完成引用传递:

public class A {
    int a = 20;
    B b = new B();

    public A() {
        b.setAInstance(this); // 调用Setter传入A的实例
    }
}

public class B {
    private A aInstance;

    // Setter方法
    public void setAInstance(A aInstance) {
        this.aInstance = aInstance;
    }

    public void getAValue() {
        if (aInstance != null) {
            System.out.println("A的a变量值:" + aInstance.a);
        }
    }
}

关于访问权限的补充

如果A和B不在同一个包下,默认的包访问权限(没有修饰符)的a变量是无法直接访问的,这时候有两种处理方式:

  1. 把a的权限改成public(不推荐,破坏封装性)
  2. 在A中添加一个getter方法,通过方法获取a的值(推荐)

示例代码:

public class A {
    private int a = 20; // 私有变量,封装起来
    B b = new B(this);

    // Getter方法
    public int getA() {
        return a;
    }
}

public class B {
    private A aInstance;

    public B(A aInstance) {
        this.aInstance = aInstance;
    }

    public void getAValue() {
        // 通过Getter方法访问
        System.out.println("A的a变量值:" + aInstance.getA());
    }
}

内容的提问来源于stack exchange,提问作者user8733070

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:55:52