수색…


소개

필수는 아니지만 Java의 생성자는 객체의 역할에 필수적인 클래스의 특정 값을 인스턴스화하기 위해 컴파일러에서 인식하는 메소드입니다. 이 항목에서는 Java 클래스 생성자의 올바른 사용법을 보여줍니다.

비고

Java 언어 사양에서는, 생성자의 시멘틱스의 정확한 성질에 대해서 이야기하고 있습니다. 그들은 JLS §8.8 에서 찾을 수 있습니다.

기본 생성자

생성자의 "기본값"은 인수가 없다는 것입니다. 어떤 생성자도 지정하지 않은 경우 컴파일러는 기본 생성자를 생성합니다.
즉, 다음 두 코드 조각은 의미 상 동일합니다.

public class TestClass {
    private String test;
}
public class TestClass {
    private String test;
    public TestClass() {

    }
}

기본 생성자의 가시성은 클래스의 가시성과 동일합니다. 따라서 패키지로 정의 된 클래스는 개인적으로 package-private 기본 생성자를 갖습니다

그러나 기본 생성자가 아닌 경우 컴파일러에서 기본 생성자를 생성하지 않습니다. 그래서 이것들은 동일하지 않습니다 :

public class TestClass {
    private String test;
    public TestClass(String arg) {
    }
}
public class TestClass {
    private String test;
    public TestClass() {
    }
    public TestClass(String arg) {
    }
}

생성자가 비표준 초기화를 수행하지 않도록주의하십시오. 이것은 이니셜 라이저가없는 경우 클래스의 모든 필드가 기본값을 가짐을 의미합니다.

public class TestClass {

    private String testData;

    public TestClass() {
        testData = "Test"
    }
}

생성자는 다음과 같이 호출됩니다.

TestClass testClass = new TestClass();

인수가있는 생성자

생성자는 모든 종류의 인수로 생성 될 수 있습니다.

public class TestClass {

    private String testData;

    public TestClass(String testData) {
        this.testData = testData;
    }
}

이렇게 호출 :

TestClass testClass = new TestClass("Test Data");

클래스는 서명이 다른 여러 생성자를 가질 수 있습니다. 인스턴스 생성시 같은 클래스의 다른 생성자를 호출하여 생성자 호출을 체인화하려면 this() 사용 this() .

public class TestClass {

    private String testData;

    public TestClass(String testData) {
        this.testData = testData;
    }

    public TestClass() {
        this("Test"); // testData defaults to "Test"
    }
}

이렇게 호출 :

TestClass testClass1 = new TestClass("Test Data");
TestClass testClass2 = new TestClass();

상위 생성자 호출

Parent 클래스와 Child 클래스가 있다고 가정 해보십시오. Child 인스턴스를 생성하려면 항상 Child 생성자의 gebinning에서 실행되는 일부 상위 생성자가 필요합니다. 첫 번째 Child 생성자 문으로 적절한 인수를 사용하여 super(...) 를 명시 적으로 호출하여 원하는 부모 생성자를 선택할 수 있습니다. 이렇게하면 Child 클래스의 생성자에서 동일한 코드를 다시 작성하는 대신 Parent 클래스의 생성자를 다시 사용하여 시간을 절약 할 수 있습니다.

없이 super(...) 방법 :

(암묵적으로, no-args 버전 super() 는 보이지 않게 호출됩니다)

class Parent {
    private String name;
    private int age;
    
    public Parent() {} // necessary because we call super() without arguments
    
    public Parent(String tName, int tAge) {
        name = tName;
        age = tAge;
    }
}

// This does not even compile, because name and age are private,
// making them invisible even to the child class.
class Child extends Parent {
    public Child() {
        // compiler implicitly calls super() here
        name = "John";
        age = 42;
    }
}

함께 super() 방법 :

class Parent {
    private String name;
    private int age;
    public Parent(String tName, int tAge) {
        name = tName;
        age = tAge;
    }
}

class Child extends Parent {
    public Child() {
        super("John", 42);   // explicit super-call
    }
}

참고 : 다른 생성자 (체인) 또는 슈퍼 생성자는 생성자 내부의 첫 번째 문이어야에 호출합니다.

super(...) 생성자를 명시 적으로 호출하면 일치하는 상위 생성자가 있어야합니다 (간단합니다.).

super(...) 생성자를 명시 적으로 호출하지 않으면 부모 클래스에 인수가없는 생성자가 있어야하며 부모 클래스가 제공하지 않으면 명시 적으로 작성되거나 컴파일러에서 기본값으로 생성 될 수 있습니다 모든 생성자.

class Parent{
    public Parent(String tName, int tAge) {}
}

class Child extends Parent{
    public Child(){}
}

Parent 클래스에는 기본 생성자가 없으므로 컴파일러는 Child 생성자에 super 를 추가 할 수 없습니다. 이 코드는 컴파일되지 않습니다. 양측에 맞게 생성자를 변경하거나 다음과 같이 자신 만의 super 콜을 작성해야합니다.

class Child extends Parent{
    public Child(){
          super("",0);
    }
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow