web-dev-qa-db-ja.com

Javaの静的メソッドで非静的メソッドを呼び出す

静的クラスで非静的メソッドを呼び出そうとするとエラーが発生します。

型再生から非静的メソッドmethodName()への静的参照を作成できません

これもエラーになるので、メソッドを静的にすることはできません。

この静的メソッドは、xInterfaceからインスタンスメソッドを隠すことはできません。

別の静的メソッドで非静的メソッドを呼び出すラウンドを取得する方法はありますか? (2つのメソッドは、個別のパッケージと個別のクラスにあります)。

114
me123

静的メソッドから非静的メソッドを呼び出す唯一の方法は、非静的メソッドを含むクラスのインスタンスを持つことです。定義上、非静的メソッドはあるクラスのインスタンスで呼び出されるメソッドですが、静的メソッドはクラス自体に属します。

127
danben

メソッドを呼び出すクラスのインスタンスを作成できます。

new Foo().nonStaticMethod();
86
Fabian Steeg

最初にクラスインスタンスを作成し、そのインスタンスを使用して非静的メソッドを呼び出します。例えば、

class demo {

    public static void main(String args[]) {
        demo d = new demo();
        d.add(10,20);     // to call the non-static method
    }

    public void add(int x ,int y) {
        int a = x;
        int b = y;
        int c = a + b;
        System.out.println("addition" + c);
    }
}
40
Parmeshwar
public class StaticMethod{

    public static void main(String []args)throws Exception{
        methodOne();
    }

    public int methodOne(){
        System.out.println("we are in first methodOne");
        return 1;
    }
}

静的メソッドにはそのクラス参照が必要であるため、上記のコードは実行されません。

public class StaticMethod{
    public static void main(String []args)throws Exception{

        StaticMethod sm=new StaticMethod();
        sm.methodOne();
    }

    public int methodOne(){
        System.out.println("we are in first methodOne");
        return 1;
    }
}

これは間違いなく実行されます。ここでは、(StaticMethod=new Static method())以外のクラスの参照を使用して「sm」以外の参照を作成しているため、メソッド1(sm.methodOne())を呼び出しています。

これが役立つことを願っています。

9
chinnu geddi

メソッドは本当にshouldであるように聞こえます(つまり、データメンバーにアクセスせず、インスタンスを呼び出す必要はありません) 。 「静的クラス」という用語を使用したので、クラス全体がおそらく静的である可能性のあるユーティリティのようなメソッド専用であると理解しています。

ただし、Javaでは、インターフェイス定義メソッドの実装を静的にすることはできません。そのため、(当然)メソッドを静的にしようとすると、「cannot-hide-the-instance-method」エラーが発生します。 (Java言語仕様では 9.4節でこれについて言及されています。 "インターフェイスで宣言されたメソッドはstaticまたは静的メソッドは抽象化できないため、コンパイル時エラーが発生します。 "

したがって、メソッドがxInterfaceに存在し、クラスがxInterfaceを実装している限り、メソッドを静的にすることはできません。

インターフェイスを変更できない場合(または変更したくない場合)、次のことができます。

  • クラスをシングルトンにします。コンストラクタをプライベートにし、クラスに静的データメンバを追加して、既存のインスタンスのみを保持します。この方法では、インスタンスでメソッドを呼び出しますが、少なくともメソッドを呼び出す必要があるたびに新しいインスタンスを作成することはありません。
  • クラスに2つのメソッドを実装します:インスタンスメソッド(xInterfaceで定義)、および静的メソッド。インスタンスメソッドは、静的メソッドに委任する1行で構成されます。
6
Eli Acherkan

非静的メソッドを含むクラスのインスタンスが必要です。

インスタンスなしでクラスstartsWithの非静的メソッドStringを呼び出そうとしたときのようです:

 String.startsWith("Hello");

必要なのは、インスタンスを作成してから、非静的メソッドを呼び出すことです。

 String greeting = new String("Hello World");
 greeting.startsWith("Hello"); // returns true 

したがって、インスタンスを作成して呼び出す必要があります。

5
OscarRyz

静的メソッドから非静的メソッドを呼び出す唯一の方法は、非静的メソッドを含むクラスのインスタンスを持つことです。

class A
{
    void method()
    {
    }
}
class Demo
{
    static void method2()
    {
        A a=new A();

        a.method();
    }
    /*
    void method3()
    {
        A a=new A();
        a.method();
    }
    */

    public static void main(String args[])
    {
        A a=new A();
        /*an instance of the class is created to access non-static method from a static method */
        a.method();

        method2();

        /*method3();it will show error non-static method can not be  accessed from a static method*/
    }
}
2
Sourav Saha

私はインターフェイスを使用して、そのような匿名インスタンスを作成します:

AppEntryPoint.Java

public interface AppEntryPoint
{
    public void entryMethod();
}

Main.Java

public class Main
{
    public static AppEntryPoint entryPoint;

    public static void main(String[] args)
    {
        entryPoint = new AppEntryPoint()
        {

            //You now have an environment to run your app from

            @Override
            public void entryMethod()
            {
                //Do something...
                System.out.println("Hello World!");
            }
        }

        entryPoint.entryMethod();
    }

    public static AppEntryPoint getApplicationEntryPoint()
    {
        return entryPoint;
    }
}

そのクラスのインスタンスを作成して独自のメソッドを呼び出すほどエレガントではありませんが、本質的には同じことを実現します。それを行う別の方法。

静的メソッド内で非静的メソッド/フィールドを使用する、またはその逆の最も簡単な方法は...

(これを機能させるには、このクラスのインスタンスが少なくとも1つ必要です)

このような状況は、Androidアプリ開発では非常に一般的です。例:-アクティビティには少なくとも1つのインスタンスがあります。

public class ParentClass{

private static ParentClass mParentInstance = null;

ParentClass(){
  mParentInstance = ParentClass.this;           
}


void instanceMethod1(){
}


static void staticMethod1(){        
    mParentInstance.instanceMethod1();
}


public static class InnerClass{
      void  innerClassMethod1(){
          mParentInstance.staticMethod1();
          mParentInstance.instanceMethod1();
      }
   }
}

注:-これは、このようなビルダーメソッドとして使用できません。

String.valueOf(100);
1
mifthi

2つの方法があります。

  1. 静的メソッド内のインスタンスから非静的メソッドを呼び出します。ワンライナーのサンプルについては、fabienの回答をご覧ください。彼の例では、彼はクラスのインスタンスを作成し、それを1つのメソッドにのみ使用します。インスタンスを静的関数のように扱うため、お勧めしません。
  2. 静的メソッドを非静的に変更します。
1
monksy

この制限を直接回避することはできません。ただし、特定のケースでできる合理的なことがいくつかあります。

たとえば、静的メソッドでクラスのインスタンスを「更新」してから、非静的メソッドを呼び出すことができます。

ただし、クラスを投稿するか、それらのスリム化バージョンを投稿すると、さらに良い提案が得られる場合があります。

1
Drew Wills

以下を使用して、静的メソッド内で非静的メソッドを呼び出すことができます:Classname.class.method()

0
george kanakis

コンストラクターは、理論的には静的メソッドによって呼び出される「唯一の」非静的メソッドである特別なメソッドです。それ以外は許可されません。

0
JavaDeveloper

静的メソッド内で非静的メソッドを呼び出すことはできません。その背後にあるロジックは、静的メソッドをインスタンス化するオブジェクトを作成しないが、非静的メソッドをインスタンス化するオブジェクトを作成する必要があるということです。そのため、非静的メソッドは、静的メソッド内でインスタンス化するオブジェクトを取得しないため、インスタンス化できなくなります。

0
Usman