2013-07-14 3 views
3

안녕 난 그냥 내가 이것을 사용해야 할 때자바 생성자 체인

모두의
  1. 먼저 누군가가 설명해주십시오 수 ... 자바에 체인 생성자에 대한 학습과 몇 가지 질문을했다입니까? 내 머리 꼭대기에서 나는 심각하게 상황을 생각할 수 없다.

  2. 이 예제에서는 인수가없는 생성자 내에서 다른 생성자를 호출합니다. 어떻게이 새로운 "James Bond"객체에 액세스하여 나중에 사용할 수 있습니까?

    import java.util.*; 
    
    class Employee 
    { 
        private String name; 
        private double salary; 
    
        public Employee() 
        { 
         this("James Bond", 34000); 
        } 
    
        public Employee(String n, double s) 
        { 
         name = n; 
         salary = s; 
        } 
    
        public String getName() 
        { 
         return name; 
        } 
    
        public double getSalary() 
        { 
         return salary; 
        } 
    
        public static void main(String[] args) 
        { 
         Employee a = new Employee(); 
        } 
    } 
    
+0

체인을 연결했는지 여부와 관계없이 'Employee' 인스턴스가 하나만 생성됩니다. ctors를 연결하는 목적은 중복 된 논리를 방지하는 것입니다. 그러나 여러 ctor에서 호출 된 초기화 메소드를 사용할 수도 있습니다. –

답변

0

은 어떻게 향후 사용을 위해이 새로운 "제임스 본드"개체에 액세스합니까? 당신이 당신의 직원 클래스의 필드로 이름과 급여의 값을 저장하기 때문에

, 다음 직원 클래스 내에서 당신은 그 필드를 사용할 수 있으며, 당신의 직원 클래스 외부 당신은 당신의 직원 클래스의 게터/세터 Methos는 사용할 수 있습니다

+0

하지만 원래 개체는? 예를 들어 인수없이 생성자를 호출하면 "James Bond"객체뿐만 아니라 일반 객체도 만들어야합니다. – jimbo123

+2

. 단일 개체가 생성됩니다. 인수가없는 생성자는 with-args 생성자에 단일 객체를 만들기 위해 위임합니다. –

+0

오, 알지 못했습니다. – jimbo123

0
  1. 개체를 기본 값으로 구성 할 때마다 그리고 기본값 이외의 값으로 같은 개체를 만들 수있게하려고 할 때마다. DateTime 클래스를 상상해 봅시다. 기본적으로 현재 시간 또는 특정 시간으로 초기화 할 수 있습니다. Car 클래스를 상상해보십시오. 검정색을 기본 색상으로 사용하거나 특정 색상을 사용하여 색상을 구성하는 방법을 상상해보십시오. 이러한 상황은 매우 일반적입니다. 구체적인 예는 java.util.ArrayList 또는 java.util.Locale을 참조하십시오.

  2. name 필드에 저장됩니다. 따라서 개체 자체에서 this.name (this은 선택 사항이며 getName() 메서드와 마찬가지로)에 액세스합니다. 이 같은 생성자 체이닝

2

코드를 반복하지 않도록하는 데 유용하며, 유지 관리에 도움이 :

public MyClass(int x, double y, String z) { 
    // set fields 
} 

public MyClass() { // i.e. a constructor that uses default values 
    this(42, 4.2, "hello world"); // x is 42, y is 4.2, and z is "hello world" 
} 

우리가 (예를 들어 체인을 사용하는 방법과 x 인수를 변경을 원하지 않은 경우)가 MyClass의 인스턴스를 생성 할 때 처리되면 코드를 생성자로 변경해야합니다. 사슬로, 우리는 그들 중 하나만 바꾸면됩니다.

+0

잠깐 머리를 식힐 필요가 있습니다. 나는 왜 사람이 3 개의 인자를 가진 생성자를 사용할 수 없는지 아직도 이해하지 못한다. – jimbo123

+0

@ jimbo123 그들은 할 수 있습니다,하지만 왜 그들은 "기본"값으로 필드를 채우기를 원합니까? – arshajii

1

1) 다른 사람들은 코드 유지 관리를 위해 기본적으로 한 번만 코드를 작성한다는 것을 의미합니다. 즉 한 번만 편집하면되므로 코드를 편집 할 때 어떤 것을 간과 할 위험이 없습니다. 방법과 두 가지가 우연히 다른되고.

개인적으로 나는 이것을 귀하의 예와 다르게 사용하는 경향이 있습니다. 좋아요 :

이것은 세팅하는 사람이 클래스의 멤버를 설정하는 것보다 복잡한 방식 일 수 있기 때문에 좋은 방법입니다. 그래서 기본적으로 빈 생성자를 호출 한 다음 세터를 단일 메소드로 호출하여 클래스를 사용하는 모든 사용자가 훨씬 쉽게 만듭니다.

2) 호출되는 생성자가 전혀 다른 개체를 만들지 않으므로 개체를 만듭니다. new 키워드가 사용되지 않습니다.기본적으로 생성자 내부에서 다른 메서드를 호출하는 것뿐입니다. 단, 메서드가 생성자가되는 경우는 예외입니다.

5

사실 저는 체인 생성자의 가장 일반적인 사용은 생성자가 단순히 멤버 변수를 설정하는 것 이상의 일을한다고 생각합니다.

static int numOfExamples = 0; 
public Example(String name, int num) 
{ 
    this.name = name; 
    this.num = num; 
    numOfExamples++; 
    System.out.println("Constructor called."); 
    Log.info("Constructor called"); 
} 

public Example() 
{ 
    this("James Bond",3); 
} 

그런 식으로 생성자를 체인화하는 대신 정적 변수를 두 번 증가시키고 증가시키기위한 코드를 작성하지 않아도됩니다.