文章目录
前言
本文主要介绍多态,实现多态的条件,及简单的代码举例。
一、多态是什么?
多态是面向对象的第三大特性,用一句话概括来讲就是父类型的变量可以引用子类型的变量,是基类型对象访问派生类重写的方法,意味着父类型的变量可以引用子类型的对象。使用父类对象的对方都可以使用子类的对象。
二、实现多态
实现多态中有三个必要条件:
继承:必须存在有继承关系的子类和父类;
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。
1.有继承关系(或通过接口实现)
在这里特此强调子类并不是父类简简单单的子集,子类包含父类所有的类成员,同时还有自己特有的成员变量,所以子类通常包含比父类更多的类成员。
2.要有方法重写
方法重写即在子类中创建了一个与父类中名称相同,返回值类型相同,参数列表的方法相同,只是方法中的实现不同,以实现不同于父类的功能。
当子类和父类在同一个包中,子类可以重写父类中除了声明为private和final方法的方法。
当子类和父类不在同一个包中,子类只能重写父类中声明为public和protected的非final的方法。
3.向上转型
向上转型简单来说就是一个子类类型的对象赋值给一个父类类型的变量,同时注意不要强制转型;向上转型后父类引用不能调用子类自己的方法。
父类类型变量=new 子类类型() 例:People gulf=new male();
在Java中也存在向下转型,但平常应用得的次数并不多,其存在类型转换异常的风险,且实现向下转型之前必须先向上转型,可以用instanceof关键字防止类型转换异常的出现。
下面举多态的一个简单的例子:
package fourth;
public class work {
public static void main(String[] args) {
male mew=new male();
mew.love();
People gulf=new male(); //父类引用指向子类对象,最终结果会实现子类的方法
gulf.love();
}
}
class People{
public void love() {
System.out.println("love all");
}
}
class male extends People{ //即前文提到的要实现多态必须包含继承关系
public void love() { //即前文提到的要实现多态必须要有方法重写
System.out.println("mewgulf love each other forever");
}
}
两个运行的结果均为“mewgulf love each other”。
下面举一个稍微复杂点的例子:
package fourth;
public class work {
public static void main(String[] args) {
People mew=new Nong();
mew.love();
Nong gulf=(Nong)mew;
gulf.like();//调用特有的方法
}
}
class People{
public void love() {
System.out.println("mew loves gulf");
}
}
class Nong extends People{
@Override
public void love() {
System.out.println("gulf loves mew");
}
public void like() {
System.out.println("mew loves gulf");
}
}
运行的结果为“gulf loves mew
mew loves gulf”
由上文的例子我们可以很清楚地感受到使用多态的好处,即可以当做形式参数,可以接受任意子类对象,但多态也存在着弊端,即不能使用子类特有的属性和行为。
总结
本文仅仅简单介绍多态的使用,和需要实现多态的前提条件,仅供参考。
最后注意,引用变量也可以是多态的,即它可以存放不同类对象的地址,只要这些类是它声明的对象即可。