2014-09-25 4 views
-2

기본 생성자 유형은 무엇입니까? public/private/astract 등Java 클래스 생성자 문제

java의 생성자 유형을 변경할 수 있습니까?

개인용으로 생성자를 생성 할 때 클래스에 액세스 할 수없는 이유는 무엇입니까?

+5

"개인"이란 무엇을 의미한다고 생각하십니까? –

+0

private은 클래스에 대한 액세스 수정자를 의미합니다. –

답변

0

단일 생성자가 있고 private 인 경우 아무도 클래스의 개체를 만들 수 없다는 의미입니다. 그러나 클래스의 객체를 가져 오는 방법은 singletone을 사용하는 것입니다.

public class Foo { 

    private static Foo foo; 

    private Foo() { } 

    public static Foo getInstance() { 
     if (foo == null) { 
      foo = new Foo(); 
     } 
     return foo; 
    } 
} 
+1

첫 번째 문장이 정확하지 않습니다. ** 하나 ** 생성자가 있고 private 인 경우 외부 클래스는 클래스의 객체를 만들 수 없습니다. 그러나 클래스에는 여러 생성자가있을 수 있습니다.이 중 하나는 비공개이고 다른 하나는 호출자입니다. – ajb

+0

ajb 내 게시물을 업데이트했습니다. –

0

예 Java에서 생성자의 유형을 변경할 수 있습니다. 기본적으로 생성자는 public이 아닙니다. 기본 액세스 한정자가있는 클래스의 경우 생성자 액세스도 기본값입니다. 내부 클래스의 경우 클래스에 액세스 수정자를 사용할 수 있으므로 생성자를 정의하지 않는 한 생성자도 동일한 액세스 한정자를 갖습니다. 다른 액세스 한정자를 사용하는 경우

싱글 톤의 경우 개인이 사용됩니다. 이 경우 클래스 외부에서 클래스를 인스턴스화 할 수 없습니다. 예를 들어, 생성자의 기본 유형은 무엇 당신이 뭔가를 할 수있는 개인 생성자를 들어

하는 것처럼라고 싱글

public class Foo { 
    private Foo foo; 
    private Foo(){} // default you may not see it in the editor but is provided by complier 
    public static Foo getInstance(){ 
     if(foo==null) 
      foo=new Foo(); 
     return foo; 
    } 
} 
+0

기본적으로 생성자는 public이 아닙니다. 기본 액세스 수정자를 사용하는 클래스의 경우 생성자 액세스도 기본값입니다. 내부 클래스의 경우 클래스는 모든 액세스 수정자를 가질 수 있으므로 생성자를 정의하지 않는 한 생성자도 동일한 액세스 한정자를 갖습니다. 다른 액세스 한정자를 사용합니다 –

0

공공/사설/초록 등? 의 경우 default constructor 클래스의 액세스 가능성에 따라 달라지며 클래스가 public으로 선언 된 경우 기본 생성자가 public이됩니다. 클래스가 protected로 선언 된 경우 기본 생성자가 보호됩니다.
개인용으로 생성자를 생성 할 때 클래스에 액세스 할 수없는 이유는 무엇입니까? 생성자가 클래스 외부에서 표시되지 않기 때문에.

+0

그러나 매개 변수화 된 생성자를 만들면 클래스 외부에서 해당 생성자를 호출합니다. –

+0

@Altmish 생성자를 만들 때 적용 할 액세스 수정 자 (public/private/etc)의 유형이 달라질 것입니다. – sol4me

1

다음과 같은 방법으로 생성자를 정의 할 수 있습니다

  • public A()을 - 즉 다른 모든 클래스는 A 인스턴스를 만들 수 있다는 것을 의미한다.
  • protected A() - 보호 된 액세스는 A 인스턴스 또는 하위 클래스를 통해서만 액세스 할 수 있다는 것을 의미합니다. 단, 해당 하위 클래스에는 상위 항목의 구현이 관련된 경우에만 액세스 할 수 있습니다. See this post.
  • private A() - 즉, A 자체가 중첩 클래스 또는 캡슐화 클래스 이외의 클래스는 생성자를 호출 할 수 없습니다. 그것은 종종 싱글 톤을 만드는 데 사용됩니다. 정적 방법으로 개체가 생성된다

    public class A { 
    
        private static A instance; 
    
        // Make constructor private 
        private A() { } 
    
        public static A getInstance() { 
         // Create an instance if it is not yet created. 
         if (A.instance == null) { 
          A.instance = new A(); 
         } 
         return A.instance; 
        } 
    } 
    
  • A() - (공개 또는 개인 등) 액세스 개질제가 생략되는 경우, 그것이라고 패키지 개인. 패키지 전용 생성자는 동일한 패키지의 클래스 또는 해당 클래스의 하위 클래스에서만 액세스 할 수 있습니다.

There is a table 당신은 유용한 찾을 수 있습니다 : 어떤 수정는 당신이이 생략되고, 수정자를 선언하지 않는 것을 의미

   |Class | Package | Subclass | World 
public  | Y | Y  | Y  | Y 
protected | Y | Y  | Y  | N 
no modifier | Y | Y  | N  | N 
private  | Y | N  | N  | N 

있다.

+0

이것은 실제로 사실이 아닙니다. 'A' 클래스가 다른 클래스'B'에 중첩되면 B는 모든 A 클래스의 생성자가 private이더라도 A 클래스의 인스턴스를 생성 할 수 있습니다. [여기에서보십시오] (http : // ideone.com/eJqYIn) –

+0

@ IngoBürk 맞습니다. 알았어 고마워. 답변을 업데이트했습니다. –

1

당신은 어떤 접근 수정 자와 생성자 작성하는 경우 :

public class MyClass { 

    MyClass (int param) { 
     // constructor code 
    } 

} 

다음 접근성이 패키지 개인, 아니 액세스 한정자 어떤 방법의 접근성과 동일합니다. (JLS 6.6.1 : "액세스 수정 자없이 선언 된 클래스 멤버 또는 생성자는 암시 적으로 패키지 액세스 권한을 갖습니다.") 이것이 생성자의 기본 "유형"(실제로 기본 액세스 가능성)입니다. 이 예에서 package-private 생성자는 동일한 패키지의 클래스에서 new MyClass(10)을 사용할 수 있지만 패키지 외부에서는 사용할 수 없다는 것을 의미합니다.

다른 접근 방식과 마찬가지로 public, private 또는 protected과 같은 접근성 수정자를 추가 할 수 있습니다. 그러나 JLS 8.8.3에 따라 abstract과 같은 다른 수정자는 사용할 수 없습니다. 당신이 그것을 private 한 경우

후 생성자는 클래스 외부에서 사용할 수 없습니다 (또는, 중첩 클래스, 그것을 포함하는 최상위 클래스 외부),하지만 클래스 내부 을 사용할 수 있습니다. 이 클래스는 정말 생성자가 아닌 정적 팩토리 메소드를 정의 할 수 있음을 의미하지만 클래스의 개체를 구성하는 데 사용됩니다, 비슷한 관용구도 싱글 톤 클래스에 의해 사용되는

public class MyClass { 

    private MyClass(int param) { ... } 

    public static MyClass CreateObject(String something) { 
     // stuff 
     return new MyClass(n); 
    } 

} 

을하는 방법에 팩토리 메소드처럼 클래스의 인스턴스를 리턴하지만 단 하나의 인스턴스 만 작성되도록합니다.

개인 생성자

가 다른 생성자에 의해 사용할 수 있습니다

public class MyClass { 

    private MyClass(boolean isString, String stringParam, int intParam) { 
     // stuff 
    } 

    public MyClass(String stringParam) { 
     this(true, stringParam, -1); 
    } 

    public MyClass(int intParam) { 
     this(false, null, intParam); 
    } 

} 

당신이 private 생성자를 선언하고 수업 시간에 어디를 사용하지 않는 경우에, 그것은 종종 그의 유일한 클래스를 정의하는 데 사용되는 관용구이다 목적은 정적 유틸리티 메소드를 제공하는 것입니다. 정적 메서드를 호출 할 수는 있지만 클래스의 인스턴스를 만들 수는 없습니다.

+1

또한 다음과 같습니다. 중첩 클래스 인 경우 해당 클래스 외부에서 전용 생성자 *를 사용할 수 있습니다. [이 봐] (http://ideone.com/eJqYIn) –

+0

@ IngoBürk 그 사건을 잊어 버린 ... 편집했습니다. – ajb