首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当变量在超类中受到保护时,子类如何使其成为私有变量?

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

Stack Overflow用户
提问于 2013-12-30 10:57:12
回答 3查看 202关注 0票数 2

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

代码语言:javascript
复制
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;
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-30 11:00:50

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

代码语言:javascript
复制
this.name

代码语言:javascript
复制
((Creature)this).name
票数 8
EN

Stack Overflow用户

发布于 2013-12-30 11:01:49

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

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

这只是为了混淆您可以使用的people.Though,您应该避免使用同名的父/子变量。

票数 3
EN

Stack Overflow用户

发布于 2013-12-30 12:10:27

您的程序还可以理解为:name属性的creaturegiraffename属性不同。只是他们的拼写一样而已!

好吧,你的例子也指出了数据隐藏的某些细节。

派生类成员名称的任何使用都将始终引用定义为派生类的一部分的成员。要引用基类成员,必须使用关键字Super对其进行限定。

代码语言:javascript
复制
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();

}

}

代码语言:javascript
复制
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

Derived String: Hello Derived

Derived String: Hello Derived

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20838106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档