web-dev-qa-db-ja.com

このクラスをインスタンス化せずにクラスのメソッドを使用できますか?

複数のメソッドを持つクラスがあり、これらのメソッド間にコンストラクターはありません。

だから、クラスのインスタンスを作成せずにクラスのメソッドを呼び出すことが可能かどうか疑問に思っています。

たとえば、次のようなことができます。

NameOfClass.doMethod(x1,x2,...,xn)

一般に、なぜそれが不可能なのかはわかりません。何かをする(またはいくつかの値を返す)関数を呼び出すだけです。可能であれば、メソッドがクラスのプライベート変数の値を設定するとどうなりますか。この値に到達するにはどうすればよいですか?同じやり方で?

NameOfClass.nameOfVariable
23
Roman

静的変数および静的 メソッド と呼ばれます。試してみて、コンパイルされることを確認してください。

27
Yoni

メソッドが静的な場合、はい。

ただし、非静的メンバーにアクセスすることはできません。

12
µBio

多くの人が指摘しているように、これはメソッドが静的な場合にのみ可能です。おそらく、いくつかのOOPバックグラウンドが順番に並んでいる可能性があります。メソッドは常にクラスに属する必要があります。それでは、クラスのインスタンスなしでメソッドを呼び出すことの使用は何ですか?完璧なOOの世界では、そうする理由はないはずです。静的メソッドに関係する多くのユースケースでは、クラスに何らかのIDを割り当てることについて説明しています。これはプログラミングの世界では完全に合理的ですが、オブジェクト指向設計に関してはあまり説得力がありません。

不完全な世界でプログラムを作成する場合、「自由関数」の使用例がよくあります(たとえば、JavaまたはC++がsort()を実装する方法)。 Javaは無料の関数を直接サポートしていないため、静的な「メソッド」のみを使用したクラスを使用して、「名前空間」を提供するクラスラッパーの利点を備えたセマンティクスを表現します。この回避策についてあなたが考えていること、そしてそれを言語設計の欠陥として見ているなら、IMOは意見の問題です。

6
pmr

1)[〜#〜] yes [〜#〜]、クラスのメソッドを使用できますwithout作成キーワードの使用によるそのクラスのインスタンスまたはオブジェクト"静的"

2)メソッドを"Static"として宣言すると、次の方法でこのメソッドを呼び出すことができます。

                *ClassName.MethodName()* 

3)例.

class Hello {

   public static void print()
   {

     System.out.println("HelloStatic");
   }  

}


class MainMethod {
    public static void main(String args[])
    {
       // calling static method
       Hello.print();
    } 
}  

4)上記のプログラムの出力は次のようになります:HelloStatic

5
Aviral Kumar

ほとんどの言語では、メソッドが静的な場合にのみ実行できます。また、静的メソッドは静的変数のみを変更できます。

2
user272879

複数のメソッドを持つクラスがあり、これらのメソッド間にコンストラクターはありません。

コンストラクターを明示的に定義しない場合、コンパイラーが提供するデフォルトのコンストラクターを取得します。これらのメソッドが静的でない場合、これを試してください:

NameOfClass x = new NameOfClass();
x.doMethod(x1,x2,...,xn);
2
Mark Byers

クラスのメソッドは、コンテキスト内でインスタンスを操作します。インスタンスのメンバー変数にアクセスできます。メソッドがこれらの変数の1つにアクセスした場合に何が起こるかを尋ねるため、これを理解します。

「データはどこですか?」という質問を自問することで、なぜ機能しないのかを理解できます。インスタンスがない場合、インスタンス変数はどこにありますか?データはどこにありますか?そして答えは、場所がなく、したがって機能しないということです。

静的関数と静的メンバー変数との違いは、データの場所に関する質問に答えることができることです。特定のインスタンスがあるかどうかに関係なく使用可能な静的変数。インスタンス固有の決定とクラス固有の決定は、実際に何をしたいかを考慮する必要がある決定です。

2
janm

複数のメソッドを持つクラスがあり、これらのメソッド間にコンストラクターはありません。

次のようなものがありますか?

public class X
{
    public void foo()
    {
    }
}

または、次のようなものがあるということですか?

public class X
{
    private X()
    {
    }

    public void foo()
    {
    }
}

それが最初の方法である場合、はい、コンストラクタがあり、次のようになります。

public X()
{
    super();
}

2番目の方法である場合、おそらく次のような方法があります。

public static X createInstance()
{
    return (new X());
}

もしクラスにインスタンスを作成せずに物事を行うメソッドを持たせることができるのであれば、そうです、すべてのメソッドと変数を静的にするだけです(通常これは良い考えではありませんが、いくつかの点では完璧です)。

1
TofuBeer

それは静的メソッドです。

1
Tony The Lion

Qreは静的メソッドであり、包含クラスのインスタンスへのアクセス権がないため、最初にインスタンスを作成してからアクセスする必要があります。例えば:

public class Foo {
   private int bar;

   public static void qre() {
      Foo foo = new Foo();
      foo.bar = 5;
      System.out.println("next bar: " + (++5));
   }
}
0
Boris Pavlović

適切なカプセル化では、インスタンス化時に何が起こっているかを「見る」べきではありません。クラスのコンストラクターの欠如に依存することは、この形式を壊しています。クラスの設計は、後でコンストラクターに正式な状態の初期化を追加することを念頭に置いています。クラスとの「契約」は、現在設計されているメソッドを使用できることだけです。

クラスのオーバーヘッドなしでそのメソッドの機能を使用したい場合は、おそらく既存の「クライアント」クラスにそのメソッドを含めるのが最適です(もちろん、これは単なる「コピーアンドペースト」コーディングであり、アンチパターンと見なされますソフトウェア設計の。

0