多态有三个必要条件,继承,重写,和父类引向子类;
重写为什么是必要条件?
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也照样可以输出(“叫了一声”)
那为什么重写必须是多态的必要条件,不重写不可以吗?
(子类是我特意不重写,一般来说要要重写。这个他的必要条件,但是我不重写,也照样可以实现。)
重写为什么是必要条件?
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也照样可以输出(“叫了一声”)
那为什么重写必须是多态的必要条件,不重写不可以吗?
(子类是我特意不重写,一般来说要要重写。这个他的必要条件,但是我不重写,也照样可以实现。)
也就是同样一件事,A做和B做应该不一样,否则A和B没必要存在,也就是子类一点意义都没有,用父类就够了,没必要定义子类,子类纯属多余的代码。
代理或者混入来实现。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{}