문제

호기심이 없어도, 계산 후 클래스에 대해 여러 Java. 클래스 파일이 생성되는 이유는 무엇입니까? 예를 들어 내 응용 프로그램에는 6 개의 클래스가 있습니다. 한 클래스의 경우 MyClass#1부터 MyClass#10까지 총 10 개의 클래스 파일이 생성되었습니다.

도움이 되었습니까?

해결책

이것들은 용입니다 내부 수업 그리고 정적 중첩 클래스. 숫자가있는 것은 익명의 내부 클래스입니다.

예를 들어:


class Foo {
   class Bar { }
   static class Baz { }
   void run() {
      Helper t = new Helper() {
         int helpMethod() {
            return 2;
         }
      };
    }
}

이것은 클래스 파일을 생성합니다 Foo.class, Foo$Bar.class, Foo$Baz.class 그리고 Foo$1.class (구현을 위해 Helper 상호 작용)

다른 팁

단일 소스 파일에서 더 많은 .class fils를 얻을 수 있습니다.

  • 수업에는 내부 클래스 또는 정적 내부 클래스가 포함되어 있습니다. 내부 수업은 둥지를 틀 수 있습니다. 그들의 이름은 <outer class name>$<inner class name>.

  • 항상 정적 인 내부 인터페이스.

  • 익명의 내부 클래스 (실제로 이름이없는 평범한 내부 클래스)

  • 메인 클래스 전후에 인터페이스 및 클래스를 패키지에 액세스하십시오. 단일 Java 소스 파일에 임의의 패키지 액세스 클래스 및 인터페이스를 가질 수 있습니다. 일반적으로 클래스에서만 사용되는 작은 도우미 개체는 동일한 파일에 넣습니다.

클래스에 내부 클래스가 포함 된 경우 하나의 Java 소스 파일이 여러 클래스 파일을 생성 할 수 있습니다. 익명의 내부 클래스는 번호가 매겨진 클래스 파일로 표시됩니다.

Java의 모든 클래스는 .java-file에 속하지만 .java-file에는 여러 클래스가 포함될 수 있습니다. 여기에는 내면 및 익명 수업이 포함됩니다. 내부 클래스를 위해 생성 된 .class-files는 이름으로 '$'를 포함합니다. 익명의 내부 클래스는 숫자를 얻습니다.

위의 답변에 추가하기 위해 이것은 비교기를 기반으로 생성 된 내부 클래스의 또 다른 좋은 예입니다. (각 비교기는 다른 것으로 컴파일됩니다 MyClass $ X.class):

public class MyClass {
    ...

    public void doSomething() {
        ...
        Collections.sort(list, new Comparator<MyObj>() {
            public int compare(MyObj o1, MyObj o2) {
                ...
            }
        });
        ...
    }

    ...
}

x.java 파일이 하나 있고 4 개의 collections.sort () {}가 포함 된 경우 컴파일 후 x.class, x $ 1. class, x $ 2.class, x $ 3.class, x $ 4.class가 생성됩니다.

내부 클래스 및 정적 내부 클래스의 경우 클래스 파일이 생성됩니다.

수업에 내부 클래스가있는 경우에만 컴파일에 하나 이상의 클래스가 생성됩니다.

나타내다:내부 클래스가있는 Java 코드가 왜 세 번째 someclass $ 1.class 파일을 생성합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top