Java初学者问题:下面的代码有什么问题? 公共类函数 { 公共静态void main(字符串参数[]) { 系统输出println(功率(3,2)); 系统输出println(功率(3,2)); 系统输出打印LN(电源(2)); } 公共长功率(int m) { 返回m*m; } 公共长功率(整数m,整数n) { 长积=1; 对于(inti=1;i
,如错误消息所述,静态方法(Java初学者问题:下面的代码有什么问题? 公共类函数 { 公共静态void main(字符串参数[]) { 系统输出println(功率(3,2)); 系统输出println(功率(3,2)); 系统输出打印LN(电源(2)); } 公共长功率(int m) { 返回m*m; } 公共长功率(整数m,整数n) { 长积=1; 对于(inti=1;i,java,non-static,Java,Non Static,,如错误消息所述,静态方法(main)不能在没有对象实例的情况下调用非静态方法(power) 您应该将power方法设置为静态 解释 普通类方法与类的实例相关联。 例如,只能在String实例上调用。在没有String实例的情况下调用startsWith是没有意义的 有时,您会希望创建一个不需要类实例的方法。 例如,不会对Integer实例调用。仅仅为了调用Integer.parseInt而必须创建Integer实例是没有意义的 这些方法称为static方法 main是static方法的一个示例
main
)不能在没有对象实例的情况下调用非静态方法(power
)
您应该将power
方法设置为静态
解释
普通类方法与类的实例相关联。例如,只能在
String
实例上调用。在没有String实例的情况下调用startsWith
是没有意义的
有时,您会希望创建一个不需要类实例的方法。例如,不会对
Integer
实例调用。仅仅为了调用Integer.parseInt
而必须创建
Integer
实例是没有意义的
这些方法称为static
方法
main
是static
方法的一个示例。由于它不是在函数的实例上调用的,所以它不能调用实例方法。(因为没有实例可以调用它们)您是从static
方法(main)调用实例方法的。您需要将您的power
方法设置为静态,或者在main
中,创建函数的一个实例
类并调用函数。power()
这正是它所说的
静态方法不需要类的实例。您只需执行MyClass.staticMethod()
。非静态方法(或实例方法)操作类的实例。因此:
public static void main(String args[])
{
// Create an object
Function f = new Function( );
System.out.println(f.power(3,2));
System.out.println(f.power(3,2));
System.out.println(f.power(2));
}
无法调用非静态方法,因为它实际上不存在。非静态方法仅在其所属类的实例上下文中被调用时才存在
您的解决方案是使power
成为一个静态方法。这是初学者常见的困惑来源。仅仅因为一个方法是公共的,并且与main
方法在同一个类中,并不意味着您可以随时调用它。因为main()
是一个静态方法,它没有可调用方法的对象
您可以通过两种不同的方式进行更正:
使两种power
方法static
。对于非常小的程序,这是最简单的方法
static
的意思是不必构造对象来调用方法。如果从另一个类调用静态方法,它看起来像Math.function(x)
,但由于这些静态方法在同一个类中,所以看起来就像function(x)
创建函数
类的对象,并在其上调用power
方法。对于较大的程序,通常会这样做,但在这里它没有真正的意义
作为参考,这看起来像:
MyClass myClass = new MyClass();
myClass.instanceMethod();
一个快捷的经验法则(没有完整的背景说明)是静态方法/函数不能调用非静态方法/函数,因此您想从主函数调用的任何东西都需要在它前面有static关键字
核心问题是Java是一种面向对象的语言,静态与非静态需要相当多的面向对象的先决知识。Java的缺点之一是,它确实需要初学者在学习时跳过一些这类知识,这一切都源于Java和o的面向对象本质一旦你理解了OO,一切都会就绪(语言设计者做出的决定不一定是最好的,但它们是合乎逻辑的)
如果我不去解释什么是静态的话,我希望你不会觉得这很高人一等。我可以告诉你,这不是一个特别困难的概念,但它只是依赖于一些OO概念的构建块和一次过早的解释尝试(无论如何,是我做的)可能会让您感到厌烦。因此,需要明确的是,另一种解决方法是将方法标记为静态(请记住,您不能从静态方法调用非静态方法,如main,但可以从非静态方法调用静态方法):
公共类函数
{
公共静态void main(字符串参数[])
{
系统输出println(功率(3,2));
系统输出println(功率(3,2));
系统输出打印LN(电源(2));
}
公共静态长功率(int m)
{
返回m*m;
}
公共静态长功率(int m,int n)
{
长积=1;
对于(int i=1;i这就是问题所在。没有正确的缩进!另一点……这不是错误,但编码String[]args
比编码String[]
更容易接受(尽管它们实际上是相同的)…@froadie:你会接受字符串…args
?我相信,通过解释静态调用和非静态调用以及它们不兼容的原因,操作会更好。哦,有一个名为function的类?这是新的和有趣的。让我查一下!是的,在操作中。
MyClass myClass = new MyClass();
myClass.instanceMethod();
Function f = new Function();
System.out.println(f.power(3,2));
System.out.println(f.power(3,2));
System.out.println(f.power(2));
public class Function
{
public static void main(String args[])
{
System.out.println(power(3,2));
System.out.println(power(3,2));
System.out.println(power(2));
}
public static long power(int m)
{
return m*m;
}
public static long power(int m,int n)
{
long product=1;
for(int i=1;i<=n;i++)
{
product=product*m;
}
return product;
}
}