我不是java和C#的新手。我以为我理解变量范围的概念,直到最近我在一次采访中被问到这个问题:
public class Q{ //starting y scope
static int x = 11;
private int y = 33; // Just added a “private” modifier to make it clearer.
public static void main(String args[]){
Q q = new Q();
q.call(5);
}
public void call(int x){
Q q = new Q();
this.x = 22;
y = 44;
System.out.println("Output: " + Q.x);
System.out.println("Output: " + q.x);
System.out.println("Output: " + q.y);
}
} //ending y scope
定义该程序的输出。
我在采访中回答了这个问题,即输出是一个运行时异常。根据我的理解,y被声明为private,而实例方法call()正试图访问另一个Q类实例的实例私有变量y。怎么会发生这种情况!?然而,错误地回答这个问题并没有太多影响我的采访,因为这是一种“棘手的基本”问题。但是,错误地回答意味着我多年的Java经验需要康复,这太可怕了!
有人可以帮我解决这个问题吗?我将非常感激!
答案 0 :(得分:24)
您可以访问自己班级的private
个成员,即使是来自该班级的其他实例。
答案 1 :(得分:8)
private
只是意味着另一个类的对象无法访问它,而不是任何其他对象。因此,一个Q
对象可以访问另一个Q
对象的私有成员。
[请注意,如果这是非法的,这将触发编译器错误,而不是运行时异常。]
答案 2 :(得分:6)
可以在声明类的程序文本中访问私有变量。只要代码在同一个类中,一个实例尝试访问另一个实例中的变量并不重要。
否则,如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问。
答案 3 :(得分:3)
private
表示此类之外的类无法看到该变量。在此类定义中,可以访问所有方法和变量。
答案 4 :(得分:3)
访问限制应该在编译时强制执行而不是在运行时,因此编译器应该防止编译错误。
但是在类级别上应用了访问修饰符,因此您始终可以从类中访问私有成员。
当您克隆对象时,这通常很有用,因为您可以直接在克隆中设置一堆值,否则可能很难访问。此外,在使用Equals方法比较对象时,可能非常方便的是,类不是定义访问限制的实例。
答案 5 :(得分:3)
正如已经指出的那样,其他实例的私有成员可以从课程中访问。此外,您对运行时异常不正确:即使您修改代码以便尝试访问另一个类的私有成员也不会有运行时异常,代码将无法编译。
答案 6 :(得分:2)
我认为会出现编译问题,因为属性static int x = 11
被声明为静态,而在方法call
中,变量x由this
访问。您不能在类中为{1}}设置静态变量。
私人会员this
没有问题。
答案 7 :(得分:2)
正确的“采访”答案是,编写这样的代码的人应该被解雇!糟糕的班级名称,关于y范围的无用评论;非标准使用“this”,它实际上只应用于实例变量,而不是类变量;在main和call方法中重用'q'。
它让我想起了混淆的C ++竞赛,正是那种无意义的Java旨在避免的。
但是,更糟糕的是,从评论和答案中可以很难说出该计划的输出应该是什么。我是否按照Kevin的评论“6”去了?我希望管理员能够重构这一切。我会告诉面试官(如果这确实是一个面试问题,我怀疑)我们应该运行代码,得到答案,然后创建一个简单的测试,以确认当我们重构代码时答案不会改变符合标准用法。