做网站看好金石网络,自助建站竹子,南京seo排名优化公司,扁平化资讯网站模板文章目录 #x1f4d1;前言一、向上转型和向下转型1.1 向上转型1.2 向下转型 二、多态的优缺点2.1 多态优点2.2 多态缺陷 三、避免避免构造方法中调用重写的方法四、好的习惯#x1f324;️全篇总结 #x1f4d1;前言 在面向对象编程中#xff0c;向上转型和向下转型是常用… 文章目录 前言一、向上转型和向下转型1.1 向上转型1.2 向下转型 二、多态的优缺点2.1 多态优点2.2 多态缺陷 三、避免避免构造方法中调用重写的方法四、好的习惯️全篇总结 前言 在面向对象编程中向上转型和向下转型是常用的技术手段可以实现不同类之间的转换和灵活应用。同时多态作为面向对象编程的重要特性具有诸多优点和缺陷对代码的设计和性能都有一定影响。本文将深入探讨向上转型、向下转型以及多态的优缺点帮助读者更好地理解和运用这些概念在Java编程中的实际应用和注意事项。 一、向上转型和向下转型
1.1 向上转型
实际就是创建一个子类对象将其当成父类对象来使用。
语法格式父类类型 对象名 new 子类类型()Animal animal new Cat(“小小”,3);
animal是父类类型但可以引用一个子类对象因为是从小范围向大范围的转换。 【使用场景】
直接赋值方法传参方法返回
class TestAnimal {// 2. 方法传参形参为父类型引用可以接收任意子类的对象public static void eatFood(Animal a){a.eat();} // 3. 作返回值返回任意子类对象public static Animal buyAnimal(String var){if(狗.equals(var) ){return new Dog(狗狗,1);}else if(猫 .equals(var)){return new Cat(猫猫, 1);}else{return null;}}public static void main(String[] args) {// 1. 直接赋值子类对象赋值给父类对象Animal cat new Cat(元宝,2); Dog dog new Dog(小七, 1);eatFood(cat);eatFood(dog);Animal animal buyAnimal(狗);animal.eat();animal buyAnimal(猫);animal.eat();}
}**向上转型的优点**让代码实现更简单灵活。
**向上转型的缺陷**不能调用到子类特有的方法。
1.2 向下转型
将一个子类对象经过向上转型之后当成父类方法使用再无法调用子类的方法但有时候可能需要调用子类特有的方法此时将父类引用再还原为子类对象即可即向下转换。 public static void main(String[] args) {Animal animal1 new Dog(小七,7);//向上转型Animal animal2 new Cat(咪咪,3);//向上转型animal1 (Dog)animal1;//向下转型animal2 (Cat)animal1;//向下转型编译报错因为animal1实际上是指向的是Dog强制转化为Cat无法还原}向下转型用的比较少而且不安全万一转换失败运行时就会抛异常。Java中为了提高向下转型的安全性引入了 instanceof 如果该表达式为true则可以安全转换。 二、多态的优缺点
2.1 多态优点
提高代码的可扩展性和可维护性通过多态可以将具体的实现与抽象的接口分离使得系统的各个模块之间的耦合度降低从而方便对系统进行扩展和维护。增强代码的灵活性通过多态可以在运行时动态地决定对象的具体类型从而实现不同对象的不同行为。这样可以根据实际需求灵活地进行对象的选择和使用。提高代码的可读性和可理解性通过多态可以将对象的具体类型隐藏起来只关注对象的抽象类型和接口从而使得代码更加简洁、清晰易于理解和阅读能够降低代码的 “圈复杂度”, 避免使用大量的 if - else
扩展
圈复杂度是一种描述一段代码复杂程度的方式. 一段代码如果平铺直叙, 那么就比较简单容易理解. 而如果有很多的条件分支或者循环语句, 就认为理解起来更复杂.因此我们可以简单粗暴的计算一段代码中条件语句和循环语句出现的个数, 这个个数就称为 “圈复杂度”。如果一个方法的圈复杂度太高, 就需要考虑重构不同公司对于代码的圈复杂度的规范不一样. 一般不会超过 10 。
class Book{public void read(){System.out.println(看书);}
}
class English extends Book{public void read(){System.out.println(看英语书);}
}
class Maths extends Book{public void read(){System.out.println(看数学书);}
}
class Language extends Book{Overridepublic void read() {System.out.println(看语文书);}
}
public class Exercise3 {public static void readBook(){English english new English();Maths maths new Maths();Language language new Language();Book[] book {english,language,maths,language,maths,english};for (Book x:book) {x.read();}}public static void main(String[] args) {readBook();}
}2.2 多态缺陷
性能损失由于多态需要在运行时进行类型的判断和方法的动态绑定所以会带来一定的性能损失。相比于直接调用具体类型的方法多态需要进行额外的判断和查找从而导致一定的性能下降。
可能引发运行时错误由于多态是在运行时动态决定对象的具体类型所以如果在使用多态的过程中出现了类型错误或者类型转换错误就会导致运行时错误的发生。这就需要在使用多态时进行严格的类型检查和错误处理增加了代码的复杂性和难度。
可能导致代码的混乱和难以理解多态的使用会使得代码中出现更多的抽象和接口从而增加了代码的复杂性和难度。如果使用不当可能会导致代码的混乱和难以理解降低代码的可读性和可维护性。因此在使用多态时需要谨慎设计和使用。
三、避免避免构造方法中调用重写的方法
class B {public B() {
// do nothingfunc();}public void func() {System.out.println(B.func());}
}
class D extends B {private int num 1;Overridepublic void func() {System.out.println(D.func() num);}
}
public class Test {public static void main(String[] args) {D d new D();}
}
// 执行结果D.func() 0一段有坑的代码. 我们创建两个类, B 是父类, D 是子类. D 中重写 func 方法. 并且在 B 的构造方法中调用 func。
构造 D 对象的同时, 会调用 B 的构造方法.
B 的构造方法中调用了 func 方法, 此时会触发动态绑定, 会调用到 D 中的 func
此时 D 对象自身还没有构造, 此时 num 处在未初始化的状态, 值为 0. 如果具备多态性num的值应该是1.
所以在构造函数内尽量避免使用实例方法除了final和private方法。
四、好的习惯
“用尽量简单的方式使对象进入可工作状态”, 尽量不要在构造器中调用方法(如果这个方法被子类重写, 就会触发动态绑定, 但是此时子类对象还没构造完成), 可能会出现一些隐藏的但是又极难发现的问题。
️全篇总结
向上转型可以实现子类对象当成父类对象使用提高代码的灵活性和复用性向下转型则可以让父类引用还原为子类对象调用子类特有方法。多态能够提高代码的可扩展性和可维护性但也存在性能损失和潜在的错误风险需要谨慎使用和设计。
避免在构造函数中调用重写方法保持构造过程简洁和清晰避免潜在的问题。形成良好的编程习惯能够提高代码的质量和可维护性减少潜在的错误和调试成本是每位Java程序员都应该注意的重要方面。
文章转载自: http://www.morning.lwqst.cn.gov.cn.lwqst.cn http://www.morning.cpqqf.cn.gov.cn.cpqqf.cn http://www.morning.kjnfs.cn.gov.cn.kjnfs.cn http://www.morning.rtqyy.cn.gov.cn.rtqyy.cn http://www.morning.rlsd.cn.gov.cn.rlsd.cn http://www.morning.jcyrs.cn.gov.cn.jcyrs.cn http://www.morning.lpcpb.cn.gov.cn.lpcpb.cn http://www.morning.bjndc.com.gov.cn.bjndc.com http://www.morning.tntgc.cn.gov.cn.tntgc.cn http://www.morning.ttnfc.cn.gov.cn.ttnfc.cn http://www.morning.pnjsl.cn.gov.cn.pnjsl.cn http://www.morning.nppml.cn.gov.cn.nppml.cn http://www.morning.qtqk.cn.gov.cn.qtqk.cn http://www.morning.kdxzy.cn.gov.cn.kdxzy.cn http://www.morning.pjyrl.cn.gov.cn.pjyrl.cn http://www.morning.gfhng.cn.gov.cn.gfhng.cn http://www.morning.znqfc.cn.gov.cn.znqfc.cn http://www.morning.vjdofuj.cn.gov.cn.vjdofuj.cn http://www.morning.wyzby.cn.gov.cn.wyzby.cn http://www.morning.mgwpy.cn.gov.cn.mgwpy.cn http://www.morning.rxpp.cn.gov.cn.rxpp.cn http://www.morning.dhyzr.cn.gov.cn.dhyzr.cn http://www.morning.fstdf.cn.gov.cn.fstdf.cn http://www.morning.qrwjb.cn.gov.cn.qrwjb.cn http://www.morning.sxygc.cn.gov.cn.sxygc.cn http://www.morning.skql.cn.gov.cn.skql.cn http://www.morning.saastob.com.gov.cn.saastob.com http://www.morning.sooong.com.gov.cn.sooong.com http://www.morning.tcylt.cn.gov.cn.tcylt.cn http://www.morning.ljxps.cn.gov.cn.ljxps.cn http://www.morning.sbpt.cn.gov.cn.sbpt.cn http://www.morning.bkkgt.cn.gov.cn.bkkgt.cn http://www.morning.brkrt.cn.gov.cn.brkrt.cn http://www.morning.dlbpn.cn.gov.cn.dlbpn.cn http://www.morning.kpwcx.cn.gov.cn.kpwcx.cn http://www.morning.hwzzq.cn.gov.cn.hwzzq.cn http://www.morning.pqqhl.cn.gov.cn.pqqhl.cn http://www.morning.rybr.cn.gov.cn.rybr.cn http://www.morning.yqpzl.cn.gov.cn.yqpzl.cn http://www.morning.kxxld.cn.gov.cn.kxxld.cn http://www.morning.swlwf.cn.gov.cn.swlwf.cn http://www.morning.xppj.cn.gov.cn.xppj.cn http://www.morning.jjsxh.cn.gov.cn.jjsxh.cn http://www.morning.kgqpx.cn.gov.cn.kgqpx.cn http://www.morning.fkwgk.cn.gov.cn.fkwgk.cn http://www.morning.tmbfz.cn.gov.cn.tmbfz.cn http://www.morning.bgrsr.cn.gov.cn.bgrsr.cn http://www.morning.dgsr.cn.gov.cn.dgsr.cn http://www.morning.sfqtf.cn.gov.cn.sfqtf.cn http://www.morning.qmbpy.cn.gov.cn.qmbpy.cn http://www.morning.xbxks.cn.gov.cn.xbxks.cn http://www.morning.ftmzy.cn.gov.cn.ftmzy.cn http://www.morning.snyqb.cn.gov.cn.snyqb.cn http://www.morning.qnsmk.cn.gov.cn.qnsmk.cn http://www.morning.ykrkq.cn.gov.cn.ykrkq.cn http://www.morning.pcwzb.cn.gov.cn.pcwzb.cn http://www.morning.hnhsym.cn.gov.cn.hnhsym.cn http://www.morning.gnkdp.cn.gov.cn.gnkdp.cn http://www.morning.fnwny.cn.gov.cn.fnwny.cn http://www.morning.zqdhr.cn.gov.cn.zqdhr.cn http://www.morning.hkng.cn.gov.cn.hkng.cn http://www.morning.xlwpz.cn.gov.cn.xlwpz.cn http://www.morning.shuangxizhongxin.cn.gov.cn.shuangxizhongxin.cn http://www.morning.xdnhw.cn.gov.cn.xdnhw.cn http://www.morning.nrwr.cn.gov.cn.nrwr.cn http://www.morning.mwmtk.cn.gov.cn.mwmtk.cn http://www.morning.hqwcd.cn.gov.cn.hqwcd.cn http://www.morning.lxqyf.cn.gov.cn.lxqyf.cn http://www.morning.rsnn.cn.gov.cn.rsnn.cn http://www.morning.yrjkp.cn.gov.cn.yrjkp.cn http://www.morning.khlxd.cn.gov.cn.khlxd.cn http://www.morning.bbmx.cn.gov.cn.bbmx.cn http://www.morning.bmts.cn.gov.cn.bmts.cn http://www.morning.jgykx.cn.gov.cn.jgykx.cn http://www.morning.rnzwh.cn.gov.cn.rnzwh.cn http://www.morning.tjwfk.cn.gov.cn.tjwfk.cn http://www.morning.mfbzr.cn.gov.cn.mfbzr.cn http://www.morning.yhywx.cn.gov.cn.yhywx.cn http://www.morning.yqsr.cn.gov.cn.yqsr.cn http://www.morning.mfnjk.cn.gov.cn.mfnjk.cn