java用接口实例化和直接实例化有什么区别?

Collection hs1 = new HashSet<>();
Set hs2 = new HashSet<>();
HashSet hs3 = new HashSet<>();

请问以上三种方法实例化出来的对象有什么区别?

    Collection<Character> hs1 = new HashSet<>();
    Set<Character> hs2 = new HashSet<>();
    HashSet<Character> hs3 = new HashSet<>();

hs1,hs2,hs3使用上没区别,都是创建了HashSet的对象。接口实例化是为了体现java的多态性,它的价值是在生产环境中体现出来的。
你应该看过这样的案例: Cat cat = new Cat(); Animal cal = new Cat(); 前面的只能体现cat只是cat,而后面能体现cat是animal

父类的接口定义的一般都是些公共的方法,具体的子类,实现类会有自己的业务方法,简单来说,就是父类引用接收子类的对象,有很多子类自己独有的方法是用不了的,子类引用接收子类自己的对象,除了父类的方法,自己独有的方法也可以用