코드로 보자

class People {
    public void run() {System.out.println("사람임");}
}

class Batmans extends People {
    public void run() {System.out.println("배트맨임");}
}

class ironman extends People {
    public void run() {System.out.println("아이언맨임");}
}

우선 People를 선언하고 그 하위로 Batmans와 ironman을 박았따. 배트맨에 s는 왜 넣었는지 모르겠다.

public static void func(People people){
        people.run();
    }

    public static void main(String[] args){

        Batmans bat = new Batmans();
        ironman iron = new ironman();

        func(bat);
        func(iron);
    }

func는 매개변수로 People 객체를 받는다.

이후 main에서 Batmans와 ironman 객체를 생성해서 매개변수로 넣으면

실행이 된다.

결과값

배트맨임 아이언맨임

batmans와 iroman은 People을 상위로 상속 받는 객체이므로 People의 하위 클래스는 다 매개변수로 넣을 수 있다는거임;;

이게 System.out.print(Object x) 에도 마찬가지로 적용된다.

Object는 모든 클래스의 가장 상위클래스이므로 그 하위클래스인 int, char, String등을 넣어도 다 잘 받아 먹음!