多态性
1、多态性
多态性是面向对象中的第三大主要特征,多态性是在继承性的基础上扩展出来的概念,也就是可以实现父子之间的相互转换处理。
在Java中多态性的有两种实现的模式:
- 方法多态性
- 方法重载
- 方法重写
- 对象多态性 --父子实例之间的转换处理,有两种模式:
- 对象向上转型: 父类 父类实例 = 子类实例 --自动完成转换
- 对象向下转型: 子类 子类实例 = (子类) 父类实例 --强制完成转换
在实际的转型上,大部分的情况都是 对象的向上转型 ,只有极小部分是 对象向下转型 还有一部分是String类型,String类型一般不转型
2、对象向上转型
public class JavaDemo{
public static void main(String [] args){
Message message= new DatabaseMessage();
message.fun();
}
}
class Message{
public void fun(){
System.out.println("***111***") ;
}
}
class DatabaseMessage extends Message{
public void fun() {
System.out.println("嘿嘿嘿") ;
}
}
对象向上转型的应用,在调用方法的时候传递 new 的实例化参数
public class JavaDemo{
public static void main(String [] args){
into(new DatabaseMessage()) ;
into(new WebMessage()) ;
}
public static void into(Message message){
message.fun() ;
}
}
class Message{
public void fun(){
System.out.println("原型") ;
}
}
class DatabaseMessage extends Message{
public void fun() {
System.out.println("对象向上转型一") ;
}
}
class WebMessage extends Message{
public void fun(){
System.out.println("对象向上转型二") ;
}
}
转型的主要特点在于可以使用参数统一进行设计。
不使用重载的方法来完成实现的原因:主要是为了在满足要求的同时,还保留可维护性,如果使用重载,则同一个方法就需要被连续调用,不是和维护。
对象向上转型 明确接收或返回参数的统一性
向上转型,被子类覆写的方法或者属性,将按照子类所覆写的实现,没有被子类覆写的方法或者属性按照父类的实现,
值得注意的是,向上转型后的实例对象既是父类的实例,又是子类的实例,但是方法或者属性一旦被子类所覆写,那么实例化的对象实现的就是子类的,而不是父类的
同时,实例不能调用子类自己的属性和方法,但可以调用父类自己的属性和方法
3、对象向下转型
public class JavaDemo{
public static void main(String [] args){
System.out.println("平常状态下的超人---一个普通人") ;
Person person = new SuperMan() ; //向上转型
person.print() ;
System.out.println("超能力状态下的超人---一个会喷火的人") ;
SuperMan man = (SuperMan) person ; //向下转型
System.out.println(man.fly()) ;
System.out.println(man.fire()) ;
}
}
class Person{
public void print(){
System.out.println("吃饭、睡觉") ;
}
}
class SuperMan extends Person{
public String fly() {
return "我可以飞" ;
}
public String fire(){
return "我可以喷火" ;
}
}
向上转型描述的是一些公共的特征,向下转型描述的是子类自己特殊的定义环境,但是需要明确的是,向下转型并不是一件安全的事情,因为在进行向下转型之前一定要首先发生向上转型
只要是发生 对象向下转型之前一定要首先发生向上转型,两个任何关系的实例入伙要发生强制转换,就会出现异常,因此向下转型并不是一个安全的事情
4、instanceof关键字
通过分析可以发现向下转型本是一件存在有安全隐患的操作,所以为了保证 对象向下转型 的正确性,往往需要在进行转型之前进行判断,判断某个实例是否是某个类的对象
public class JavaDemo{
public static void main(String [] args){
Person person = new Person() ; //向上转型
System.out.println(person instanceof Person) ; //true
System.out.println(person instanceof SuperMan) ; //false
}
}
class Person{
public void print(){
System.out.println("吃饭、睡觉") ;
}
}
class SuperMan extends Person{
public String fly() {
return "我可以飞" ;
}
public String fire(){
return "我可以喷火" ;
}
}
在进行转型之前,可以利用instanceof关键字先进行判断
public class JavaDemo{
public static void main(String [] args){
Person person = new SuperMan() ; //向上转型
if(person instanceof SuperMan){
SuperMan man = (SuperMan) person ;
System.out.println(man.fly()) ;
System.out.println(man.fire()) ;
}
}
}