Java 超类&x27;字段:private+;访问者与受保护者

Java 超类&x27;字段:private+;访问者与受保护者,java,inheritance,protected,Java,Inheritance,Protected,片段#1: 公共抽象类超类{ 受保护的int i; } 公共类子类扩展了超类{ 公开作废法(){ i=doAnythingWithI(i);//例如 } } 片段#2: 公共抽象类超类{ 私人互联网i; 受保护的int getI(){ 返回i; } 受保护的整数集(整数集){ 这个。i=i; } } 公共类子类扩展了超类{ 公开作废法(){ setI(doAnythingWithI(getI());//例如 } } 为什么要使用一个片段而不是另一个片段?最常见的处理方法是什么?抽象类

片段#1:

公共抽象类超类{
受保护的int i;
}
公共类子类扩展了超类{
公开作废法(){
i=doAnythingWithI(i);//例如
}
}
片段#2:

公共抽象类超类{
私人互联网i;
受保护的int getI(){
返回i;
}    
受保护的整数集(整数集){
这个。i=i;
}
}
公共类子类扩展了超类{
公开作废法(){
setI(doAnythingWithI(getI());//例如
}
}

为什么要使用一个片段而不是另一个片段?最常见的处理方法是什么?

抽象类的一个更常见的用途是拥有抽象方法,这些方法不是在抽象类中实现的,而是在java程序的子类中实现的。这显然不是您的用例。但是,抽象类也可以用作阻止某人实例化应该首先扩展的类的方法。我想这是你的愿望

此外,我假设示例的琐碎本质只是为了说明。如果有两个类来“管理”单个原语“int”,则很可能会受到怀疑

考虑到这一点和两个选择,代码片段#2更接近正确。这是因为“类型”希望封装状态、数据和行为。代码片段#1违反了这一点,通常会被劝阻

不过,“doAnythingWithI”方法值得讨论。在您的示例中并没有真正声明它。如果它只对“i”进行操作,并且不受具体类的更改,那么它也属于抽象基类


如果它可以随扩展超类的多个实现而变化,那么它可能应该被定义为超类中的一个抽象方法,并由子类实现。

我认为您最有可能使用前一个代码段而不是后一个代码段。正确封装
i
是没有意义的,因为你甚至没有用set方法执行任何操作,所以你只是在堆栈上添加了更多的东西,可能会减慢你的程序。在第一个代码段中,超类和子类紧密耦合,这让我怀疑,为什么要引入
子类
。在第二个代码片段中,
i
字段被
get/set
对完全公开,它再次将
子类
与其父类紧密耦合。这再次提出了同样的问题:为什么要引入
子类
。此外,代码段看起来像是要使用继承来实现,但您更应该将其用于行为as,而不是实现as。