class Cake { public void sweet() { } } class CheeseCake extends Cake { //Cake 에서 상속 public void milky(){ } }
public class CheeseCakeTest { public static void main(String[] args) { CheeseCake ca1 = new CheeseCake(); Cake ca2 = ca1; //위는 문제없이 가능 Cake ca3 = new CheeseCake(); CheeseCake ca4 = ca3; //자식이 부모에 못담김
% super 는 부모용이다
class Cake { public void yummy() { System.out.println("Yummy Cake"); } } class CheeseCake extends Cake { public void yummy() { System.out.println("Yummy Cheese Cake"); //자식인 치케가 케익에 오버라이딩했다 } }
public class CheeseCakeTest { public static void main(String[] args) { Cake c1 = new CheeseCake(); CheeseCake c2 = new CheeseCake(); c1.yummy(); c2.yummy();
heap 에는
c1.yummy(); 가 호출될때
heap 에 담겨있는
yummy cheese cake 의 주소값을 주게된다.
함수 오버라이딩이라고 한다.
인스터스 변수와 클래스 변수등에는 영향없다
sumArea = 0; Shape[] shape = new Shape[3]; shape[0] = new Circle(0); shape[1] = new Triangle(10,10); for (Shape s : shape) { sumArea += s.getArea(); }
shape 배열안에 각 방들이 생긴다
칸마다 주소값이 있고
+= s.getArea(); 가 실행될때마다 메모리에 생성되고,
각 반복회가 끝나면 사라진다.
lass addFunction{ static double getArea(Circle circle){ return circle.getArea(); } static double getArea(Triangle triangle){ return triangle.getArea(); } //위의 두개와 아래하나가 같다
//아래 하나로 끝난다 static double getArea(Shape shape){ return shape.getArea(); } }
class Box { public void simpleWrap() { System.out.println("Simple Wrapping"); } } // class PaperBox extends Box { public void paperWrap() { System.out.println("Paper Wrapping"); } } // class GoldPaperBox extends PaperBox { public void goldWrap() { System.out.println("Gold Wrapping"); } }
public static void main(String[] args) { Box box1 = new Box(); PaperBox box2 = new PaperBox(); GoldPaperBox box3 = new GoldPaperBox(); // wrapBox(box1); wrapBox(box2); wrapBox(box3); } public static void wrapBox(Box box) { //box 가 메모리에 올라가면서, if (box instanceof GoldPaperBox) { //해당주소값이 생기는 방이 생긴다 //해당주소찾아가서 인스턴스가 있으면 true ((GoldPaperBox)box).goldWrap(); } else if (box instanceof PaperBox) { ((PaperBox)box).paperWrap(); } else { box.simpleWrap(); } }