상속
root
| |
A B
| |
C D
형태라면 ? Root r = new A,B,C,D()가능하다.
A = new C() 가능
A = new root() 불가능 // 부모가 자식을 만들 순 있지만 제약이 따름.
C = new A,root() 불가능. //자식이 부모를 만들 순 없음.
Animal.java
public class Animal {
String name;
public void setName(String name) {
this.name = name;
}
}
Dog.java
public class Dog extends Animal {
public void sleep() {
System.out.println(this.name+" zzz");
}
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("poppy");
System.out.println(dog.name);
dog.sleep();
}
}
https://hyeonstorage.tistory.com/186 이거 무조건 봐라 ( 객체 타입 )
부모타입 = 자식객체 ( 오버라이딩해서 메소드 씀)
즉, 자식 메소드 사용, 부모 변수 사용
IS-A 관계
Dog클래스는 Animal클래스를 상속받았다. 즉, Dog는 Animal의 하위 개념이라고 할 수 있겠다. 이런 경우 Dog는 Animal에 포함되기 때문에 "개는 동물이다"라고 표현할 수 있다.
자바는 이러한 관계를 IS-A 관계라고 표현한다. 즉 "Dog is a Animal" 과 같이 말할 수 있는 관계를 IS-A 관계라고 한다
Animal dog = new Dog(); //개(설계도)로 만든 객체는 동물 자료형이다
Dog dog = new Animal();
// 컴파일 오류: 부모 클래스로 만든 객체는 자식 클래스의 자료형으로 사용할 수 없다.
// 자식 자료형 X = new 부모클래스(); // 부모(설계도)로 자식의 자료형을 만들 수 없다.
//
Animal dog = new Dog();
// 부모 자료형으로 만든 개는 개의 설계도로 만들었다.
Root r = new 1,2,3,4() 된다. 로 외우자.
상속의 완전한 이해 완료..
하지만, 아직 멤버객체에 대한 이해 필요.
객체변수(인스턴스 및 클래스 변수)는 오버라이딩 되지 않는가? 네, 객체 타입을 따라갑니다.
https://kldp.org/comment/512939#comment-512939
재밌는 코드 공유
인스턴스 변수는 heap에 생긴다.
일단은 부모의 변수는 오버라이딩 되지않고 부모의 것을 취한다라고 이해했다.
http://superjang.com/archives/3095 나름 잘 설명했다.
public class jungwon {
static class A
{
int d = 1;
int method() {
return 3;
}
}
static class B extends A
{
int d = 2;
int method() {
return 3;
}
}
static class C extends B
{
int d = 3;
int method() {
return 3;
}
}
public static void main(String[] args) {
A a = new C();
B b = new C();
C c = new C();
System.out.println(a.method() + b.method() + c.method());
System.out.println(a.d + b.d + c.d);
}
}
정답은: 9 , 6이다.
// 변수는 참조타입을 따른다.
'개발 및 언어 > 자바' 카테고리의 다른 글
자바 추가필요부분 + 참고문헌 및 기타지식 (0) | 2020.02.09 |
---|---|
오버라이딩 vs 오버로딩 [다형성] (0) | 2020.02.09 |
추상클래스 및 인터페이스 (0) | 2020.02.09 |
JAVA_ 클래스와 메소드 (0) | 2020.01.20 |
자바 환경(JDK, JRE) 및 JVM구조 (0) | 2020.01.20 |