浅谈java多态
多态
顾名思义,多种形态的意思。官方解释是:多态是同一个行为具有多个不同表现形式或形态的能力。拿我们日常见到的事物举个栗子,比如父类是打印机,子类分为彩色打印机、黑白打印机3D打印机,但他们都是打印机类的,这就是多态。
多态的三个条件(必须)
- 继承
- 重写
- 父类引用指向子类对象
多态的实现方式
方式一:重写:
方式二:接口
方式三:抽象类和抽象方法
多态的分类
多态一般分为两种:重写式多态和重载式多态。
重载式多态,也叫编译时多态。也就是说这种多态再编译时已经确定好了。重载大家都知道,方法名相同而参数列表不同的一组方法就是重载。在调用这种重载的方法时,通过传入不同的参数最后得到不同的结果。
但是这里是有歧义的,有的人觉得不应该把重载也算作多态。因为很多人对多态的理解是:程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,这种情况叫做多态。 这个定义中描述的就是我们的第二种多态—重写式多态。并且,重载式多态并不是面向对象编程特有的,而多态却是面向对象三大特性之一,我觉得大家也没有必要在定义上去深究这些,我的理解是:同一个行为具有多个不同表现形式或形态的能力就是多态,所以我认为重载也是一种多态,如果你不同意这种观点,我也接受。
重写式多态,也叫运行时多态。这种多态通过动态绑定(dynamic binding)技术来实现,是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。也就是说,只有程序运行起来,你才知道调用的是哪个子类的方法。 这种多态通过函数的重写以及向上转型来实现,我们上面代码中的例子就是一个完整的重写式多态。我们接下来讲的所有多态都是重写式多态,因为它才是面向对象编程中真正的多态。
下面我们来写个简单的多态例子:
public class DuoTai {
public static void main(String[] args) {
parent parent =new son(); //通过子类实例化对象
parent.myPrint();
}
}
class parent {
public void myPrint(){
System.out.println("我是父");
}
}
class son extends parent{
public void myPrint(){
System.out.println("我是子");
}
}
创建了两个类,父类拥有myPrint方法,子类继承父类。重写父类的myPrint方法。然后在main方法里通过子类实例化对象,父类引用指向子类对象,然后调用的是子类重写的myPrint方法,输出的是“我是子”。
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
向上转型
类型转换,从右到左看。看我们上面这个例子,用右->左看,就是son转为parent,从小到大,从子到父,父类引用指向子类对象就是向上转型。
向下转型
向下转型就是从大到小的过程,可以调用子类独有的方法,而向上转型会报错,来看下面的例子
很明显,向上转型会报错,不可以调用子类独有的方法。让我们来看看向下转型
直接这样向下转型的写,然后调用eat方法会报错,提示不能转换,因为java里的安全性问题,你得先实现向上转型,再实现向下转型
public class DuoTai {
public static void main(String[] args) {
Partent partent =new Son();
Son son =(Son)partent;
son.eat();
}
}
class Partent {
public void myPrint(){
System.out.println("我是父");
}
}
class Son extends Partent{
public void myPrint(){
System.out.println("我是子");
}
public void eat(){
System.out.println("子类在吃饭");
}
}
关于java的多态就说到这里了,如有不足之处,欢迎指正!
感恩能与大家在华为云遇见!希望能与大家一起在华为云社区共同成长。
- 点赞
- 收藏
- 关注作者
评论(0)