Java的多态性


多态性是面向对象三大特征的最后一个,其含义就是对象,方法多种形式的表现。多态性又分为方法的多态性和对象的多态性。


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 扩充方法!
总结:
  • 开发中尽量使用向上转型,用以统一参数类型,只有发生了向上转型之后才能发生向下转型。
  • 子类中不要过多的扩充与父类无关的操作方法(大多数情况下)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值