Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在继承中实现封装_Java_Encapsulation - Fatal编程技术网

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方法呢?