Java的多态性就是体现在‘向上转型(父类指向子类的引用)’、‘继承’、‘重写’ 三个操作上,利用多态可以使得程序具有良好的扩展性,并可以对所有类对象进行通用处理。下面我们看具体实例:
1、我先定义了一个动物类:
//定义了动物类,动物可以做一些事
public abstract class Animal {
public void doSomething(){
//doSomething
}
}
2、接下来定义一个接口 叫声接口:
public interface GetCry{
public void cry();
}
3、下面造一个dog类:
public class Dog extends Animal implements GetCry{
@Override
public void cry() {
System.out.println("汪汪汪 汪汪!");
}
@Override
public void doSomething() {
System.out.println("我是小狗狗,我吃狗粮呀!");
}
}
4、接着造一个Duck类:
public class Duck extends Animal implements GetCry {
@Override
public void cry() {
System.out.println("嘎嘎嘎 嘎嘎");
}
@Override
public void doSomething() {
System.out.println("我是小鸭子,我吃鸭饲料呀!");
}
}
5、最后造一个Fish类:
//注意这里没有实现GetCry接口!!!
public class Fish extends Animal {
@Override
public void doSomething() {
System.out.println("我是小鱼儿,我吃鱼饲料呀!");
}
}
6、主方法调用:
public class Main {
public static void main(String[] args) {
//向上转型
GetCry dogCry=new Dog();
GetCry duckCry=new Duck();
dogCry.cry();
duckCry.cry();
//注意,鱼不会叫,所以不能调用cry
Fish fish=new Fish();
fish.doSomething();
}
}
运行结果如下:
7、几点解释说明:
(1):在接口中的方法必须被定义为 public 或者 abstract 形式,其他修饰权限不被java编译器认可,可以不写,但默认public。
(2):在接口中任何字段都是自动是 static 和 final。
(3):只要类中有一个抽象方法,则该类就被标记为抽象类,不能被实例化。
(4):如果抽象类被继承,则要实现所有的抽象方法。可用适配器解决。
(5):何为多态?
答:上面dogCry ,duckCry 都是GetCry类型的,但是调用cry()方法,得到的结果却不是一样的,有不同的行为!这就是多态。所以多态性离不开“继承”与“向上转型”与重写,首先明白一点,GetCry是一个接口,接口也是可以上转型操作的!!!切记!!!
(6):为何要另外写一个GetCry接口?一起写在Animal里面不好吗?
答:可以写在Animal里面,我们都知道,一旦继承抽象类就要实现所有抽象方法,但是我的 Fish 类并不需要实现 cry()方法,鱼儿是不会叫的呀!这写在Animal里面,不是强行实现了吗?强迫癌难受啊!所以将可选 行为用 接口实现,并且接口可以多重继承!
若有其他问题欢迎给博主留言哦!一定会回复您的,共同进步,相互探讨!