【Java】상속한 클래스를 인스턴스화했을 때의 이미지

6514 단어 자바 입문자바

소개



자바 실버 공부하는 동안????가 된 것을 스스로 새기는 메모

이번????이 된 문제



※저작권이 있는지 확실하지 않지만 무서워서 그대로는 아닙니다.

패키지 구성
test1
┗Human.java
test2
┗Engineer.java
┗Main.java

Human.java
package test1;

public class Human {
  private String name;

  protected String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

Engineer.java
package test2;

import test1.Human;

public class Engineer extends Human {
}

Main.java
package test2;

public class Main {
  public static void main(String[] args) {
    Engineer e = new Engineer();
    e.setName("おなまえ");
    System.out.println(e.getName());
  }
}

Main.java 실행 결과
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    メソッド getName() は型 Human で不可視です

    at test2.Main.main(Main.java:7)

소스를 쫓아보기



· Human 클래스 정의
private의 필드 name을 Getter, Setter로 사용하는 DTO와 같은 클래스

· Engineer 클래스 정의
Human 클래스를 상속 (한 것만)

・Main 클래스
main 메소드로 Engineer 클래스를 인스턴스화
Setter로 값 설정
Getter로 값을 가져와 출력 (하려고 컴파일 에러 (왜!))

 

당시의 사고 회로




·아!!! Getter가 protected가 되어 있다
· 즉, Getter에 액세스 할 수 있는지의 문제,,,
· protected는 서브 클래스 또는 동일한 패키지에서 사용할 수 있습니다 ...
· Main과 Engineer 클래스는 같은 패키지 ...
· 대답은 설정 한 값이 그대로 출력됩니다.

Main.java 실행 결과
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    メソッド getName() は型 Human で不可視です

    at test2.Main.main(Main.java:7)

(격침)

어디가 잘못되었는가



· protected는 서브 클래스 또는 동일한 패키지에서 사용할 수 있습니다 ...
이와 함께
Engineer e = new Engineer(); 때 어떤 인스턴스가 생성되고 있는가.

실제 움직임


Engineer e = new Engineer();

실행하면,

대신(중요),


이렇게 되어 있다.

Engineer 클래스에 Human 클래스의 내용이 복사되어 인스턴스화(위)되는 것이 아니라,
Human 클래스와 Engineer 클래스의 성질을 겸비한 인스턴스가 생성되고 있다(아래).

그래서 오류가있는 곳은

이렇게 되어 있다.

에러 메세지에도 「메소드 printInfo() 는 타입 Human 로 불가시입니다」라고 되어 있으므로,
getName()은 역시, Human 클래스의 것이 되어 있는 것 같습니다.

Getter를 공개로 사용



Human.java
package test1;

public class Human {
  public String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

Main.java 실행 결과
おなまえ

할 수 있었다.

여담



Human 클래스를 익명 패키지에 넣으면 원래 액세스할 수 없습니다.
익명 패키지에 어떤 패키지에서 액세스할 수 없기 때문에,

Human.java
test2
┗Engineer.java
┗Main.java

좋은 웹페이지 즐겨찾기