当子类在超类中受到保护时,子类如何使变量成为私有的?

时间:2013-12-30 10:57:13

标签: java inheritance

在超类中受保护的变量'私有化'子类的目的是什么? 例如: -

abstract public class Creature{
    protected String name;

    abstract public String getName();
    abstract public void setName(String newName);
}


public class Girafee extends Creature {

    private String name;

    public Girafee() {

    }

    @Override
    public String getName() {

        return this.name;
    }

    @Override
    public void setName(String newName) {

        this.name = newName;
    }
}

3 个答案:

答案 0 :(得分:8)

您没有将变量私有化;您创建了具有相同名称的子类自己的变量。现在,您的类有两个具有相同简单名称的变量,并且都可以访问:

this.name

VS

((Creature)this).name

答案 1 :(得分:3)

他们都是完全不同的实例成员。

根据代码中的定义,您可以访问子类中的超类变量,并防止子类变量从其类的外部访问。

这只会让人感到困惑。尽管你可以,但你应该避免使用同名的父/子变量。

答案 2 :(得分:3)

您的程序也可以理解为:name的{​​{1}}属性与creature的{​​{1}}属性不同。只是他们有相同的拼写!

嗯,你的例子也指出了数据隐藏的某些细节 对派生类成员名称的任何使用将始终引用定义为派生类的一部分的成员。要引用基类成员,必须使用关键字super。

对其进行限定
name

}

giraffe

}

计划的输出:
public class Base { protected String s = "Hello Base"; public void get() { System.out.println("Base string:" + s); } public static void main(String[] args) { Base b = new Base(); b.get(); Derived d = new Derived(); d.get(); ((Base) d).get(); Base der = new Derived(); der.get(); }
class Derived extends Base { protected String s = "Hello Derived"; @Override public void get() { System.out.println("Derived String: " + s); }
Base string:Hello Base
Derived String: Hello Derived