一天中,太阳会升起,同时还会落下。人生也一样,有白天和黑夜,只是不会像太阳那样,有定时的日出和日落。有些人一辈子都活在太阳的照耀下,也有些人不得不一直活在漆黑的深夜里。人害怕的,就是本来一直存在的太阳落下不再升起,也就是非常害怕原本照在身上的光芒消失。
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。
•java的设计模式大体上分为三大类(23种):
•创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。
•结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。
•行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
•就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
•一般我们会把简单工厂类用static修饰,所以简单工厂也可以叫静态工厂模式,不需要创建实例,直接调用即可
•工厂方法模式有一个问题就是,类的创建依赖工厂类,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?
•就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
单例模式分为三种
第一种懒汉模式:
第二种饿汉模式:
第三种双重锁模式:
•这个模式将同步内容下放到if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了。
•这种模式中双重判断加同步的方式,比懒汉模式的效率大大提升,因为如果单层if判断,在服务器允许的情况下,
•假设有一百个线程,耗费的时间为100*(同步判断时间+if判断时间),而如果双重if判断,100的线程可以同时if判断,理论消耗的时间只有一个if判断的时间。
•所以如果面对高并发的情况,而且采用的是懒汉模式,最好的选择就是双重判断加同步的方式。
1.接口和抽象类的区别
抽象类可以有构造方法,方法体;接口没有构造方法,不能有方法体。
抽象方法可以继承一个类或实现多个接口;接口只可以实现一个或多个接口。
抽象类中可以做方法声明,也可以做方法实现;接口只能做方法声明。
从概念层面来说,抽象类是对一个类族根源的抽象,接口通常用来对动作进行抽象
从语法层面来说,抽象类要被子类继承,接口要被类实现。
从成员变量构成上来看,接口里定义的变量只能是公共的静态的常量(public static final),抽象类中的变量是普通变量
2.this和super的区别
super()函数在子类构造函数中调用父类的构造函数时使用,而且必须要在构造函数的第一行
this()函数主要应用于同一类中从某个构造函数调用另一个重载版的构造函数。this()只能用在构造函数中,并且也只能在第一行。
所以在同一个构造函数中this()和super()不能同时出现。
3.方法的重载和重写
重写方法的规则:方法名、参数、返回值相同,内容不同。
参数列表必须完全与被重写的方法相同
返回的类型必须一直与被重写的方法的返回类型相同
访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。
重载的规则:名字一样,参数类型、个数、顺序至少有一个不相同。
必须具有不同的参数列表;
可以有不同的返回类型,只要参数列表不同就可以了;
可以有不同的访问修饰符;
可以抛出不同的异常;
4.内部类分为几种
静态嵌套类(Static Nested Classes):作为类的静态成员,存在于某个类的内部。
成员内部类(Member Inner Class):作为类的成员,存在于某个类的内部。成员类是特定于实例的。它可以访问所有方法,字段和外部类本身的引用。
局部方法内部类(Method-Local Inner Classes):局部内部类只能在方法内部中使用,一旦方法执行完毕,局部内部类就会从内存中删除。必须注意:如果局部内部类中要使用他所在方法中的局部变量,那么就需要将这个局部变量定义为final的。
匿名内部类(Anonymous Inner Classes):匿名内部类的定义与对象的创建合并在一起,匿名内部类一般通过如下形式定义,并且在定义的同时进行对象的实例化。当您需要给一个GUI应用程序窗口小部件加一个动作监听器时,匿名内部类就会经常被用到。
String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享
string类是否可以被继承?final所修饰(不能)
•当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
•和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
•StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。