超类'字段:私有+访问者与受保护

时间:2013-08-19 16:24:26

标签: java inheritance protected

Snippet#1:

public abstract class SuperClass {
    protected int i;   
}

public class SubClass extends SuperClass {
    public void method() {
        i = doAnythingWithI(i); // for example
    }
}

Snippet#2:

public abstract class SuperClass {
    private int i;    
    protected int getI() {
        return i;
    }    
    protected int setI(int i) {
        this.i = i;
    }
}

public class SubClass extends SuperClass {
    public void method() {
        setI(doAnythingWithI(getI())); // for example
    }
}

使用一个代码段而不是另一个代码段的原因是什么?最常用的处理方式是什么?

1 个答案:

答案 0 :(得分:1)

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

此外,我认为这个例子的琐碎本质仅仅是为了说明。有两个类“管理”单个原语'int'可能会被怀疑!

鉴于此,两个选择Snippet#2更接近正确。这是因为需要“类型”来封装状态,数据和行为。片段#1违反了这一点,通常会气馁。

方法“doAnythingWithI”虽然引起了讨论。在您的示例中并未真正声明它。如果它仅在“i”上运行并且不受具体类的改变,那么它也属于抽象基类。

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