我现在正在通过计算机科学研究工作,我遇到了一个有趣的答案。显然答案是E,但由于封装,我不同意。答案是E而不是C的任何理由?
类Particle具有私有字段double velocity和public 方法double getVelocity()和void setVelocity(double v)。它也是 有一个方法public void hit(Particle p){<缺少陈述> }
以下哪项可替代<缺少陈述>在击中 让它编译没有错误?
我
double v = getVelocity();
setVelocity(p.getVelocity());
p.setVelocity(v);
II。
double v = velocity;
velocity = p.getVelocity();
p.setVelocity(v);
III。
double v = velocity;
velocity = p.velocity();
p.velocity = v;
一个。我只是
B中。仅限II
℃。我和我
d。 II和III
E I,II和III
答案 0 :(得分:2)
封装是一个重要的工具,允许类成为唯一一个负责其实例状态的类。但是,因为这是一个粒子操纵同一个类的另一个实例的字段,所以它可以访问其他实例的所有方法和字段(包括private
方法和字段),并且关于封装的典型问题不会应用
类似的情况发生在equals
方法实现中,其中类的实例通常直接将其字段与同一类的另一个实例的字段进行比较。
(这假设在III中对velocity()
的引用是getVelocity()
;否则,它可能是编译错误。)
答案 1 :(得分:1)
虽然字段velocity
是按照规范封装并声明private
的,但它是在Particle
类中声明的。这意味着在Particle
类中声明的任何方法都可以访问此值。它只是Particle
的子类和其他没有访问此变量的类,但hit()
肯定可以直接访问变量。
即使Particle
类的不同对象也可以访问其他private
成员。