부모의 private 멤버 변수는 자식이 직접 접근할 수 있을까?
답은 No다.자식 객체가 생성되면, 부모 객체는 생성 될까?
답은 Yes다
이를 검증하기 위해 코드를 짜보자.
예시코드
부모 클래스
1 | public class Parent { |
부모 객체가 생성되면, 부모 생성 문구를 출력하도록 했다.
그리고 접근 지시자 별 문자열을 멤버로 가지고 있다.
자식 클래스
1 | public class Sub extends Parent{ |
자식 객체는 생성자만 가지고 있다.
이때 자식클래스는 부모의 private 멤버 변수와 생성자를 상속받지 않는다.
즉 privateString을 제외한 멤버변수를 자식 클래스도 직접 접근 가능하다.
자식 객체를 생성하면, 자식의 생성자가 실행된다. (이때, super()에 의해 부모 생성자 먼저 실행된다!)
그렇다고 자식 객체를 만들 때, 부모 객체와 자식 객체가 각각 생기는 게 아니다.
자식 객체를 만들어도 하나의 객체를 가진다.
다만 자식 객체가 생성 되기 전에 부모 객체가 생성되고, 부모 객체의 멤버가 초기화된다.
그 다음 자식 생성자가 실행되면서 부모 객체가 생성된 것에 자식 객체가 추가로 씌여진다.
쉽게말하면 (Object 객체 생성자 실행 -> 부모 객체 생성자 실행 -> 자식 객체 생성자 실행) 이런 식으로 실행되고,
이 세가지 클래스에 있는 멤버들은 한 객체(자식)에 초기화된다.
그렇다면 다음 코드를 실행하면?
1 | public class Application { |
다음과 같다!
1 | Parent! |
참고 사이트
https://stackoverflow.com/questions/23093470/java-order-of-initialization-and-instantiation