多态性是面向对象三大特征的最后一个,其含义就是对象,方法多种形式的表现。多态性又分为方法的多态性和对象的多态性。
1.方法的多态性
- 重载:同一个方法的名称,根据不同的参数类型和个数可以实现不同的功能;
- 覆写(重写):同一个方法,根据实例化子类对象的不同,所完成的功能不同。
程序示例:
class A{
public void print(){
System.out.println("A中的print方法!");
}
}
class B extends A{
public void print(){ //子类覆写了父类的print方法
System.out.println("B中的print方法!");
}
}
public class TestDemo{
public static void main(String args[]){
B b = new B();
b.print();
}
}
程序执行结果:B中的print方法!
注意事项:
- 观察实例化的是哪一个类的对象,(new B()实例化B类对象);
- 观察调用的方法是否被子类覆写,如果被覆写,调用子类中覆写的方法,否则调用父类方法。
2.对象的多态性
- 向上转型:子类对象转换为父类对象,格式:父类 父类对象 = 子类实例,自动转换;
- 向下转型:父类对象转换为子类对象,格式:子类 子类对象 = (子类)父类实例,强制转换。
程序示例(向上转型,自动完成):
class A{
public void print(){
System.out.println("A中的print方法!");
}
}
class B extends A{
public void print(){ //子类覆写了父类的print方法
System.out.println("B中的print方法!");
}
}
public class TestDemo{
public static void main(String args[]){
A a = new B(); //实例化子类对象,子类对象向上转型
a.print(); //调用被子类覆写过的方法
}
}
程序执行结果:B中的print方法!
程序示例(向下转型):
class A{
public void print(){
System.out.println("A中的print方法!");
}
}
class B extends A{
public void print(){ //子类覆写了父类的print方法
System.out.println("B中的print方法!");
}
}
public class TestDemo{
public static void main(String args[]){
A a = new B(); //实例化子类对象,子类对象向上转型
B b = (B) a; //对象需要强制性的向下转型
b.print(); //调用被子类覆写过的方法
}
}
程序执行结果:B中的print方法!
向下转型的注意事项:必须发生向上转型之后才可以发生向下转型。
如果是两个没有关系的类对象发生强制转换,就会出现类转换异常 :“ClassCastException” 异常。所以在向下转型中会存在安全隐患,开发中应该避免。
转型的意义:
- 向上转型:主要的意义在于参数的统一;
- 向下转型:调用子类的个性化操作方法。
注意事项:
- 绝大多数情况下会使用向上转型,因为可以使参数统一,便于程序设计。
- 子类定义的方法大多数情况下请以父类的方法名称进行覆写,不要过多的扩充新的方法。
- 有的情况下是不转型的,例如:String。
3.instanceof关键字
在Java中可以使用instanceof关键字判断一个对象是否是指定类的实例。格式如下:
对象 instanceof 类; 返回值为boolean型
程序示例:
class A{
public void print(){
System.out.println("A中的print方法!");
}
}
class B extends A{
public void print(){ //子类覆写了父类的print方法
System.out.println("B中的print方法!");
}
public void funB(){
System.out.println("B 扩充方法!");
}
}
public class TestDemo{
public static void main(String args[]){
fun(new B());
}
public static void fun(A a){
a.print();
B b =(B) a;
b.funB();
}
}
程序执行结果:B中的print方法!
B 扩充方法!
总结:
- 开发中尽量使用向上转型,用以统一参数类型,只有发生了向上转型之后才能发生向下转型。
- 子类中不要过多的扩充与父类无关的操作方法(大多数情况下)。