Java习题
- 软件设计的原则有哪些?解释一个你最熟悉的设计原则?
- 面向对象编程有七大原则,即经常提到的Design Pattern,提倡它的根本原因是为了代码复用,增加可维护性。设计模式就是实现了这些原则,从而达到了代码复用、增加可维护性的目的。因为设计模式就是基于这些原则的实现,所以很有必要了解这些原则。
-
单一职责原则 ( SRP )
英文全称是Single Responsibility Principle,定义是一个类,应该只有一个引起它变化的原因。类变化的原因就是职责,如果一个类承担的职责过多,就等于把这些职责耦合在一起了。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。而如果想要避免这种现象的发生,就要尽可能的遵守单一职责原则。此原则的核心就是解耦和增强内聚性。
-
开闭原则 ( OCP )
英文全称是Open Close Principle,定义是软件实体(包括类、模块、函数等)应该对于扩展时开放的,对于修改是封闭的。开闭原则是是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段。
-
里氏替换原则 ( LSP )
英文全称是Liskov Substitution Principle,是面向对象设计的基本原则之一。 定义是任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏替换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏替换原则是对实现抽象化的具体步骤的规范。
-
依赖倒置原则 ( DIP )
英文全称是Dependence Inversion Principle,这个原则是开闭原则的基础,依赖倒置原则就是要求调用者和被调用者都依赖抽象,这样两者没有直接的关联和接触,在变动的时候,一方的变动不会影响另一方的变动。依赖倒置强调了抽象的重要性,针对接口编程,依赖于抽象而不依赖于具体。
-
接口隔离原则 ( ISP )
英文全称是Interface Segregation Principle,这个原则的意思是使用多个隔离的接口,比使用单个接口要好。目的就是降低类之间的耦合度,便于软件升级和维护。
-
最少知道原则(迪米特原则)
一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。通俗地说就是不要和陌生人说话,即一个对象应对其他对象有尽可能少的了解。迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
-
合成/聚合复用(CARP)
英文全称是Composite Reuse Principle,合成/聚合复用原则经常又叫做合成复用原则。合成/聚合复用原则的潜台词是:我只是用你的方法,我们不一定是同类。继承的耦合性更大,比如一个父类后来添加实现一个接口或者去掉一个接口,那子类可能会遭到毁灭性的编译错误,但如果只是组合聚合,只是引用类的方法,就不会有这种巨大的风险,同时也实现了复用
-
数组 和 ArrayList 有何区别和联系?
- 数组可以容纳基本类型和对象,而ArrayList只能容纳对象。
- 数组长度固定的,而ArrayList大小是不固定的。
- 数组 只有length属性,ArrayList提供了size()、addAll、removeAll和iterator等方法。
- 联系:ArrayList 类的底层实现也是通过 Object[] 数组来实现的,只是通过增长因子相关的扩容机制及数组的拷贝等方式,实现了动态增长的效果。
-
Array和ArrayList区别?
- java.lang.reflect.Array 是个反射工具包,全是静态方法,创建数组以多维数组为基准,一维数组只是特殊实现。
- ArrayList 是一个动态数组的集合类。
-
写出所有的 DML 和 DDL 语句关键字?
-
MySQL : DML 和 DQL DDL TCL DCL
-
Oracle : DML DCL DDL TCL
insert select update delete
create drop alter truncate
TCL : commit rollback savepoint
DCL: grant revoke -
写一个简单工厂模式:饮料厂提供静态方法,根据用户的选择,提供苹果汁、橘子汁,如果用户没有选择或选择错误,提供 冰封汽水。
public interface IDrink { void drink(); } public class AppleDrink implements IDrink { @Override public void drink() { System.out.println("苹果汁"); } } public class OrangeDrink implements IDrink { @Override public void drink() { System.out.println("=橘子汁="); } } public class BingFengDrink implements IDrink { @Override public void drink() { System.out.println("冰峰汽水"); } } public class DrinkFactory { public static final int DRINK_APPLE = 1; public static final int DRINK_ORANGE = 2; public static IDrink newDrink(int sel){ if(sel == DrinkFactory.DRINK_APPLE){ return new AppleDrink(); }else if(sel == DrinkFactory.DRINK_ORANGE){ return new OrangeDrink(); }else{ return new BingFengDrink(); } } } main(){ IDrink drink = DrinkFactory.newDrink(Dir nkFactory.DRINK_APPLE); drink.drink(); }