Java 如何在继承中实现封装
我有两个类Java 如何在继承中实现封装,java,encapsulation,Java,Encapsulation,我有两个类Test和Encap。我有一个私有变量a,并通过setter和getter方法进行访问。我用Encap继承了类Test 现在我可以使用setValue(inta)更改a的值。我想限制这种选择。我希望它成为只读值。请在这方面帮助我 class Test { private int a; protected void setValue(int a) { this.a = a; } protected void getValue()
Test
和Encap
。我有一个私有变量a
,并通过setter和getter方法进行访问。我用Encap
继承了类Test
现在我可以使用setValue(inta)
更改a
的值。我想限制这种选择。我希望它成为只读值。请在这方面帮助我
class Test
{
private int a;
protected void setValue(int a)
{
this.a = a;
}
protected void getValue()
{
System.out.println("The assigned value of a is : "+this.a);
}
}
public class Encap extends Test {
public static void main(String [] args)
{
Test t = new Test();
t.setValue(4);
t.getValue();
Encap e = new Encap();
e.setValue(3);
e.getValue();
}
}
一个选项是从类
Test
中删除方法setValue()
:
class Test
{
private int a;
protected void getValue()
{
System.out.println("The assigned value of a is : "+this.a);
}
}
编辑:
为什么要这样做?如果Encap
继承自Test
,它应该能够执行与Test
相同的操作。否则,继承的目的是什么?如果您仍然认为Test
应该能够修改值,而Encap
不能修改值,那么您的设计可能是错误的。您可以尝试以下方式:
BaseClass
---------
+getValue
/ \
/ \
Test Encap
-------- ---------
+setValue
如果您的意思是希望派生类不公开超类的公共方法,那么您的代码可能“有味道”
请记住,继承模型“是一个”
因此,在您的示例中,Encap是一个测试,您应该能够对Encap执行对测试可以执行的任何操作
但是,如果您只是必须从不想公开父类方法的类继承,则可以重写该方法并使其主体不做任何操作。但对于简单的getter和setter访问器方法,这可能会使代码的客户端非常困惑
如果您无法协调事情,并且在Encap上调用setValue()从来都不是正确的做法,那么我建议重写该方法,对其进行大量注释并使其不执行任何操作,或者抛出异常以向客户机表明他们正在做一些没有意义的事情 再明显不过了+1不清楚你在问什么。如果您想要只读值,那么为什么不删除setValue方法呢?