web-dev-qa-db-ja.com

他のメソッドを「静的」にできるのに、コンストラクターにはできないのはなぜですか?

Mainメソッドが静的でなければならない理由がわかりません。静的変数は理解していますが、静的メソッドを理解するのは困難です。静的メソッドが存在するため、互いに衝突しない2つの異なるクラスに同じ名前の2つのメソッドを作成できますか?

また、静的コンストラクターを作成できない理由がわかりません。

誰もがこの概念を説明するのを手伝ってもらえますか?

44
user983246

Javaには [静的コンストラクター] 静的初期化ブロック これは「静的コンストラクター」として表示できます。

class Foo {
  static String Bar;
  static {
     // "static constructor"
     Bar = "Hello world!";
  }
}

いずれの場合でも、must静的でなければならないメインクラスのメソッドはmainメソッドのみです。これは、最初に「メインクラス」のインスタンスを作成するwithoutで呼び出されるためです。一般的な手法、および私が好む手法は、静的コンテキストから素早く抜け出すことです:

class Main {
   int argCount;

   // constructor
   public Main (String[] args) {
     // and back to boring ol' non-static Java
     argCount = args.length;       
   }

   void runIt () {
      System.out.println("arg count: " + argCount);
   }

   // must be static -- no Main instance created yet
   public static void main (String[] args) {
      Main me = new Main(args);
      me.runIt();
   }
}

また、静的は「名前の衝突」とは関係ありません。静的メソッド(または変数)は、型の特定のインスタンスに関連付けられたnotであるメソッド(または変数)です。 Classes and Objects Java Tutorial およびセクション nderstanding Instance and Class Variables を読むことをお勧めします。

ハッピーコーディング。

82
user166390

「Javaコンストラクターが静的ではない理由」」という理由の1つを共有しています。

単純に言うと、「A Javaコンストラクターは常に非静的」です。なぜなら、

コンストラクタの目的は、オブジェクトを初期化/構築し、継承を可能にすることだけです。これを行うには、thisやsuperなどの2つの便利なJavaキーワード(非静的変数として使用))を使用する必要があります。オブジェクトを初期化するには 'this'を使用します。スーパーオブジェクト(またはオブジェクトクラス)が最初に作成され、次に子オブジェクト(したがって継承)が作成されるようにスーパークラスコンストラクターを呼び出すsuper(ofcourse super())コンストラクターが静的な場合、2つのキーワード(非静的変数)コンストラクター内(私たちが知っているように、非静的なものは静的なコンテキストから参照できません)

Javaコンストラクターは静的であってはなりません。

コンストラクターは、オブジェクトの作成に使用されます。

通常、静的はすべてのオブジェクトで同じです。

したがって、静的コンストラクターがある場合、1つのオブジェクトの作成は、他のすべての既存のオブジェクトに影響します。

静的メソッドは、静的変数のみを参照します。したがって、オブジェクトを作成するために指定するすべての初期パラメーターは、すべてのオブジェクトに対して変更されます。同様のオブジェクトを無用に作成しても意味がありません。

お役に立てれば.... :)

7
user2626445

静的メソッドは、オブジェクトではなくクラスに属します。 mainメソッドは、他のコードが実行されてオブジェクトをインスタンス化する前に最初に呼び出されるため、静的である必要があります。プログラムへのエントリポイントを提供します。静的メソッドは、オブジェクトのコンテナの外部から呼び出されます。同じことが静的クラス変数にも当てはまります。クラスから作成されたオブジェクトごとに1回作成されるメンバー変数とは対照的に、クラス全体に対して1つのコピーのみが存在します。オブジェクトインスタンスの数が作成され、破棄されていないなど、クラスのデータを保存するために使用されます。このデータはクラスに属します。静的メソッドの良い例は、コンストラクターがプライベートであり、静的メンバー関数によってのみアクセスできるシングルトンパターンです。クラス外の関数は、この機能を複製できません。このメソッドはクラスデータとオブジェクトに作用するため、論理的には同じクラスに属します。これはすべてカプセル化に帰着します。クラスは自分自身だけに責任があり、自分自身だけを知っています。

一方、オブジェクトメソッドは、クラスの1つのインスタンスであるオブジェクトに関連付けられたデータを操作するためのものです。コンストラクターは、オブジェクトを初期化し、そのデータを初期状態に設定するために使用されるコードです。これらは、新しいオブジェクトを保存するためにメモリが割り当てられた直後に(そして自動的に)実行されます。コンストラクターを明示的に定義しなくても、オブジェクトのメンバー変数とオブジェクトのメソッドコードを新しいオブジェクトにマップするために、一種の「デフォルトコンストラクター」が実行されます。

お役に立てれば。

7
Sinthia V

Constructorはオブジェクトのプロパティですが、staticはオブジェクトとは関係ありません。 静的コンストラクターのようなものは何もありません。しかし、コンストラクターと同様のタスク、つまりフィールドの初期化などを行う静的ブロックがあります。

1
ashwani46

main(String[])メソッドには、Javaランタイム環境の動作方法によって決定される特定のプロトタイプがあります。コマンドラインから_Java MyApplication_を呼び出すと、Java VMはそのクラスに含まれる静的main(String[])メソッドを探して実行します応用。そのメソッドが見つからない場合、Java VMはアプリケーションとしてクラスを実行できません。それがまさに言語の定義方法です。また、実行するためにアプリケーションクラスのJava VM インスタンスを作成しないを意味します。

クラスをスタンドアロンアプリケーションとして、または他の何かによって作成されたインスタンスとして使用できるようにしたい場合、クラスにRunnableインターフェイスを実装させ、mainメソッドも提供することができます。新しいインスタンスでrunメソッドを実行します。

_public class MyRunnableThing implements Runnable
{
    // Define whatever variables your runnable thing needs here as
    // private instance fields.

    /** Fulfills requirements of Runnable interface. */
    public void run()
    {
        System.out.println( "I'm running..." ) ;
    }

    /** Also makes the class runnable from the console. */
    public static void main( String[] args )
    {
        MyRunnableThing runMeNow = new MyRunnableThing() ;
        runMeNow.run() ;
    }
}
_

これでanyクラスはMyRunnableThingのインスタンスを潜在的に作成し、そのrun()メソッドを使用して同じ動作を生成できます。 _Java MyRunnablething_を実行します。

参照: Javaでの静的コンストラクタの使用 。そのQ&Aのハイライト:

  • コンストラクターはクラスのインスタンスを作成するために使用されるため、静的メソッドではなくインスタンスメソッドです。
  • コンストラクターを使用して、クラスのインスタンスを作成する静的メソッドを作成できます。これが、トレンディな新しい「ビルダー」クラスの仕組みです。
  • 永続的な一意のsingletonインスタンスを返す静的メソッドを作成できます。
  • クラスに静的メンバーがある場合、静的初期化子を作成して、それらのメンバーの値を初期化できます。
0
zerobandwidth

Constructorの目的は、オブジェクトを構築すること、つまりクラスのインスタンス変数をデフォルト値または初期化された値で初期化することです。非静的インスタンス変数は、静的メソッドからアクセスできません。したがって、コンストラクタは静的ではありません。

0
user3428513

このリンクを見てみると、間違いなくあなたが理解するのに役立ちます: なぜコンストラクタを静的にできないのですか?

そして

コンストラクターは、実行時にオブジェクトを作成するときに呼び出されます。静的はすべてのオブジェクトで同じですが、すべてのオブジェクトには独自の状態とプロパティがあります。したがって、静的コンストラクターがある場合、1つのオブジェクトの作成は、他のすべての既存のオブジェクトに影響します。注:staticはクラスレベルであり、コンストラクターはオブジェクトに関連しています。

例えば.

  public class Foo
    {
       String name;
       int id;
        // define constructors
           Foo (String name, int id)
        {
            this.name = name;
            this.id = id;
        }

          p s v m(String[] arg)
      {
          Foo f1 = new Foo("Amit",001);
          Foo f2 = new Foo("Rahul",002);
      }
    }

静的コンストラクターを作成すると、両方のオブジェクト(f1も)には、名前とIDに関してRahulと002として最後に更新された値が含まれます。

0
Maddy

静的として宣言されたメソッドはオブジェクトの作成を必要としません。メインメソッドのオブジェクトを作成しないため、静的として宣言されます。

コンストラクターは、オブジェクトを初期化するために暗黙的に呼び出されるため、静的コンストラクターを持つ目的はありません。

0
Smruti

昨日、物事をより理解しやすくするための関連する質問への回答として簡単な例を書いた: Java constructor?

静的メソッドのポイントは、クラスのインスタンスを作成せずに呼び出すことができる一方で、「通常の」インスタンスメソッドはインスタンスに関連し、インスタンスなしでは呼び出せないということです。

MainクラスのMainメソッドはプログラムのエントリポイントであるため、インスタンスはまだ作成されていない可能性があるため、当然、インスタンスを介してアクセスすることはできません。したがって、静的であるため、プログラムの開始として実行できます。

0
Kjartan

OO言語では、オブジェクトを作成するプロセスは次のとおりであるため、コンストラクターを静的にすることはできません。

  • オブジェクトを割り当てます
  • コンストラクタを呼び出して、新しく割り当てられたオブジェクトを初期化します

コンストラクターは他の場所では使用されません(タイプセーフ言語はこれを強制する必要があります)。したがって、コンストラクターは常に非静的コンテキストで呼び出されます。

コンストラクターが静的である場合、コンストラクターは新しく割り当てられたオブジェクトへの参照を受け取らないため、初期化できません。

したがって、コンストラクターは常に非静的にすることができ(常に非静的コンテキストから呼び出されるため)、常に非静的にする必要があります(そうでなければ、タスクを実行できません)。

0
user3810486

Javaは、コンストラクターを静的として宣言することを許可していません。以下がその理由です。

  1. 静的は同じクラスを意味します。つまり、静的メソッドは継承できません。

  2. 静的では、「this」参照(キーワード)は使用できません。 「this」は常にオブジェクトにリンクされています。コンストラクターは常に何らかのオブジェクトに属します。

  3. コンストラクターが静的である場合、サブクラスのオブジェクトはアクセスできません。コンストラクターでstaticが許可されている場合、クラス内ではアクセスできますが、サブクラスではアクセスできません。

0
Suraj

クラスに静的、オブジェクトにコンストラクタ

静的メソッド、ブロック、または変数がクラスに属していることを知っています。一方、コンストラクタはオブジェクトに属し、new演算子を使用してインスタンスを作成するときに呼び出されます。コンストラクターはクラスプロパティではないため、静的にすることは許可されていません。

0
abin peter