1:静态语句块、构造语句块(就是只有大括号的那块)以及构造函数的执行顺序
例子:
class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println("I'm A class"); } static { System.out.println("static A"); } } public class HelloB extends HelloA { public HelloB() { System.out.println("HelloB"); } { System.out.println("I'm B class"); } static { System.out.println("static B"); } public static void main(String[] args) { new HelloB(); } }
答案:
static A static B I'm A class HelloA I'm B class HelloB
解析:对象初始化顺序,类加载后,从父类到子类执行被static修饰的语句,(类被加载的时候,执行静态代码块,类加载到内存中后,先执行main()方法)当static语句执行完之后,再执行main方法,如果有语句new了自身的对象,将从上到下执行构造代码块、构造器(两者可以说绑定在一起)。
稍微修改下代码:
class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println("I'm A class"); } static { System.out.println("static A"); } } public class HelloB extends HelloA { public HelloB() { System.out.println("HelloB"); } { System.out.println("I'm B class"); } static { System.out.println("static B"); } public static void main(String[] args) { System.out.println("-------main start-------"); new HelloB(); new HelloB(); System.out.println("-------main end-------"); } }
此时输出结果为:
static A static B -------main start------- I'm A class HelloA I'm B class HelloB I'm A class HelloA I'm B class HelloB -------main end-------
简单工厂模式和策略模式
都是通过多态来实现不同子类的选取,多态去减少代码的耦合度
简单工厂模式:建一个工厂类,对实现某个接口的实现类进行相应的实例化