2011-01-23 7 views
4

おはよう!初級Java - 静的エラー

私はJavaの初心者です。

public class Test { 
public static void main (String [] args){ 
    int a = calcArea(7, 12); 
    System.out.println(a); 
} 

int calcArea(int height, int width) { 
    return height * width; 
} 
} 

次のエラーが表示されます:

Non-static method calcArea(int, int) cannot be referenced from static content

それが何を意味し、私は次のコードをコンパイルすることはできませんか?どのように私はその問題を解決することができます..?

あなたの返信は高く評価されます。あなたのアドバイスから

をベースに はありがとう、私は新しいテストでインスタンスを作った()を次のように

public class Test { 
    int num; 
    public static void main (String [] args){ 
     Test a = new Test(); 
     a.num = a.calcArea(7, 12); 
     System.out.println(a.num); 
    } 

    int calcArea(int height, int width) { 
      return height * width; 
    } 

} 

はこの正しいですか?私はこれを行う場合の違いは何です...

public class Test { 
public static void main (String [] args){ 
    int a = calcArea(7, 12); 
    System.out.println(a); 
} 

static int calcArea(int height, int width) { 
    return height * width; 
} 
} 
+0

編集に関して: 'calcArea'は最初にオブジェクトに対して呼び出されるインスタンスメソッドであり、(一般的に)そのオブジェクトに関連するアクションを実行します。 2番目のメソッドは、 'calcArea'を静的(クラス)メソッドにします。通常、これは通常、オブジェクトインスタンスなしでアクションを実行します。ここで、 'calcArea'は、結果を返すargsに作用します。これは、クラスメソッドにとってうまくいきます。 'calcArea()'(パラメータなし)というインスタンスメソッドを持つRectangleというクラスでは、独自の高さと幅のメンバ変数をどのように掛けてオブジェクト固有の結果を返すかを知ることができます。 –

答えて

4

あなたの問題に対する解決策は間違いありません。しかし、私はあなたが習慣に慣れていれば、あなたがJavaの学習の進歩の早い段階で、静的メソッドを可能な限り使用しようとしている間、適用可能な場合を除いて(例えばユーティリティメソッド) 。ここにあなたのコードは、テストのインスタンスを作成し、テストオブジェクトに石灰海綿綱メソッドを呼び出すように変更された:あなたは、Javaでコーディングとの更なるにつれ

public class Test { 
public static void main (String [] args){ 
    Test test = new Test(); 
    int a = test.calcArea(7, 12); 
    System.out.println(a); 
} 

int calcArea(int height, int width) { 
    return height * width; 
} 
} 

、おそらくあなただけの開始対処を書いたコードを与えられましたある種のポリゴンオブジェクトなどのオブジェクトでは、calcAreaのようなメソッドは静的コンテキストではなくインスタンスコンテキストに属し、オブジェクトの内部状態を操作できます。これはあなたのコードをよりオブジェクト指向にし、手続きを少なくします。この方法は、あなたのようなクラス名の上にそのメソッドを呼び出すことができることを意味し、静的に定義されている場合

+0

ありがとう@whaley – newbie

7

あなたのメインは静的であるので、あなたは、クラステスト(new test())のインスタンスなしでそれを呼び出すことができます。しかし、それは静的されていないcalcAreaを呼び出します。コメントとして

public class Test { 
public static void main (String [] args){ 
    int a = calcArea(7, 12); 
    System.out.println(a); 
} 

static int calcArea(int height, int width) { 
    return height * width; 
} 
} 

は示唆し、他の回答も示して、あなたがしない可能性があります。それはあなたが、私は推測する。このようにそれを書き換えることができ、クラス

のインスタンスを必要とします永遠になるためにこのルートに行きたい:あなたは静的な機能だけを得るでしょう。静的なものが実際にあなたのコード内にあるべきものを特定し、おそらくオブジェクトを作りそこから関数を呼び出してください:D

+0

これは当てはまりますが、初心者はすべてのメソッドが静的で終了します。それは良くないね。私は静的コンテキストをできるだけ早く 'public static void main(String [] args){new Test()。go(args);}' – maaartinus

+0

のようにできるだけ早く残しておくことをお勧めします。どこに、なぜそれが何であるかを推測するのは難しいです。しかし、@newbieは確かにそれを確認することができます。 – Nanne

1

静的メソッドは何ですか?

もしそうでなければ、それを見てください。ただし、静的メソッドはクラスの特定のインスタンスに割り当てられていないため、静的メソッドは "this"にアクセスできません(できません)。したがって、インスタンスメソッド(静的ではないもの)を静的メソッドから呼び出すことはできません。

+0

かなり良い答え、それは本当にdownvotingに値するかどうかわからない。 – Rekin

+0

ありがとう@sinelaw – newbie

4

calcAreaは静的であってはなりません。メインクラスの別のメソッドを使用するには、そのクラスのインスタンスを作成する必要があります。

public class Test { 
public static void main (String [] args){ 
    Test obj = new Test(); 
    int a = obj.calcArea(7, 12); 
    System.out.println(a); 
} 

int calcArea(int height, int width) { 
    return height * width; 
} 
} 
1

:オブジェクトを作成せずに

int a = Test.calcArea(7, 12); 

、ここ

テストはクラスの名前ですが、これを行うにはcalcArea()メソッドは静的でなければならず、オブジェクトに対して非静的メソッドを呼び出すこともできます。 「」タイプのテストの目的であるとメソッドがstaticとして定義されないある場合

a.calcArea(7,12); 

を呼び出すことができ、ここで

Test a = new Test(); 

:次のようなクラスをインスタンス化してオブジェクトを作成します。