我有一个代码如下:
public class Clase {
public void hazAlgo(String s) {
/* implementación */
}
}
我现在正在创建一个静态方法Clase
来验证字符串不包含任何尾随空格。如果你有它们,你应该清理它们。除此之外,必须使用该方法hazAlgo
。所以,我有这样的代码:
public class Clase {
public void hazAlgo(String s) {
/* implementación */
}
public static String limpiaCadena(String s) {
s = (s == null) ? "" : s.trim();
hazAlgo(s);
}
}
此代码在编译时给我以下错误消息:
$ javac Clase.java
Clase.java:8: error: non-static method hazAlgo(String) cannot be referenced from a static context
hazAlgo(s);
^
1 error
我究竟做错了什么?
问题在于理解
static
. 通过修饰符声明为静态的元素(属性或方法)static
可以理解为属于类而不属于类实例的元素。换句话说,静态元素对于加载到内存中的类来说是全局的。下面是一个使用静态方法的例子:由于这些元素属于类而不属于实例,因此您不能使用实例元素来处理静态元素。这是什么意思?不能从静态方法调用非静态属性或方法。让我们回顾一下方法:
如何解决问题?
最简单的解决方案是不直接在静态方法中使用属性和非静态方法。这简直是个错误。如果您遇到“需要”在静态方法中调用非静态属性或方法的情况,我告诉您您犯了一个严重的设计错误。发出警告。
一个“简单”的解决方案是将非静态方法改为静态,但你必须了解更改的含义(如果你不理解含义,请从答案的开头重新阅读)。
这个问题有替代方案:
在静态方法中创建类实例:
只有在类不维护状态时才使用它。但是,这是一个奇怪的设计,不推荐。
将类声明为静态方法的参数:
这是一个更好的替代方案,设计更简洁,但您将需要更多代码。
或者只是调用这样的方法:
获取您发布的代码,它将是这样的:
我认为这也可能有效: https ://docs.google.com/document/d/1oKikiQtWVeFpkrhLrSceermh54-K14oSOYp29WLCHXc/edit?usp=sharing
要将其放入代码而不是图像中,它将是:
之前(有错误)
之后(没有错误):