对JAVA中多态的粗浅理解
目录
一.向上转移和向下转型及优缺点
二.重写
三.多态的概念
四.多态实现条件
五.多态的优缺点
一.向上转移和向下转型及优缺点:
1
.
向上转移
:实际就是创建一个子类对象,将其当成父类对象来index.php/tags-602.html" class="superseo">使用。或者这样理解
(父类的引用引用了子类的对象)。
向上转移共有三种形式:
1. 直接赋值:语法格式:父类类型 对象名 = new 子类类型()
2. 方法传参
3. 方法返回
如下代码:这里父类是Animal,子类是Dog.
(3)
访问权限
不能
比父类中被重写的方法的访问权限更低。
(4)父类被static、private修饰的方法、构造方法都不能被重写。
(5)
重写的方法
,
可以使用
@Override
注解来显式指定
.
有了这个注解能帮我们进行一些合法性校验
3. 静态绑定
:也称为前期绑定
(
早绑定
)
,即在编译时,根据用户所传递实参类型就确定了具体调用那个方法。典型代表函数重载
动态绑定
:也称为后期绑定
(
晚绑定
)
,即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用那个类的方法。
动态绑定发生条件:(要发生
继承
关系,要发生
重写
,要发生
向上转行
)
下面给个例子如图:
运行结果:不是吃东西而是吃猫粮
3.原理解释:这里可以反汇编查看,这个animal的调用。其实是父类的Animal调用了重写的方法。
以上就是动态绑定。是理解多态的关键。
我随手画了个草图,也可以这样理解动态绑定如图:
三.多态的概念
:要理解多态,就要先理解前面的动态绑定,和向上转型。
1.
多态的概念:通俗来说,就是多种形态,
具体点就是去完成某个行为,当不同的对象去完成时会产生出不同 的状
态。
四.多态实现条件:
1.
必须在继承体系下
2.
子类必须要对父类中方法进行重写
3.
通过父类的引用调用重写的方法
多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。
多态代码例子呈现:这里有
两个对象
dog
,和
cat
都调用了同一个方法,呈现出不同的结果,这就是多态。
不同的运行结果:
五.多态的优缺点:
优点:1.能够降低代码的
"圈复杂度"
,
避免使用大量的
if - else
什么叫 "圈复杂度" ?
圈复杂度是一种描述一段代码复杂程度的方式. 一段代码如果平铺直叙, 那么就比较简单容易理解. 而如果有很多的条件分支或者循环语句, 就认为理解起来更复杂.因此我们可以简单粗暴的计算一段代码中条件语句和循环语句出现的个数, 这个个数就称为 "圈复杂度".
如果一个方法的圈复杂度太高, 就需要考虑重构.
不同公司对于代码的圈复杂度的规范不一样. 一般不会超过 10
2.
可扩展能力更强
多态缺陷:代码的运行效率降低
。
/* public static void func(Animal animal) { 2.方法的传参 animal.voice(); }*/ /*public static Animal func1() { 3.方法的返回值 Dog dog = new Dog("wangcai", 4); return dog; }*/
下面是main方法当中://向上转型 //1.直接赋值 Animal animal = new Dog("wangcai", 2); Dog dog = new Dog("wangcai", 4); //2.方法的传参 func(dog); //3.方法的返回值 Animal animal2 = func1(); System.out.println(animal2);优缺点: 向上转型的优点:让代码实现更简单灵活。 向上转型的缺陷:不能调用到子类特有的方法。 (当子类重写了,父类方法会发生动态绑定)这个马上后面会讲。 2.向下转型: 向下转型用的比较少,而且不安全,万一转换失败,运行时就会抛异常。这里举个简单例子就可以了,其实就是反过来。通俗理解:就是把父类给子类。 代码如下: 这里同样,父类是Animal,子类是Dog.
public class Test { public static void main(String[] args) { Animal animal = new Dog("wangcai", 2); Dog dog = (Dog) animal; dog.eat(); } }
二.重写:
重载重写区别:
1.重写 (override) :也称为覆盖。重写是子类对父类非静态、非 private 修饰,非 final 修饰,非构造方法等的实现过程 进行重新编写, 返回值和形参都不能改变 。 (也有一种特殊情况) 2. 方法重写的规则: (1)子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完一致 (2)被重写的方法返回值类型可以不同,但是必须是具有父子关系的(种特殊情况)如图:







免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理!
部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!
图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!