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变量是无法直接访问的,这时候有两种处理方式:
- 把
a的权限改成public(不推荐,破坏封装性) - 在
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
相关产品推荐
相关产品推荐

