多态有三个必要条件,继承,重写,和父类引向子类;
重写为什么是必要条件?
public class animal {
public void shou() {
 System.out.println("叫了一声");
}
}
public class cat extends animal{
 //什么都没有
}
public class dog extends animal {
 //什么都没有}
public class test {
 public static void main(String[] args) {
 animal a=new animal();
 animalcry(a);
 cat b=new cat();
 animalcry(b);
 dog c=new dog();
 animalcry(c);
 }
 static void animalcry(animal a) {
 a.shou();
 }
}
子类没有重写,一样实现了多态。为什么还说重写是必要条件呢?
子类dog继承了父类的shout方法,就算子类不重写父类的方法shout()。
dog.shout也照样可以输出(“叫了一声”)
那为什么重写必须是多态的必要条件,不重写不可以吗?
(子类是我特意不重写,一般来说要要重写。这个他的必要条件,但是我不重写,也照样可以实现。)

解决方案 »

  1.   

    子类没重写,调用shou都是同样的处理,也就是不管阿猫阿狗,shou都一样,没有体现多样化。而多态的意义就在于调用同样的方法,但处理不一样,这才达到所谓的多样化。
    也就是同样一件事,A做和B做应该不一样,否则A和B没必要存在,也就是子类一点意义都没有,用父类就够了,没必要定义子类,子类纯属多余的代码。
      

  2.   

    Java中使用继承的主要目的就是为了多态,而从父类继承方法实现,达到重用的目的是副作用。这种代码复用其实更适合使用
    代理或者混入来实现。Java中的接口的设计目的就能够实现混入,作为标示类型。如果一个类继承了一个类,实现了多个接口,那么它应该用于表示被继承类的类型,这是一种设计原则。但是由于Java语言在接口方面的特点(其实就是一种没有方法实现的抽象类,在Java8以后,可以有具体实现了),也可以根据上下文表示多态关系。这个方面东西有点庞杂,我也不乱歪歪了。
    不过一个类一旦继承了另一个,如果不进行任何重写,那么为什么要继承呢?这还是从设计角度来说的。
    实践中就是有很多玩法就是要挑战人类的智商,比如:
    public class UseList {
    public static void main(String[] args) {
    List<String> wiredList= new MyList(); if(wiredList instanceof MyList){
    wiredList.add("I'm so wired,don't do like this.");
    } System.out.println(wiredList.size());
    }
    }class MyList extends ArrayList{}
    MyList使用了继承,而只是为了实现一个动态类型判断,这绝对不是一个好的实践。这种情况恰恰是接口应该做的事情。
    public class UseList {
    public static void main(String[] args) {
    MyList<String> wiredList= new MyList<>(); if(wiredList instanceof AInterface){
    wiredList.add("I'm so wired,don't do like this.");
    } System.out.println(wiredList.size());
    }
    }class MyList<E> implements AInterface {
    private List<E> innerList= Collections.synchronizedList(new ArrayList<>()); public void add(E e){
    innerList.add(e);
    } public int size(){
    return innerList.size();
    }}interface AInterface{}