多态

多态----------父类引用变量可以指向子类对象。

1.多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。

2.在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。

父类 变量名 = new 子类();
l 抽象类多态定义的格式
抽象类 变量名 = new 抽象类子类();
l 接口多态定义的格式
接口 变量名 = new 接口实现类();

同一个父类的方法会被不同的子类重写。在调用方法时,调用的为各个子类重写后的方法。

当变量名指向不同的子类对象时,由于每个子类重写父类方法的内容不同,所以会调用不同的方法。

多态中,成员特点

 \*  成员变量:
*编译的时候, 参考父类中有没有这个变量,如果有,编译成功,没有编译失败
\* 运行的时候, 运行的是父类中的变量值
\* 编译运行全看父类
 *  成员方法:
*编译的时候, 参考父类中有没有这个方法,如果有,编译成功,没有编译失败
* 运行的时候, 运行的是子类的重写方法
* 编译看父类,运行看子类

tips

1.多态称为向上转型,多态时,父类引用指向子类对象,是无法调用子类新方法的,无法调用子类特有的方法,变量等。

2.向下转型,是对已经向上转型的对象,引用的一个向下转型,例如 向下转型:子类 变量=(子类)上转型变量

package day01;

public class Fu {
   int num = 4;
   void show() {
       System.out.println("Fu show num");
  }
}
class Zi extends Fu {
   int num = 5;
   void show1() {
       System.out.println("Zi show num");
  }
}
class Demo {
   public static void main(String[] args) {
       Fu f = new Zi();
       f.show(); // 调用的是父类的show方法
       Zi f1 = (Zi) f;//向下转型,是在向上转型的基础上进行的
        f1.show1();
  }
}

 

 

向下转型后可以调用父类子类方法

1.什么时候使用向上转型:

当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作,这时就可以使用向上转型。

2.什么时候使用向下转型

当要使用子类特有功能时,就需要使用向下转型。

如:Dog d = (Dog) a; //向下转型

d.lookHome();//调用狗类的lookHome方法

3. 向下转型的好处:可以使用子类特有功能。

4.弊端是:需要面对具体的子类对象;在向下转型时容易发生ClassCastException类型转换异常。在转换之前必须做类型判断。

如:if( !a instanceof Dog){…}

封装:把对象的属性与方法的实现细节隐藏,仅对外提供一些公共的访问方式

继承:子类会自动拥有父类所有可继承的属性和方法。

多态:配合继承与方法重写提高了代码的复用性与扩展性;如果没有方法重写,则多态同样没有意义。

5.如:if( !a instanceof Dog){…} boolean b = 对象 instanceof 数据类型;

判断该对象是否是该数据类型的对象

 Fu f = new Zi();
       Fu fu = new Fu();
       f.show();
       Zi f1 = (Zi) f;//向下转型,是在向上转型的基础上进行的
       f1.show1();
       boolean b = new Object() instanceof Fu;
       System.out.println(b);

 

 

 

posted on 2021-11-21 15:43  Forever、H  阅读(59)  评论(0)    收藏  举报