【问题标题】:Inheritance and private variables in JavaJava中的继承和私有变量
【发布时间】:2015-09-14 04:09:12
【问题描述】:

我正在尝试向 android 中的 Chronometer 类添加一个方法。它将开始时间存储在此变量中:

private long mBase;

所以我认为我可以做到这一点

public class MyChronometer extends Chronometer{

    public void reset(){
        long now = SystemClock.elapsedRealtime();
        this.mBase = now;
    }
}

但 Android Studio 告诉我找不到 mBase。为什么是这样?我做错了什么?根据我对 Java 继承的理解,如果我扩展一个类,那么我就拥有了我扩展的类的所有方法和变量,然后我可以添加到这些方法和变量中。这是不正确的吗?这不包括mBase 变量,即使它是私有的?

编辑:本质上我正在尝试为mBase创建一个setter函数

【问题讨论】:

  • 我认为这只是它的受保护和公共成员,而不是私有成员。
  • " 如果我​​扩展一个类,那么我拥有我扩展的类的所有方法和变量" 实例有它们,但你的派生类代码无法访问私人的,只有公共的和受保护的。 (顺便说一句,它们是“字段”,而不是“变量”。)
  • 如果你能做到这一点,private 将毫无意义!

标签: java android inheritance private chronometer


【解决方案1】:

我引用tutorial - Private Members in a Superclass

子类不继承其父类的private 成员。但是,如果超类具有用于访问其private 字段的publicprotected 方法,则子类也可以使用这些方法。

意味着您不能直接访问private 字段,但您可以使用允许您访问它们的方法。这个table 也可能会有所帮助:

                  Access Levels
------------+---------+---------+-----------+------
Modifier    |   Class | Package |  Subclass | World
------------+---------+---------+-----------+------
public      |     Y   |    Y    |     Y     |   Y
protected   |     Y   |    Y    |     Y     |   N
no modifier |     Y   |    Y    |     N     |   N
private     |     Y   |    N    |     N     |   N

【讨论】:

  • 我应该怎么做才能为私有变量添加一个setter?创建要使用的新变量?我想我可以从原始课程中复制粘贴并添加我想要的内容,但这感觉有点不对。
  • 没有。您创建一个简单地返回该字段的受保护或公共方法。
  • 这就是我正在尝试的,但我得到了一个错误,这就是我问这个问题的原因。如果我完全引用这个变量,就像我创建一个公共设置器一样,它不会编译,因为它不知道 mBuilder 是什么。
  • 如果它是私有的,那么它是有原因的,可能作者不想让你访问它。你可以使用反射或者要求作者更改修饰符:)
【解决方案2】:

您需要使用getters 来访问父类的私有字段。

这些方法通常只用于返回私有值。

settergetter的代码示例:

参考链接:http://docs.oracle.com/javaee/6/tutorial/doc/gjbbp.html

public class Printer {

    @Inject @Informal Greeting greeting;

    private String name;
    private String salutation;

    public void createSalutation() {
        this.salutation = greeting.greet(name);
    }

    public String getSalutation() {
        return salutation;
    }

    public void setName(String name) {
       this.name = name;
    }

    public String getName() {
       return name;
    }
}

【讨论】:

  • 我明白这一点,我想做的是添加一个setter方法。如果原来的课程没有配备,我该怎么办?
猜你喜欢
  • 2018-09-19
  • 2014-04-06
  • 2014-11-17
  • 2012-09-27
  • 2012-12-03
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 2011-04-06
相关资源
最近更新 更多