自己转行做JAVA已经有几个年头了,感觉自己应该脱离新手这个概念了吧。。然鹅突然在网上看到了一个帖子,上面有这么几个问题,啪啪打脸,看来还有很多不足~要继续保持学习,这篇博客也是要把这些问题记录下来,铭记一生。。。
如果你也是一个JAVA程序员,准备好来直击心灵了吗,建议先自己回答了之后再看答案~当然如果你有更好的答案也可以评论~
1.基于接口的继承和基于实现的继承各有什么优缺点?
答:接口的本质其实是一种约定,就像水桶一样,只要是可以装水,并且有个提手都可以叫水桶,具体的实现就好比木桶、铁桶,金桶都叫水桶,只不过实现的方式不一样。
继承的本质是拓展、泛化,父类具有的功能子类都有。但是子类可以增加自己特有的属性和行为,某些父类的行为,子类也可能和父类的不完全一样。
基于接口的优点:1.拓展灵活,协议层面的扩充。2.接口在降低耦合很方便,不像继承那样破坏封装。
基于接口的缺点:只是针对协议的扩展,并没有具体实现代码的复用,此外针对每一个基于接口的类都要实现新扩展的方法,哪怕这个实现类不需要这个协议。(PS 当然现在JDK8 已经是可以提供一个默认的实现了)
基于继承的优点:1.子类可以复用、重写相关方法。2.可以利用多态统一处理。3.给父类增加属性和行为,就相当于给所有子类增加。
基于继承的缺点:子类父类高度耦合,破坏封装、降低灵活性。
2.继承(包括 extend 和 implement)有什么【缺点】
答:
1.子类会依赖父类存在无法解耦,父类的改变会影响子类
2.性能上有影响,如果有10层继承,那么执行一个方法需要寻找10层。
3.多态(polymorphism)有什么【缺点】?
答:多态是同一个行为具有多个不同表现形式或形态的能力。
多态存在的三个必要条件:继承、重写、父类引用子类对象
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
缺点:可能会附带继承的缺点,还有就是使用多态后不能使用子类中有而父类中没有的方法。
4.为什么 Java 可以多继承 interface,而不可以多继承 class
答:多继承会形成菱形继承关系,假设A有2个子类 A1,A2,而B同时继承了A1,A2,那么A中有个方法a(),A1,A2有不同的实现,那么B应该是继承哪个方法呢?而接口就没这么复杂了,因为实现是写在子类里的,只有唯一一个实现,所以是没问题的。
5.类结构设计时,如何考虑可扩展性?
答:这个就大概是设计模式的几大原则了,
1.单一职责原则
2.里氏替换原则:在所有用到父类的地方,如果都替换成子类,程序的行为不变。
3.依赖倒置原则:高层模块不能依赖底层模块,两者都要依赖抽象,具体就是高层调用底层时形参不能是具体的类,而是一个接口,只要实现这个接口的类都可以传进来进行具体业务逻辑。
4.接口隔离原则:一个类不应该继承无用的接口,依赖关系要建立在最小接口上
5.迪米特法则:每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
6.开闭原则:对扩展开放,对修改关闭,
开闭原则是所有其他原则和设计模式的基础, 其核心思想就是抽象, 抽象事物或行为的共性, 并且用抽象限制细节, 就是所谓的面向接口编程. 抽象一旦定义一般情况下就不应当再做任何修改,否则就严重影响了程序的可维护性,所有依赖该抽象的实现必须随之修改!
6.为什么Stringbuilder比String在字符串拼接的时候更好更快?
答:首先StringBuilder比StringBuffer更快,因为StringBuffer是线程安全的,所有方法都被synchronized包裹,StringBuilder比String更快更好是因为String不可变,StringBuilder是可变的,String每次更改后都会生成一个新的String对象。