Java 封装问题
我现在正在进行一项计算机科学研究,我对这个问题有了一个有趣的答案。显然答案是E,但由于封装的原因,我不同意。为什么答案是E而不是C 一类粒子有一个私人场,双速度场和公共场 方法双getVelocity()和void setVelocity(双v)。它也 有一个方法public void hit(Particle p){Java 封装问题,java,encapsulation,Java,Encapsulation,我现在正在进行一项计算机科学研究,我对这个问题有了一个有趣的答案。显然答案是E,但由于封装的原因,我不同意。为什么答案是E而不是C 一类粒子有一个私人场,双速度场和公共场 方法双getVelocity()和void setVelocity(双v)。它也 有一个方法public void hit(Particle p){} 以下哪项可以替换hit to中的 让它编译时没有错误 一, 二, double v = velocity; velocity = p.getVelocity();
double v = velocity;
velocity = p.getVelocity();
p.setVelocity(v);
三,
double v = velocity;
velocity = p.velocity();
p.velocity = v;
我只是
B.仅限II类
C.I和II
D.二和三
EI、II和III封装是一个重要的工具,它允许类成为唯一负责其实例状态的类。但是,由于这是一个粒子操纵同一类的另一个实例的字段,因此它可以访问另一个实例的所有方法和字段(包括
private
方法和字段),关于封装的典型问题不适用
类似的情况出现在equals
方法实现中,其中一个类的实例通常直接将其字段与同一个类的另一个实例的字段进行比较
(这假设III中对
velocity()
的引用是指getVelocity()
;否则,它可能是一个编译错误。)尽管根据规范,字段velocity
被封装并声明为private
,但它是在Particle
类中声明的。这意味着Particle
类中声明的任何方法都可以访问此值。只有Particle
和其他类的子类不能访问此变量,但是hit()
肯定可以直接访问此变量
即使是
Particle
类的不同对象也可以访问其他private
成员。III中的代码无法编译,没有为Particle
类描述的velocity()
方法。@Luiggi这是真的,但我将其归因于转录错误。OP特别指的是封装冲突,而不是缺少符号。假设这是一个打字错误,那么你是对的。如果III中的代码是p.getVelocity()
而不是p.velocity()
,那么它就是正确的。如果是打字错误,请修复它。否则,你是对的,C是正确的答案。
double v = velocity;
velocity = p.velocity();
p.velocity = v;