面向对象的三大特点—多态

什么是多态

从字面意思来理解,就是“多种状态”,换句话说,在java中同一个方法,根据传入的对象不同,产生了不同的行为方式或是结果,就叫多态。在之前我们学过了继承,我们知道子类可以调用父类的方法和成员变量(非私有化),那如果想通过父类调用子类的方法呢?做一个大胆的假设,我们是否可以将子类伪装成父类呢?(毕竟生活中父子一般都比较像,还是有一定的伪装可能的)那我们尝试一下以父类的方法创建方式创建一个子类对象看看是什么结果。FU f = new Zi();当子类继承了父类的方法时,我们可以发现这行代码并没有报错,也就是说,在java中,是允许这么定义的。

为什么可以这么写

我们来看一下这行代码FU() f = new Zi();其结构为(类名/引用数据类型)+ (对象名) = (真实对象),我们可以发现他和我们定义一个变量的过程很相近;int a = 10; (基本数据类型) +  (变量名) = (真实值);我们知道,子类可以继承父类的方法和变量,所以FU() f = new Zi();这个定义的过程更像是低精度的数据用高精度的类型进行赋值。

多态的条件

1.继承:我们之前提到过,不论是进行伪装,还是进行数据转换,都说明了多态的前提是继承。

2. 重写父类方法:我们在了解多态时的问题是父类能否使用子类的方法,那如果子类继承父类之后,没有进行方法重写,我们使用多态是不是就没有必要了呀。所以第二个条件就是需要进行父类方法的重写。

3.  只能使用继承自父类的方法: 当我们将子类伪装成父类之后,如果再次使用自己的特性(父类没有的方法),那就会被发现我们的伪装行为呀,所以当使用多态时,我们只能使用父类的方法,而不能使用子类的特有方法。

什么是向上转型,什么是向下转型

向上转型:向上转型指之前学习的多态使用方法,将子类伪装成父类,Fu f = new Zi();的这种写法,可以通过f对象调用zi()类中的重写的方法。

向下转型:当我们创建完对象后,我们可以进行对子类继承自父类的方法进行调用,那如果我突然又需要使用子类独有的方法怎么办?我们之前提到过,等号后面的NEW Zi();才是真实的对象,其定义过程类似于将一个123定义成一个int类型(127~-128可以用精度更低的byte型进行定义)。那我想将一个定义好的int a = 123 ;转换成byte类型该如何去做呢?我们需要将int强转为byte类型,多态中也是类似,当定义好一个父类对象(真实对象为子类)时,我们如果想要使用子类的特有方法,也需要对其进行强转(脱去伪装的过程),格式为:((Zi) f).方法名。注意,当我们使用向下转型时,前提条件是该对象为向上转型得到,且不能向下转型为其他的子类(必须是真实对象的子类)

instanceof关键字的作用

instanceof关键字用来判断对象是否有对应子类向上转型得到的,返回值为true或false,其格式如下

Father f1 = new Child();
    f1 instanceof Child表示判断f1是否是通过Child类(或者是其父类)创建而来的
 

扫描二维码关注公众号,回复: 3803044 查看本文章

猜你喜欢

转载自blog.csdn.net/lwz18642660013/article/details/83443943