11

私の仮定

  1. 静的メソッドは非静的メソッドを呼び出すことはできません。
  2. コンストラクターは、戻り型のないメソッドの一種です。

この例を考えると...

    public class Main {
        public static void main(String[] args) {
            Main p = new Main();  // constructor call
            k();  // [implicit] `this` reference
        }

        protected Main() {
            System.out.print("1234");
        }

        protected void k() {
        }
    }
  • この行は1234を出力します:Main p = new Main()
  • この行は例外をスローします:k()

サンプルコードがこれら2つのことを行ったのはなぜですか?それらは私の上記の仮定と矛盾しませんか?私の仮定は正しいですか?

4

3 に答える 3

11

1-静的メソッドは非静的メソッドを呼び出すことはできません。

確かに可能ですが、でメソッドを呼び出すためのオブジェクトが必要です。

静的メソッドでは、this使用可能な参照がないため、foo()(と同等this.foo())は不正です。

2-コンストラクターは、戻り型のないメソッドの一種です。

それらをメソッドと比較する必要がある場合、コンストラクターは非静的メソッドに近いと言えます(コンストラクター内に実際にthis参照があるため)。

この見方を考えると、静的メソッドが問題なくコンストラクターを呼び出すことができる理由は明らかです。


それで、それを要約すると:

Main p = new Main();

new Main()既存のオブジェクトに依存しないため、問題ありません。

k();

これは、(静的な)mainメソッドと同等であり、使用できないためthis.k()、問題ありません。this

于 2012-05-09T09:49:00.740 に答える
6

いいえ。この点では、コンストラクターは通常のメソッドではありません。コンストラクターの要点は、クラスの新しいインスタンスを作成することです。

したがって、静的スコープでも呼び出すことができます。考えてみてください。クラスの新しいインスタンスを作成するためにクラスの既存のインスタンスが必要な場合、それをインスタンス化することはできません。

いくつかの説明:

静的メソッドは非静的メソッドを呼び出すことはできません。

完全ではありません。静的メソッド内から非静的メソッドを呼び出すことができます。そのクラスの特定のオブジェクトにスコープを設定する必要があります。つまり

p.k();

上記のコードサンプルで完全に機能します。

呼び出し

k();

インスタンス(非静的)メソッド内では問題ありません。そしてそれは

this.k();

暗黙的thisには、クラスの現在のインスタンスを指します。コンパイラはk()、インスタンスメソッド内のように修飾されていない呼び出しを検出すると、自動的にスコープを設定しthis.ます。ただし、静的メソッドはクラスのどのインスタンスにも関連付けられていないためthis、静的メソッド内を参照することはできません。したがって、インスタンスメソッドを呼び出すには、クラスのインスタンスに明示的に名前を付ける必要があります。

于 2012-05-09T09:49:33.287 に答える
5

ルールは単純です:
1-静的メソッドは非静的メソッドを呼び出すことはできません。

それは単に真実ではありません。静的メソッドは、「ターゲット」参照を介して非静的メソッドを呼び出すことができます。たとえば、これは静的メソッドでは問題ありません。

Integer x = Integer.valueOf(10);
int y = x.intValue(); // Instance method!

本当のポイントは「this静的メソッド内に参照がない」ということです。

2-コンストラクターは、戻り型のないメソッドの一種です。

正直なところ、これはあまり便利なモデルではありません。コンストラクターを宣言クラスと同じ戻り型を持つ静的メソッドと見なす方が(呼び出し元の観点から)より理にかなっていますが、それでも決して完全なモデルではありません。

コンストラクターを別のタイプのメンバーと考えることをお勧めします。コンストラクターとメソッドを非表示にするのではなく、それらの違いを受け入れます。

于 2012-05-09T09:50:25.143 に答える