static 메소드 - Java의 정적 메서드에서 비 정적 메서드 호출




차이 자바 (13)

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"이외의 참조를 생성하기 때문에 우리는 메소드 하나 ( sm.methodOne() )를 호출합니다.

이것이 도움이되기를 바랍니다.

이 질문에는 이미 답변이 있습니다.

정적 클래스에서 비 정적 메서드를 호출하려고하면 오류가 발생합니다.

비 정적 메서드 methodName ()에 대한 정적 참조를 유형 재생에서 만들 수 없습니다.

이 메서드는 정적으로 만들 수 없기 때문에 오류도 발생합니다.

이 정적 메서드는 xInterface에서 인스턴스 메서드를 숨길 수 없습니다.

다른 정적 메서드에서 비 정적 메서드 호출을 얻는 방법이 있습니까? (두 가지 방법은 별도의 패키지와 별도의 클래스에 있습니다.)


정적 메소드에서 비 정적 메소드를 호출하는 유일한 방법은 비 정적 메소드를 포함하는 클래스의 인스턴스를 갖는 것입니다. 정의에 따르면 비 정적 메서드는 일부 클래스의 인스턴스에서 호출되는 정적 메서드이고 정적 메서드는 클래스 자체에 속한 메서드입니다.


비 정적 메서드를 포함하는 클래스의 인스턴스가 필요합니다.

인스턴스없이 클래스 String 의 비 정적 메서드 startsWith 를 호출하려고 할 때와 같습니다 :

 String.startsWith("Hello");

필요한 것은 인스턴스를 가져온 다음 비 정적 메서드를 호출하는 것입니다.

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

따라서 인스턴스를 생성하고 인스턴스화해야합니다.


정적 메서드 내에서 비 ​​정적 메서드를 호출 할 수 없습니다. 그 뒤에있는 논리는 정적 메서드를 인스턴스화하는 개체를 만들지는 않지만 비 정적 메서드를 인스턴스화 할 개체를 만들어야한다는 것입니다. 따라서 비 정적 메소드는 정적 메소드 내에서 인스턴스화를위한 객체를 얻지 못하므로 인스턴스화 할 수 없습니다.


정적 메서드 내에서 / 정적 메서드 또는 그 반대로 사용하는 가장 쉬운 방법은 ...

(이 작업을하려면이 클래스의 인스턴스가 하나 이상 있어야합니다.)

이런 유형의 상황은 안드로이드 앱 개발에서 매우 일반적입니다. 예를 들어, 액티비티에 적어도 하나의 인스턴스가 있습니다.

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);

메서드가 실제로 정적 이어야 합니다 (즉, 데이터 멤버에 액세스하지 않고 인스턴스를 호출 할 필요가 없다는 것). 당신이 "정적 클래스"라는 용어를 사용했기 때문에 전체 클래스가 아마도 정적 일 수있는 유틸리티와 같은 방법에 전념하고있는 것으로 알고 있습니다.

그러나 Java는 인터페이스 정의 메소드의 구현이 정적 인 것을 허용하지 않습니다. 그래서 (자연스럽게) 메쏘드를 정적으로 만들려고 할 때 "can not-hide-the-instance-method"오류가 발생합니다. (Java 언어 스펙 에서는 9.4 절 에서 이것을 언급합니다. "정적 메소드는 추상이 될 수 없기 때문에 인터페이스에서 선언 된 메소드는 정적으로 선언되어서는 안되며 컴파일 타임 오류가 발생합니다." )

메소드가 xInterface 존재하고 클래스가 xInterface 구현하면 메소드를 정적으로 만들 수 없습니다.

인터페이스를 변경할 수 없거나 원하지 않는 경우 할 수있는 일이 몇 가지 있습니다.

  • 클래스를 싱글 톤으로 만듭니다. 생성자를 private으로 만들고 클래스에 정적 데이터 멤버 만 있으면 기존 인스턴스 만 보유 할 수 있습니다. 이렇게하면 인스턴스에서 메서드를 호출 할 수 있지만 적어도 메서드를 호출해야 할 때마다 새 인스턴스를 만들지는 않습니다.
  • 클래스에 2 개의 메소드를 구현하십시오 : 인스턴스 메소드 ( xInterface 정의 된 xInterface )와 정적 메소드. 인스턴스 메소드는 정적 메소드에 위임하는 단일 행으로 구성됩니다.

정적 메소드에서 비 정적 메소드를 호출하는 유일한 방법은 비 정적 메소드를 포함하는 클래스의 인스턴스를 갖는 것입니다.

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*/
    }
}

다음을 사용하여 정적이 아닌 메소드를 호출 할 수 있습니다. Classname.class.method()


인터페이스를 사용하여 다음과 같이 익명 인스턴스를 만듭니다.

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. 정적 메서드 내의 인스턴스에서 비 정적 메서드를 호출합니다. oneliner 샘플에 대한 fabien의 답변을 참조하십시오. 그의 예를 통해 그는 클래스의 인스턴스를 생성하고 하나의 메소드에만 사용합니다. 나중에 그것을 처리해야합니다. 그것은 정적 함수와 같은 인스턴스를 다루기 때문에 나는 이것을 추천하지 않는다.
  2. 정적 메소드를 비 정적으로 변경하십시오.

진정한 대답은 여기 Jon Skeet입니다.

싱글 톤은 하나의 생성 된 인스턴스에 대한 액세스를 허용합니다. 인스턴스 (또는 인스턴스에 대한 참조)는 다른 메소드에 매개 변수로 전달되고 일반 객체로 처리 될 수 있습니다.

정적 클래스는 정적 메서드 만 허용합니다.







java static non-static