>source

저는 학생들에게 Main이라고 하는 "runner" 클래스를 인스턴스화할 필요가 없으며 해당 클래스 내부에 정의된 메서드에 정적으로 액세스할 수 있다고 가르쳤습니다.

class Main {
  public static String foo() {
    return "foo";
  }
  public static void main(String[] args) {
   System.out.println(foo());
  }
}

그러나 한 학생이 다음 예를 보여주고 이것이 괜찮은지 물었을 때 나를 놀라게 했습니다.

class Main {
  public  String foo() {
    return "foo";
  }
  public static void main(String[] args) {
   Main m= new Main();
   System.out.println(m.foo());
  }
}

두 가지가 모두 실행되는 이유를 이해하지만 다른 방법보다 한 가지 접근 방식을 취해야 하는 이유가 있는지 궁금합니다. 해당 클래스의 일부인 메서드 내에서 클래스의 인스턴스를 선언하는 것에 대한 문제가 저를 괴롭히지만 정확한 문제를 명확히 설명하는 방법을 모르겠습니다.

"해당 클래스의 일부인 메서드 내에서 클래스의 인스턴스를 선언하는 것에 대한 문제가 저를 괴롭히지만 정확한 문제를 명확히 설명하는 방법을 모르겠습니다." -완벽합니다. 팩토리 메소드는 정확히 같은 방식으로 작성됩니다.

Turing852021-10-04 17:09:35

내 일부는 당신의 지식이 이 수준에 있는데 왜 학생들을 가르치는지 궁금합니다. 다른 부분은 잘못된 것을 가르치는 대신 확실하지 않을 때 묻고 배우는 것에 대해 박수를 보내고 싶습니다. 어쨌든 질문은 좋습니다.

Mad Physicist2021-10-04 17:23:00

사소한 것 같지만 일반적으로 '러너 클래스'가 아닌 '드라이버 클래스'라고 합니다.

Mad Physicist2021-10-04 17:24:07
  • 답변 # 1

    네, 괜찮아요. 두 번째 접근 방식의 장점은 이제 정적 메서드 또는 필드뿐만 아니라 인스턴스 메서드/필드에도 액세스할 수 있다는 것입니다. 이는 인스턴스의 속성이 정적 속성과 같이 모든 인스턴스에서 공유되지 않는다는 것을 의미합니다. 예를 들어 이제 다음과 같이 할 수 있습니다.

    class Main {
      private int number= 0;
      private String name= "";
      public Main(int number, String name) {
        this.number= number;
        this.name= name;
      }
      public static void main(String[] args) {
        Main main1= new Main(1, "Main first with number");
        Main main2= new Main(2, "Main second with number");
        System.out.println(main1); //it will print Main first with number 1
        System.out.println(main2); //it will print Main second with number 2
      }
      public String toString() {
        return this.name + " " + this.number;
      }
    }
    

  • 이전 이름이있는 브라우저에서 ASP.NET MVC FileContentResult를 사용하여 파일을 스트리밍 하시겠습니까?
  • 다음 가져오기 라이브러리를 사용할 수 없을 때 Windows DLL을 동적으로 연결하시겠습니까?