【问题标题】:How do I call methods within a constructor?如何在构造函数中调用方法?
【发布时间】:2014-10-19 08:39:09
【问题描述】:

下面是我的 Range 类代码的一部分,以及一个名为 Tree 的单独类中的构造函数。在这个构造函数中,我试图将类范围中的对象实例化到我的树类中。当我尝试在树类中编译我的构造函数时,它说我试图调用的方法不能从静态上下文中引用。我会以正确的方式解决这个问题吗?我很确定这是一个很容易解决的问题,但我无法弄清楚。谢谢

public class Range{
    int low, high;

    public Range(int plow, int phigh){
        low = plow;
        high = phigh;
    }

    public int getLow(){
        return low;
    }

    public int getHigh(){
        return high;
    }

public class Tree {
String name;

    public  Tree(String pname, int plow, int phigh) {
        name = pname;
        Range.getHigh() = phigh; <---where error message is
        Range.getLow() = plow;
    }
}

【问题讨论】:

  • 你打算使用什么语言?
  • 在这种情况下,您将使用 setter,而不是 getter。或者,更好的是,您已经拥有的构造函数。
  • 使用setter设置Low()和High(),在构造函数中调用
  • 对不起,这是java忘了说,非常感谢大家的帮助

标签: java class methods constructor


【解决方案1】:

您的代码有两个问题:首先,getLow()getHigh()instance 方法,而不是类方法。但是,您通过Range.getLow()Range.getHigh() 调用它们,这意味着您在类Range 上调用它们。这是不允许的。首先你必须创建一个类的实例:

ran = new Range(...)

然后你调用这个实例的方法:

ran.getHigh();
ran.getLow();

您的代码的另一个问题是您试图将值分配给方法调用:

Range.getHigh() = phigh;

这在 Java 中是不可能的。 Java 方法返回值并且您不能分配给值。也就是说,getHigh()getLow() 方法旨在读取范围的高值和低值,而不是设置它们。对于Range 类,只能通过调用构造函数来设置这些值。

您可能想要做的是将Range 类型的成员变量添加到Tree 类,然后在构造函数中设置该变量:

ran = new Range(plow, phigh);

【讨论】:

  • 非常好的答案,并且还专注于他首先尝试做的事情,而不是让一切都静止。 +1
  • 所以我会通过 run = new Range(...) 调用 Range 类,括号中会写什么? =s 并且这将在所有方法之外调用正确吗?
  • 在括号内为构造函数编写参数。在这种情况下,有两个参数,因此您可以像在答案的最后一行那样称呼它。您必须声明实例变量ran“在所有方法之外”(Range ran;); Range 构造函数你必须从构造函数中调用,因为在构造函数之外你无权访问 plowphigh
【解决方案2】:

你必须先创建一个范围对象,然后才能调用它的方法

public  Tree(String pname, int plow, int phigh){
        name = pname;
        Range ran = new Range(phigh, plow);

    }

【讨论】:

  • 这不能回答问题
  • 它甚至无法编译。
  • 编辑没有改善。构造函数退出时局部变量ran丢失。
【解决方案3】:

使用setter设置变量

public class Range{
static int low, high;

public Range(int plow, int phigh){
    low = plow;
    high = phigh;
}

public static int getLow(){
    return low;
}

public static int getHigh(){
    return high;
}

public static void setLow(int low) {
    Range.low = low;
}

public static void setHigh(int high) {
    Range.high = high;
}

然后调用静态方法设置值或获取

public class Tree{
String name;

public  Tree(String pname, int plow, int phigh){
    name = pname;
    Range.setHigh(phigh); //---where error message is
    Range.setLow(plow);
}

}

【讨论】:

  • Range 的成员为什么会是静态的?
  • 只是设置值而不启动...如果它是非静态方法..那么我们必须创建 Range 的对象...并做同样的事情
  • 那么你真正的答案是什么?
  • 你为什么更喜欢静态变量?那是我最初的问题。这意味着所有范围和树都具有相同的值。编码方便并不是一个充分的答案。这根本不是一个随机选择“无论哪种方式的人”。
猜你喜欢
  • 2014-02-17
  • 1970-01-01
  • 2011-06-19
  • 2015-10-01
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多