1

上手。私はJavaを初めて使用します。mainは静的メソッドである必要があることを私は知っています。しかし、静的メソッドは他の静的メソッドしか呼び出せないことを読みましたか?では、どうして非静的メソッドを呼び出すことができるのでしょうか。質問というよりは混乱です。例えば

 public class Function
    {
    public static int side = 10,area,vol;

    public static void main(String args[])
    {
        System.out.println("programme to find area and volume");
        Function fu = new Function();
        fu.calarea();
    }
    public void calarea()
    {
        area = side*side;
        System.out.println("finished calculating area now calling volume");
        calvol();
    }
    public void calvol()
    {
        vol = area*side;
        System.out.println("finished calculating volume now calling display");
        display();
    }
    public void display()
    {
        System.out.println("side of a square ==>"+side);
        System.out.println("area of a square ==>"+area);
        System.out.println("volume of a square ==>"+vol);
    }
    }

ここで、main()は静的メソッドです。したがって、静的メソッドのみを呼び出す必要がありますか?どうして、calarea()を呼び出すことができますか?オブジェクトを作成することで正しい場合は??

編集:

私も同じことを考えていました。そして、私は静的メソッドを呼び出す方法を知っています。非静的メソッドを(何らかの方法で)呼び出すことができる場合、静的メソッドは他の静的メソッドのみを呼び出すことができると言われるのはなぜですか?

4

4 に答える 4

9

しかし、静的メソッドは他の静的メソッドしか呼び出せないことを読みましたか?

それは虚偽表示または誤読のいずれかです。

「ルール」のより正確な説明は、静的メソッドは特定の(null以外の)インスタンス参照なしではインスタンスメソッドを呼び出すことができないということです。言い換えるとthis、静的メソッドでは無効であるため、メソッド呼び出しを行うために明示的または暗黙的に使用することはできません。

あなたの例はルールを破っていません...どちらの形式でも。null以外のオブジェクト参照を使用しており、this明示的または暗黙的に使用していません。


他のサブ質問のほとんどは、上記によって「動揺」していますが...

オブジェクトを作成することで正しい場合は??

はい。インスタンスメソッドの呼び出しに使用できるオブジェクト参照を作成するには、オブジェクトを作成する必要があります。インスタンスメソッドを呼び出す他の方法はありません。

于 2013-01-17T23:11:20.970 に答える
3

はい、インスタンスを使用すると、インスタンスメソッドを呼び出すことができます。

calarea() 

はインスタンスメソッドであるため、Functionクラスのインスタンスを作成し、calarea()そのインスタンス参照を呼び出す必要があります。

于 2013-01-17T23:08:20.153 に答える
1

他のフレーバーもありますが、これはそれを理解する必要があります。

静的メソッドとインスタンスメソッドが混在するクラスがある場合、静的メソッドはインスタンスを呼び出すことができません。例えば

擬似コードで

class SomeClass
{
static void IDoSomething()
{
   UDoSomething();  
}

void UDosomething
{
}
}

エラーが発生しますが

class SomeClass
{
static void IDoSomething(SomeClass argSomeClass)
{
   argSomeClass.UDoSomething();  
}

void UDosomething
{
}
}

大丈夫だろう。

于 2013-01-17T23:17:02.517 に答える
0

あなたが正しいです。関数クラスのインスタンス(オブジェクト)を作成する必要があります。したがって、正しいコードは次のとおりです。

Function f = new Function();
f.calvol();
于 2013-01-17T23:10:54.207 に答える