如何在整个包中访问字段?目前,即使它们被声明为public,我也无法访问同一包中另一个类的字段。
答案 0 :(得分:0)
以下代码应该编译。第二类可以访问第一类中的字段。如果有差异,请检查一下。
package one;
public class A {
public int fieldA;
}
package two;
import one.A;
public class B {
private A a;
public int getA() {
return a.fieldA;
}
}
答案 1 :(得分:0)
这是一个更恰当的例子。 (根据@ Andreas_D的例子......好像不是很明显!)
请注意,引用同一个包中声明的类需要不。
package pkg;
public class One {
public int fieldOne;
}
package pkg;
public class Two {
private One one;
public int getOne() {
return one.fieldOne;
}
}
话虽如此,引用另一个类中声明的公共属性通常是个坏主意。最好将属性声明为private,并通过getter和setter方法访问它们。 (如果属性是公开的,并且它们不是最终的,那么任何东西都可以修改它们。此外,子类无法隐藏属性或改变它们的行为方式。)
修改强>
说明最后一点:
public class A {
public int counter;
private int counter2;
public int getCounter2() { return counter2; }
public void setCounter2(int c) { counter2 = c; }
}
public class B extends A {
public void setCounter2(int c) {
if (c < 0) throw new IllegalArgumentException("counter2 cannot be negative");
super.setCounter2(c);
}
}
比较counter
和counter2
属性的行为方式。在counter
的情况下,任何类中的任何代码都可以无限制地读取或更新属性。这适用于类A
的实例和任何扩展A
的类。如果其他一些类决定将counter
设置为错误值......那么就没有什么可以阻止它了。
对于counter2
,A
实例的属性只能分别由getCounter2
和setCounter2
方法读取或更新。如果我愿意,我可以在A
中更改这些方法以进行验证,执行访问检查,通知某些侦听器状态更改等等。而且因为这种行为只能在A
的方法中发生,所以我知道在发生奇怪事件时从哪里开始查看。
如果我定义了A
的子类(例如B
),我可以覆盖其中一种或两种方法做不同的事情。但请注意,由于我决定将实际属性声明为private
,因此B中的setCounter2
方法仍然必须在其超类中调用该方法。这也很好。