Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.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 我们可以把getter和setter放在抽象类中吗。。?_Java - Fatal编程技术网

Java 我们可以把getter和setter放在抽象类中吗。。?

Java 我们可以把getter和setter放在抽象类中吗。。?,java,Java,简单的回答是:是的: public abstract ClassName { // methods // setters & getters...??? } 更详细的回答(我不确定现在是否适合您): 您应该意识到这些方法(如果它们不是用finalmodifier声明的)可以在子类中重写。这就是为什么考虑方法合同并仔细记录它们很重要的原因。如果抽象类的一个方法调用了另一个its方法,那么这个事实也应该被记录下来 抽象类的所有受保护和公共方法(以及常量,在极少数情况下是受保护的字段

简单的回答是:是的:

public abstract ClassName
{

 // methods
 // setters & getters...???

}
更详细的回答(我不确定现在是否适合您):

您应该意识到这些方法(如果它们不是用
final
modifier声明的)可以在子类中重写。这就是为什么考虑方法合同并仔细记录它们很重要的原因。如果抽象类的一个方法调用了另一个its方法,那么这个事实也应该被记录下来

抽象类的所有受保护和公共方法(以及常量,在极少数情况下是受保护的字段)都将成为API的一部分。因此,其他开发人员可以使用它们,而更改它们并不容易

关于最佳做法:

1) 在使类可序列化之前,请三思——这将使所有子类也可序列化,并且(如果您希望生成不可能损坏的程序),您应该关心任何子类的可能序列化

2) 实现
Cloneable
也是如此(最好不要在顶级抽象类中实现它)

3) 您应该提供正确的
equals
hashCode
实现,同时考虑到可以将2个子类与抽象类的实现进行比较


4) 考虑提供自然排序(即实现
compariable
接口)。如果存在真正的自然顺序,这通常是一个好主意

当然,实现抽象类型修饰符getter()会导致编译错误

你要花30秒才能找到答案。要么编译,要么不编译。谢谢Oded,我是个初学者,你得放轻松;)@W M-只是懒得问这样的问题而不是去尝试。你有一个编译器——如果你想知道这样的事情是否可行,试试吧。如果它无效,编译器将进行投诉。如果你能更快,你会在这个过程中学到一些东西。只是好奇,应该这样做吗?我是说,有什么java最佳实践吗?当然,为什么没有?字段属于类名称。事实上,因为它是私人的,所以它是唯一可能成为一个能手/二传手的地方。你没有理由不这样做。抽象类只是一个类,其中一些行为被推迟到具体的子类实现。但是,类的其他方面(例如某些属性)仍然可以合法地定义(使用适当的getter和setter)。关于实例变量是否应该在超类中保持私有的问题可能有争议——我更喜欢的风格是使它们受到保护,并在子类中直接访问它们。我的理由是,如果超类需要重构,子类可能也需要重构。
public abstract class ClassName {
    private String field;

    public String getString() {
        return field;
    }

    public void setString(String field) {
        this.field = field;
    }
}