多态性是面向对象编程中四大特性之一,多态性是在继承性的基础上扩展出来的概念,可以实现父子类之间的转换处理。
在Java中主要有方法的多态性和对象的多态性。
方法的多态性:方法实现不同的功能
>>>方法的重载:同一个名称的方法可以根据传入的参数类型和个数的不同而实现不同的功能的执行。
>>>方法的覆写:同一个名称的方法可能根据子类的不同有不同的实现。
对象的多态性:父子类之间的转换处理
>>>对象向上转型:父类 父类实例=子类实例 //自动完成转型
比如有以下程序:
class Person{
public void getInfo(){
System.out.println("人类");
}
public Person(){
}
}
class child extends Person
{
@Override
public void getInfo(){
System.out.println("孩子");
}
public child(){
}
}
class man extends Person
{
@Override
public void getInfo(){
System.out.println("男人");
}
}
public class Demo{
public static void main(String args[]){
print(new child());
print(new man());
}
public static void print(Person msg){
msg.getInfo();
}
}
执行结果:

从上面结果我们就可以知道,对象向上转型的优点就是对于参数可以进行统一的设计,向上描述的是一些公共的特性。
当然我们上面的注方法代码可以如下设计,也可以实现同样的功能。
public class Demo{
public static void main(String args[]){
print(new child());
print(new man());
}
public static void print(child msg){
msg.getInfo();
}
public static void print(man msg){
msg.getInfo();
}
}
但是,当我们Person类的子类特别多的时候,是不是要添加特别多的重复代码?这样对程序的维护是不是更加困难?所以我们需要使用对象向上转型。
>>>对象向下转型:子类 子类实例=(子类)父类实例 //强制完成转换
比如以下程序:
class Person{
public void getInfo(){
System.out.println("普通人-----呼吸、吃饭、睡觉");
}
public Person(){
}
class man extends Person
{
public void getInfo1(){
System.out.println("男人---赚钱、上班");
}
}
public class Demo{
public static void main(String args[]){
Person per=new man();
per.getInfo();
man per1=(man)per;
per1.getInfo1();
}
}
执行结果:
从上面结果我们可以看出,向下转型的主要特点在于需要使用到一些子类自己特殊的定义,描述的是一些稀有的特殊的特性。
但是对象向下转型不是一件安全的事,比如以下程序:
public class Demo{
public static void main(String args[]){
Person per=new Person();
per.getInfo();
man per1=(man)per;
per1.getInfo1();
}
}
执行结果:
从结果可以知道,从一个没有对象向上转型的对象直接进行对象向下转换是会出现异常的,因此一定要谨慎。从实际的处理来看,大部分情况都是考虑对象的向上转型,在使用子类特殊功能(子类可以对父类进行功能扩充)的时候,要采用向下转型。
为此,我们在进行对象向下转型的过程中会判断某个实例是否是某个类的对象,这就需要使用instanceof语法来实现了。
基本语法:对象 instanceof 类 返回值为true 或 false
比如以下程序:
public class Demo{
public static void main(String args[]){
Person per=new Person();
System.out.println(per instanceof Person);
}
}
其结果直自然就是True了。