当前位置 : 主页 > 编程语言 > 其它开发 >

Java-类与对象-多态

来源:互联网 收集:自由互联 发布时间:2022-05-30
讲解了Java中类与对象中的多态特征。 Java类与对象-多态 多态:类与对象三大特征之一 什么是多态? 同类型的对象,执行同一个行为,会表现出不同的行为特征。 多态的形式 1、父类类
Java-类与对象-多态 讲解了Java中类与对象中的多态特征。 Java类与对象-多态

多态:类与对象三大特征之一

 

什么是多态?

同类型的对象,执行同一个行为,会表现出不同的行为特征。

 

多态的形式

1、父类类型 对象名称 = new 子类构造器();

2、接口 对象名称 = new 实现类构造器();

以下为例:

/*
* 此例中
* Animal为抽象父类 有一个抽象方法shout()
* Dog为继承Animal的一个子类 重写了shout()
并有独有方法 watchDoor()
  Cat为继承Animal的另一个子类 重写了shout()
  并有独有方法 catWalk()
**/
Animal a = new Dog();  // 这里a就是一个形式的多态

 

 

多态成员的访问特点

方法调用:编译时看父类是否有该方法,运行时访问子类中的此方法。

编译看‘左边‘,运行看’右边‘。

变量调用:编译时看父类是否有该变量,运行时也访问父类中的此变量。

编译看‘左边‘,运行也看’左边‘。

==> 多态侧重行为的多态(变量(属性)没有多态)。

 

多态的优势

1、便于代码的扩展和维护。

2、定义方法(函数)时,使用父类型作为参数,该方法就可以接收这个父类的一切子类对象,使操作更加便捷。

以下为例:

/*
* 此例中
* Animal为抽象父类 有一个抽象方法shout()
* Dog为继承Animal的一个子类 重写了shout()
* Cat为继承Animal的另一个子类 重写了shout()
**/
public static void main(String[] args) {
   Dog d = new Dog();
   Cat c = new Cat();
   compete(d);
   compete(c);
}
public static void compete(Animal a) {  // 传参时形参可以是父类
   a.shout();
}

 

 

多态存在的问题

多态不能使用子类的独有功能。

在多态下想要使用子类的独有方法怎么办呢?

这就引入了多态中的类型转换,将父类型强制类型转换成子类后,即可实现该目的。

 

多态中的类型转换

1、自动类型转换 (子类到父类)

2、强制类型转换 (父类到子类) ==> 解决了多态中存在的问题,强转后可以调用子类的独有功能

子类名称 子类对象名 = (子类名称) 多态对象;

这种操作可能由于编写者的疏忽并且编译器编译不会提示错误,若将一个非本子类的多态对象赋给该子类,运行时便会报错。

为了解决这一问题,通常在强制转换之前先用instanceof判断是否正确。

以下为例:

/*
* 此例中
* Animal为抽象父类 有一个抽象方法shout()
* Dog为继承Animal的一个子类 重写了shout()
并有独有方法 watchDoor()
  Cat为继承Animal的另一个子类 重写了shout()
  并有独有方法 catWalk()
**/
Animal d = new Dog();   // 构建多态对象d
Animal c = new Cat(); // 构建多态对象c

Cat c2 = (Cat) c; // 将c有Animal类强制转换成Cat类,使其可以调用Cat的独有方法
c.catwalk();    // 错,多态不能使用子类的独有功能。
c2.catwalk(); // 对。

if (c instanceof Cat) {  // 为避免错误最好先判断其正确性
   Cat c2 = (Cat) c;
   c2.catwalk();
}

 

以上就是java中类与对象的一个特征,多态。

网友评论