2013-12-23 1 views
1

오늘 나는 new 연산자를 구분 기호 (. 또는 "도트 연산자")와 함께 사용할 수 있음을 알게되었습니다. 이로 인해 Java가 새로운 연산자의 모든 경우에 암시 적으로 동일한 기술을 사용하는지 궁금하게되었습니다.Java가 새 연산자에서 생성자 (또는 객체)를 암시 적으로 사용합니까?

다음 문은 새로운 "InnerClass 개체"를 만듭니다. .new을 사용하여 새 ParentClass 개체로이 작업을 수행합니다. 그러나이 문에서 첫 번째 new 연산자 앞에는 생성자 (또는 개체)가 없습니다. 그럼, 자바 컴파일 시간에 하나 추가합니까? 명시 적으로이 문장에 하나 (Main())를 추가하려고 시도했지만 코드가 컴파일되지 않습니다.

ParentClass.InnerClass ic = new ParentClass().new InnerClass(); 
+0

가능한 [Java에서 \ someObject.new \'는 무엇을합니까?] (http://stackoverflow.com/questions/15724676/what-does-someobject-new-do-in-java) – Mikhail

답변

3

형태

someObject.new InnerClass() 

inner classes 사용된다. 내부 클래스의 인스턴스는 해당 내부 클래스의 인스턴스와 연관되어야합니다. 종종 둘러싸는 인스턴스는 this이며 점으로 구분 된 표기법이 필요하지 않지만 다른 개체와 관련된 내부 클래스의 인스턴스를 명시 적으로 만들려면 위의 구문을 사용합니다.

Java에서 대부분의 클래스는 내부 클래스가 아닙니다. 포함하는 인스턴스가 필요하지 않으므로 모든 new 호출 전에 Java가 암시 적으로 new Something()을 삽입하지 않습니다. (이 그랬다면, 그것은 전에 삽입 한 호출하기 전에 new Something()new Something()를 삽입해야합니다, 당신은 전혀 아무것도를 구성 할 수 없습니다.)

1

외부 클래스와 정적 내부 클래스를 만들 수 있습니다 자신의 소유, 부모 요소 없음. 비 정적 인 내부 클래스는 부모 요소의 일부가되어야하지만. 외부 요소와 정적 클래스에 대한 부모 요소의 개념이 없기 때문에 해당 부모에 대한 참조를 가질 가능성이 없습니다.

이 양식은 한 단계에서 외부 및 내부 개체를 만들고 내부 참조를 유지할 수 있도록 제공됩니다. 나는 그것을 결코 많이 사용하지 못했지만 그것이 존재한다는 것을 아는 것이 편리하다.

1

필자는이 내부를 살펴 보지 않았지만 먼저 컴파일러가 컴파일 할 때 새로운 개체를 추가한다고 가정 해 보겠습니다. 그것은 모든 클래스가 다른 클래스의 내부 클래스라는 것을 의미합니다. 다른 클래스에서 선언되지 않았으므로 그렇지 않습니다. 그래서 : 아니오, 컴파일 할 때 이와 같은 것을 추가하지 않습니다.

사실이 문제를 해결해 보겠습니다.

public class Outer { 

    String strHello = "Hello ^^"; 

    public void printHello() { 
     System.out.println(strHello); 
    } 

    public static void main(String[] args) { 

     // This will print: Hello ^^ 
     Outer outer = new Outer(); 
     outer.printHello(); 

     // This will print: Hello ^^ 
     new Outer().printHello(); 
    } 
} 

나는 이전에 이런 코드를 본 것 같습니다. 이것은 단순히 인스턴스화 된 클래스의 메소드를 호출하는 것입니다. 점 표기법을 사용하여 변수 및 내부 클래스에 액세스 할 수도 있습니다. 위의 예제에서는 인스턴스 메서드에 사용했습니다. static 키워드를 사용하면 메소드와 변수를 공유 할 수 있으며 클래스의 모든 인스턴스 또는 별도의 클래스가됩니다.

public class Outer { 

    static String strHello = "Hello ^^"; 

    public static void printHello() { 
     System.out.println(strHello); 
    } 

    static class StaticInner { 
    } 

    static class Inner { 
    } 

    public static void main(String[] args) { 

     // Prints: Hello ^^ 
     Outer.printHello(); 

     // Constructs a new Example.StaticInner 
     Outer.StaticInner inner = new Outer.StaticInner(); 

     // Constructs a new Outer.Inner  
     Outer.Inner inner = new Example().new Inner(); 

     // Constructs a new Outer.Inner 
     Example ex = new Example(); 
     Outer.Inner inner = ex.new Inner(); 
    } 
} 

위의 코드는 정적 내부 클래스를 사용하여 내부 생성자가 다른 생성자와 동일하다는 것을 보여줍니다. 그러나 다른 클래스에 있기 때문에 다른 (외부) 클래스를 통해 액세스해야합니다. 그것은 정적 내부 클래스가 아니므로 접근 수정 자 때문에 인스턴스에 액세스해야합니다.

관련 문제