참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.
package chapter7;
public class Example1_Buyer {
public static void main(String[] args) {
class Product {
int price; //제품가격
int bonusPoint; //보너스 점수
Product(int price, int bonusPoint){ //생성자
this.price = price;
this.bonusPoint = bonusPoint;
}
}
-----------------------------------------------------//class Tv
class Tv extends Product {
Tv() {
this(500,50); //밑에 있는 생성자 호출
}
Tv(int price, int bonusPoint) {
super(price, bonusPoint); // 조상 생성자 호출
}
}
-----------------------------------------------------//class Computer
class Computer extends Product {
Computer() {
this(200,20); //밑에 있는 생성자 호출
}
Computer(int price, int bonusPoint) {
super(price, bonusPoint); // 조상 생성자 호출
}
}
-----------------------------------------------------//class Buyer
class Buyer { //물건 사는 사람
int money = 1000; //소유금액
int bonusPoint = 0; //보너스점수
void buy(Product p) { <---- //자손타입의 인스턴스 넘겨 줄 수 있다!!!
money = money - p.price;
bonusPoint += p.bonusPoint;
}
}
=======================================================//결과 확인
Buyer b = new Buyer(); //Buyer 인스턴스 생성
System.out.println(b.money); // 소유금액 1000원
Tv tv = new Tv(); //Tv 인스턴스 생성
Computer com = new Computer(); //Com 인스턴스 생성
b.buy(tv); //buy메서드에 tv인스턴스를 넣어서 호출
System.out.println("소지금 : "+b.money); //소지금 : 500
System.out.println("보유 보너스 : "+b.bonusPoint); //보유 보너스 : 50
b.buy(com); //buy메서드에 com인스턴스를 넣어서 호출
System.out.println("소지금 : "+b.money); //소지금 : 300
System.out.println("보유 보너스 : "+b.bonusPoint); //보유 보너스 : 70
}
}
비슷한 경우
Product p1 = new Tv();
Product p2 = new Computer();
product p3 = new Audio();
void buy(Product p) { }