3
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 long power(int m)
   {
      return m*m;
   }
   public long power(int m,int n)
   {
      long product=1;
      for(int i=1;i<=n;i++)
      {
          product=product*m;
      }
      return product;
   }
}

コンパイラはこのエラーを表示します:-

Function.java:5:非静的メソッドpower(int、int)は静的コンテキストから参照できません

[編集]

インデントについて申し訳ありません:/これからはそれを覚えておきます。

さて、静的キーワードを追加したところ、正常に機能しています。この静的キーワードはどのような違いをもたらしますか?私はJavaの初心者であり、staticが何をするかについてはまだ研究していません。私は確かに本のさらなる章でそれを読むでしょう、しかし誰かがそれが何をするかについて私に考えを教えてください。ありがとう。

4

7 に答える 7

9

エラーメッセージにあるように、静的メソッド( )は、オブジェクトインスタンスなしmainで非静的メソッド()を呼び出すことはできません。power

powerメソッドを静的にする必要があります。

説明

通常のクラスメソッドは、クラスのインスタンスに関連付けられています。
たとえば、String.startsWithメソッドはインスタンスでのみ呼び出すことができStringます。startsWith文字列インスタンスなしで呼び出すのは意味がありません。

クラスインスタンスを必要としないメソッドを作成したい場合があります。
たとえば、Integer.parseIntメソッドIntegerインスタンスで呼び出されません。Integerを呼び出すためだけにインスタンスを作成する必要はありませんInteger.parseInt
これらのメソッドはメソッドと呼ばれstaticます。

mainメソッドの例ですstaticFunctionクラスのインスタンスでは呼び出されないため、インスタンスメソッドを呼び出すことはできません。(それらを呼び出すインスタンスがないため)

于 2010-06-15T16:28:47.237 に答える
4

ショートカットの経験則 (完全な背景説明なし) は、静的メソッド/関数は非静的メソッド/関数を呼び出すことができないため、メイン関数から呼び出したいものはすべて、その前に static キーワードが必要です。

中心的な問題は、Java がオブジェクト指向言語であり、静的か非静的かを判断するには、オブジェクト指向に関するかなりの前提知識が必要であるということです。Java の欠点の 1 つは、初心者が学習するときにこのタイプのいくつかのフープをジャンプする必要があることです。これはすべて Java のオブジェクト指向の性質に由来し、OO を理解するとすべてがうまくいきます (言語設計者による決定は必ずしも最良のものではありませんが、論理的です)

static とは何かを説明しなければ、ひいきにならないと思います。これは特に難しい概念ではありませんが、オブジェクト指向の概念のいくつかの構成要素に依存しているだけであり、時期尚早に説明しようとすると (とにかく私が) 先延ばしにする可能性があると言えます。

于 2010-06-15T18:13:58.277 に答える
3
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));
}
于 2010-06-15T16:29:13.053 に答える
2

staticメソッド(main)からインスタンスメソッドを呼び出しています。powerメソッドを静的にするか、内部でクラスmainのインスタンスを作成してを呼び出す必要があります。FunctionFunction.power()

于 2010-06-15T16:29:47.593 に答える
2

それはまさにそれが言っていることです。

静的メソッドは、クラスのインスタンスを必要としません。あなたは単にすることができますMyClass.staticMethod()。非静的メソッド(またはインスタンスメソッド)は、クラスのインスタンスで動作します。それで:

MyClass myClass = new MyClass();
myClass.instanceMethod();

非静的メソッドは実際には存在しないため、呼び出すことはできません。非静的メソッドは、それが属するクラスのインスタンスのコンテキストで呼び出された場合にのみ存在します。

解決策はpower、静的メソッドを作成することです。

于 2010-06-15T16:31:43.547 に答える
2

これは、初心者にとって一般的な混乱の原因です。メソッドがパブリックであり、メソッドと同じクラスにあるからmainといって、いつでも呼び出すことができるとは限りません。main()は静的メソッドであるため、メソッドを呼び出すオブジェクトはありません。

2つの異なる方法で修正できます。

  1. 両方のpower方法を作成しますstatic。これは、非常に小さなプログラムの最も簡単な方法です。

    staticつまり、メソッドを呼び出すためにオブジェクトを作成する必要はありません。別のクラスから静的メソッドを呼び出す場合は、のようMath.function(x)になりますが、これらの静的メソッドは同じクラスにあるため、のようになりfunction(x)ます。

  2. クラスのオブジェクトを作成し、そのオブジェクトのメソッドFunctionを呼び出します。powerこれは、大規模なプログラムで通常行うことですが、ここでは実際には意味がありません。

    参考までに、これは次のようになります。

    Function f = new Function();
    
    System.out.println(f.power(3,2));
    System.out.println(f.power(3,2));
    System.out.println(f.power(2));
    
于 2010-06-15T16:33:04.917 に答える
1

したがって、明確にするために、これを解決する別の方法は、メソッドを静的としてマークすることです(mainのように、静的メソッドから非静的メソッドを呼び出すことはできませんが、非静的メソッドから静的メソッドを呼び出すことはできます)方法):

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;
   }
}
于 2010-06-15T21:19:27.383 に答える