>  기사  >  Java  >  Java 기본 클래스 생성자 호출 설명(코드 포함)

Java 기본 클래스 생성자 호출 설명(코드 포함)

不言
不言앞으로
2018-10-08 15:03:412444검색

이 기사는 Java 기본 클래스 생성자 호출(코드 포함)에 대한 설명을 제공합니다. 이는 특정 참조 값을 가지고 있으므로 도움이 될 수 있습니다.

재사용 가능한 클래스에 관한 "Java 프로그래밍 생각" 7장에 이런 구절이 있는데, 생각해 볼 가치가 있습니다. 하위 클래스가 상위 클래스를 상속하는 경우 기본 클래스와 파생 클래스(하위 클래스)라는 두 클래스가 포함됩니다. 외부에서 보면 파생 클래스는 기본 클래스와 동일한 인터페이스를 가지며 일부 추가 메서드와 필드가 있는 새 클래스처럼 보입니다. 그러나 상속은 기본 클래스의 인터페이스만 복사하는 것이 아닙니다. 내보낸 클래스 개체를 만들 때 개체에는 기본 클래스의 하위 개체가 포함됩니다. 이 하위 개체는 기본 클래스를 사용하여 직접 만든 개체와 동일합니다. 외부, 기본 클래스 하위 개체의 하위 개체는 파생 클래스 개체 내부에 래핑됩니다.

이것은 매우 중요한 문제를 야기하며 기본 클래스 하위 객체의 올바른 초기화도 중요하며(하위 클래스의 기본 클래스에서 상속된 메서드와 필드를 사용할 수 있음) 메서드는 하나뿐입니다. 이를 확인하십시오. 초기화를 수행하려면 하위 클래스 생성자에서 기본 클래스 생성자를 호출하십시오.

매개변수 없는 기본 클래스 생성자

우리는 클래스에 대한 생성자를 제공하지 않으면 Java가 자동으로 매개변수 없는 생성자를 호출한다는 것을 알고 있습니다. 동시에 Java는 기본 클래스를 클래스의 생성자에 삽입합니다. 파생 클래스. 클래스 생성자 호출. 다음 코드는 이 작업 메커니즘을 보여줍니다.

//: reusing/Cartoon.java
// Constructor calls during inheritance.
import static net.mindview.util.Print.*;

class Art {
  Art() { print("Art constructor"); }
}

class Drawing extends Art {
  Drawing() { print("Drawing constructor"); }
}

public class Cartoon extends Drawing {
  public Cartoon() { print("Cartoon constructor"); }
  public static void main(String[] args) {
    Cartoon x = new Cartoon();
  }
} /* Output:
Art constructor
Drawing constructor
Cartoon constructor
*///:~

위 코드의 실행 결과를 관찰하세요. Cartoon 개체를 만들 때 해당 상위 클래스 Drawing의 생성자가 먼저 호출되고 해당 상위 클래스는 Art 클래스에서 상속됩니다. Art 클래스의 생성자는 레이어별로 올라가는 것과 같습니다. 상위 클래스 생성자가 생성자에서 명시적으로 호출되지 않더라도 Java는 자동으로 상위 클래스의 생성자를 호출합니다. Cartoon()에 대한 생성자를 만들지 않더라도 컴파일러는 기본 클래스의 생성자를 호출하는 인수가 없는 기본 생성자를 합성합니다.

매개변수가 있는 기본 클래스 생성자

기본 클래스의 생성자가 모두 매개변수를 갖는 경우 컴파일러는 이를 자동으로 호출하지 않습니다. super 키워드를 사용하여 기본 클래스 생성자를 명시적으로 호출하고 적절한 매개변수를 전달해야 합니다.

//: reusing/Chess.java
// Inheritance, constructors and arguments.
import static net.mindview.util.Print.*;

class Game {
  Game(int i) {
    print("Game constructor");
  }
}

class BoardGame extends Game {
  BoardGame(int i) {
    super(i);
    print("BoardGame constructor");
  }
}   

public class Chess extends BoardGame {
  Chess() {
    super(11);
    print("Chess constructor");
  }
  public static void main(String[] args) {
    Chess x = new Chess();
  }
} /* Output:
Game constructor
BoardGame constructor
Chess constructor
*///:~

위 코드에서 볼 수 있듯이 super를 사용하여 하위 클래스 Chess 생성자에서 부모 클래스 생성자를 명시적으로 호출하고 적절한 매개변수를 전달해야 합니다. 또한 기본 클래스 생성자를 호출하는 것은 하위 클래스 생성자에서 가장 먼저 수행되어야 합니다.

기본 클래스 생성자의 호출 순서

그 전에 먼저 객체 참조의 초기화 문제를 논의해 보겠습니다. Java에서는 클래스의 필드가 기본 유형인 경우 자동으로 0으로 초기화될 수 있지만 객체 참조는 null로 초기화됩니다. 적절한 위치에서 초기화해야 하는 경우가 많습니다. 초기화를 수행할 수 있는 여러 위치는 다음과 같습니다.

1. 개체가 정의된 위치입니다. 이는 생성자가 호출되기 전에 항상 초기화될 수 있음을 의미합니다.

2. 클래스 생성자에서.

3. 이러한 객체가 사용되기 직전에 이 방법을 지연 초기화라고 합니다.

위의 1번을 기억하세요. 기본 클래스 생성자의 호출 순서를 살펴보기 위해 더 복잡한 예를 살펴보겠습니다.

// reusing/Ex7/C7.java
// TIJ4 Chapter Reusing, Exercise 7, page 246
/* Modify Exercise 5 so that A and B have constructors with arguments instead
* of default constructors. Write a constructor for C and perform all 
* initialization within C's constructor. 
*/
 
import static org.greggordon.tools.Print.*;

class A { 
    A(char c, int i) { println("A(char, int)");} 
}

class B extends A {     
    B(String s, float f){
        super(' ', 0); 
        println("B(String, float)");
    } 
}

class C7 extends A { 
    private char c;
    private int i;
    C7(char a, int j) {     
        super(a, j); 
        c = a;
        i = j;
    }
    B b = new B("hi", 1f); // will then construct another A and then a B
    public static void main(String[] args) {
        C7 c = new C7('b', 2); // will construct an A first
    }
}

위 코드 출력:

A(char, int)

A(char, int)

B(String, float)

기본 클래스 생성자, 하위 클래스 생성자 및 멤버 개체에 주의하세요. 클래스 초기화 순서:

1. 클래스의 객체를 새로 만들 때 먼저 해당 상위 클래스 생성자를 호출합니다(매개변수가 없거나 매개변수화될 수 있으며 시스템은 자동으로 매개변수가 없는 생성자를 호출하므로 매개변수가 있는 경우 직접 지정해야 합니다). 위의 C7의 super(a, j)

2와 같습니다. 그런 다음 멤버 객체 초기화 문을 실행하고 위의
B b = new B("hi", 1f) 와 같이 클래스 B의 생성자를 호출하면 B의 생성자가 먼저 기본 클래스 A의 생성자를 호출합니다.

3. 마지막으로 C7의 생성자로 돌아가서 c=a,i=j를 계속 실행합니다.

위 내용은 Java 기본 클래스 생성자 호출 설명(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제