개어려븜
[JAVA/자바] 상속에서의 생성자
이전 포스팅에서 상속에 대해서 알아보았다. 상속은 부모 클래스의 메소드 및 필드를 물려받는다고 하였다....
blog.naver.com
이 분 블로그 참조하니 이해가 아주 잘됨
요약
1. 부모 클래스의 생성자는 상속되지 않고, 자식 클래스로 인스턴스를 생성할 때 자동적으로 부모의 기본 생성자가 호출된다.
2. 부모 생성자가 매개변수를 갖고 있다면 자식 클래스를 인스턴스화할 때 자동으로 호출되지 않는다.
3. 따라서 자식 생성자에서 명시적으로 부모 생성자를 호출해야 한다. 이때 사용되는 키워드가 super(); 이다. 단, super()를 사용할 때는 자식 생성자의 첫 줄에 위치하여야 한다.
위 링크에서 퍼왔어요 이 부분
========================================
주의 할 점!
생성자 this() 와 생성자 super()를 함께 사용 불가함
=> 두 코드 둘다 생성자 내의 첫줄에서 실행되어야 하기 때문
=> 그래서 this()를 사용하는 생성자에는 super()를 생성하지 않고 다른 생성자를 통해
간접적으로 생성자 super()이 호출되도록 해야함
* 그리고 항상 슈퍼클래스에서는 object라는 기본 생성자를 호출하는 코드가 생략되어 있음
(super())
class Parent{
String name;
//멤버변수 name을 전달받아 초기화하는 생성자 정의 파라미터 생성
public Parent(String name){
super(); //Parent클래스의 부모인 Object의 기본생성자를 호출하는 코드(생략 가능)
this.name = name;
}
}
class Child extends Parent{
//Child 클래스의 기본 생성자 정의
public Child(){
super("홍길동");
System.out.println("Child()생성자 호출됨!);
}
//이름을 전달받는 파라미터 생성자 정의
public Child(String name){
//여기서 멤버변수를 초기화하면
//슈퍼클래스의 파라미터 생성자와 초기화 코드가 중복된다.
//따라서, 슈퍼클래스의 멤버변수를 초기화하는 생성자를 대신 호출해
//데이터만 전달함으로써 슈퍼클래스 생성자에서 대신 초기회 = 중복제거
super("홍길동"); //슈퍼클래스의 파라미터 생성자를 통해 대신 초기화
//또한, 슈퍼클래스의 생성자를 호출하게 되므로 오류 x
}
}
출력하면 Child()생성자 호출됨 나옴
그 다음에 홍길동 <= 뒤에 자식클래스에서 멤버변수 초기화해서
2.
class Person{
String name;
int age;
//1. 기본 생성자 정의
public Person(){}
//2. 파라미터 생성자 정의
public Person(String name){
this(name,20);
}
public Person(String name, int age){
super();
this.name=name;
this.age=age;
}
}
class Student extends Person{
String id;
//이름, 나이, 학번을 초기화하는 파라미터 생성자 호출해 초기화 대신 수행
public Student(){
this("홍길동",20,"20111111");
//생성자 super과 this를 한꺼번에 사용 불가하므로
//생성자 super코드를 실행하지 않고 생성자 this()를 호출해
//다른 생성자 내의 생성자 super()가 실행되도록 함
}
public Student(String name, int age, String id){
super(name,age);
this.id=id;
//슈퍼클래스의 Person 파라미터 생성자에서 이미 멤버변수 초기화 코드가 있으므로
//서브클래스에서 직접 초기화할 경우 중복 발생
//=> 슈퍼클래스의 멤버 id 만 서브클래스에서 초기화하고
//나머지는 생성자를 호출해 대신 초기화함
}
}
'develop > Java' 카테고리의 다른 글
instanceof 연산자,동적바인딩 (0) | 2021.03.08 |
---|---|
레퍼런스 형변환 (0) | 2021.03.08 |
메서드 오버라이딩(Method Overriding) (0) | 2021.03.03 |
접근 제한자(Access Modifier) (0) | 2021.03.01 |
상속(Inheritance) (0) | 2021.03.01 |