2011-01-03 5 views
61

Java로 인터페이스의 인스턴스를 생성 할 수 있습니까?Java로 인터페이스의 인스턴스를 만들 수 있습니까?

어딘가에 나는 다음과 같이 내부 익명 클래스를 사용하는 것이 우리가 할 수 읽었습니다 :

interface Test 
{ 
    public void wish(); 
} 
class Main 
{ 
    public static void main(String[] args) 
    { 
     Test t=new Test() 
     { 
      public void wish() 
      { 
       System.out.println("output: hello how r u"); 
      } 
     }; 
    t.wish(); 
    } 
}  

cmd> javac Main.java 
cmd> java Main 
output: hello how r u 

그것은 올바른 여기입니까?

+0

왜 필요한가요? 인터페이스의 목적은 자신의 기능으로 확장 할 수있는 빈 메소드를 갖는 것입니다. – Ahmed

+6

@Ahmed : 빠른 프로토 타입 인터페이스 구현을 위해서? 아니면 그냥 그렇게 할 수있는 명명 된 클래스를 만들 필요없이 이벤트 처리기를 구현합니까? 등등 ... – rsenna

+6

이것은 이미 여기에 요청되었습니다 : http://stackoverflow.com/questions/4000062/can-we-create-an-object-of-an-interface – jjnguy

답변

37

예, 올바른 예입니다. 익명 클래스는 인터페이스를 구현할 수 있으며 "implements"키워드없이 인터페이스를 구현하는 클래스를 볼 수 있다고 생각할 수있는 유일한 시간입니다. 다른 코드 샘플을 바로 확인하십시오.

interface ProgrammerInterview { 
    public void read(); 
} 

class Website { 
    ProgrammerInterview p = new ProgrammerInterview() { 
     public void read() { 
      System.out.println("interface ProgrammerInterview class implementer"); 
     } 
    }; 
} 

잘 작동합니다. 이 페이지에서 촬영되었다.

http://www.programmerinterview.com/index.php/java-questions/anonymous-class-interface/

+0

이 오류없이 컴파일됩니다, 내 지식에 따르면 인터페이스를 인스턴스화 할 수 없습니다하지만 당신이 그것을 대답은'ProgrammerInterview p = new ProgrammerInterview() {' –

+1

위의 예제에서 우리는 ProgrammerInterview의 객체를 인스턴스화하지 않았지만 우리가 한 것은 ProgrammerInterview를 사용하여 참조를 만든 다음 익명 클래스의 객체를 만든 것입니다. 이 익명 클래스는 ProgrammerInterview를 구현하고 익명 클래스의 객체를 한 번에 만들었습니다. –

+1

하지만'new ProgrammerInterview() {... '를 호출하지 않습니까? 그래서 기술적으로 당신은 인터페이스의 인스턴스를 만들고 있습니다. 나는 아직도 여기서 일어나는 일에 대해 약간 혼란 스럽다. – CapturedTree

4

짧은 대답 ... 예. 변수를 초기화 할 때 익명 클래스를 사용할 수 있습니다. this

+0

나는 아무 말도하지 않을 것이다 ... 익명이 인터페이스를 구현하기 때문에 ...하지만 당신은 구현 도구를 가지고 있지 않다. –

80

Java에서 인터페이스를 인스턴스화 할 수 없습니다. 그러나 인터페이스 유형을 기준으로 인터페이스를 구현하는 객체를 참조 할 수 있습니다. 예 :

public interface A 
{ 
} 
public class B implements A 
{ 
} 

public static void main(String[] args) 
{ 
    A test = new B(); 
    //A test = new A(); // wont compile 
} 

위에서 수행 한 작업은 인터페이스를 구현하는 익명 클래스를 만드는 것입니다. interface Test 유형의 오브젝트가 아닌 익명 오브젝트를 작성 중입니다.

+8

익명 클래스에는 익명의 클래스가 없다. 익명 – jjnguy

+1

그의 예제가 맞는지 물어 본다. 당신이 그 사실을 인정했다면 확실하지 않습니다. – rsenna

+4

예제가 작동하지만 ... 그가 생각하는 것처럼 아닙니다. 코드가 실제로하는 일을 이해하는 것이 중요합니다. 코드가 다른 것이라고 생각한다면 나는 그것이 "정확하다"고 생각하지 않을 것입니다. –

0

네, 맞습니다. 당신은 내부 클래스와 함께 할 수 있습니다.

+0

설명이 없어도 답변이 가장 정확합니다. Android 프로그래머에게 Google은 ** 내부 인터페이스 [여기] (https://developer.android.com/guide/topics/ui/dialogs.html#PassingEvents)를 인스턴스화하는 ** 클래스의 예를 제공합니다. –

4

일반적으로 인터페이스에 대한 참조를 만들 수 있습니다. 하지만 당신은 인터페이스에 대한 인스턴스를 만들 수 없습니다.

0

예를 우리는 "익명 클래스는 코드를보다 간결하게 할 수 있도록 할 수 있습니다 그들은 선언과 동시에 클래스를 인스턴스화 할 수 있습니다 그들은 현지 클래스 같다. 그들은 이름이 없다는 것을 제외하고는 "- >>Java Doc

3

제 생각에는 인터페이스의 참조 변수를 만들 수는 있지만 추상적 인 클래스처럼 인터페이스의 인스턴스를 만들 수는 없습니다.

관련 문제