프로그래밍/Java

Java - 오버로딩시 주의사항

seungdols 2015. 9. 15. 14:32
public class AttentionOverloading {
    public static String classify(Set s)
    {
        return "Set";
    }
    public static String classify(List lst)
    {
        return "List";
    }
    public static String classify(Collection c)
    {
        return "Collection";
    }

    public static void main(String[] args) {
        Collection[] collections = {
                new HashSet(),
                new ArrayList(),
                new HashMap().values()
        };
        for(Collection c : collections)
        {
            System.out.println(classify(c));
        }
    }
}

컴파일 시점 자료형은 전부 collection<?>으로 동일 하기에 그러한 결과를 나타낸다.
오버로딩된 메서드는 정적으로 선택 되지만, 이 와 반대로 재정의 된 메서드는 동적으로 선택 된다.

class Wine{
    String name() {return "wine";}
}
class SparklingWine extends Wine{
    @Override String name() {return "sparkling wine";}
}
class Champagne extends SparklingWine{
    @Override String name() {return "champagne";}
}
public class DynamicChoice {
    public static void main(String[] args) {
        Wine[] wines ={
                new Wine(),
                new SparklingWine(),
                new Champagne()
        };
        for(Wine wine : wines)
        {
            System.out.println(wine.name());
        }
    }
}
반응형