java学习笔记2--面向对象编程( 九 )


三大要素:私有构造器,存放当前类对象的静态变量(因为静态方法不能访问非静态成员),提供给外界获取对象的静态方法 。
21.6.3 饿汉型
优点:线程安全;
缺点:随着类的加载而创建对象,所以对象的生命周期过长;
**注意事项:**如果不提供静态方法,而是直接将属性改为的,在外部也可以通过调用属性获取对象,但是违背了封装性的原则,因为此时在外部可以随意修改属性的值 。如果仍然想使用属性获取对象,那么可以将属性变为 final,这样外部就不能修改属性值了 。
public class SingleTon {private SingleTon() {}private static SingleTon singleTon = new SingleTon();public static SingleTon getSingleTon() {return singleTon;}}
public class SingleTon {private SingleTon() {}public static final SingleTon singleTon = new SingleTon();}
21.6.4 懒汉型
优点:第一次调用静态方法时创建对象,延迟对象创建,减少系统开销;
当前写法线程不安全class SingleTon2{private SingleTon2(){}private static SingleTon2 singleTon2;public static SingleTon2 getSingleTon2(){if(singleTon2==null){singleTon2 = new SingleTon2();}return singleTon2;}}
21.6.5 单例模式的优点
由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决 。
21.6.6 单例模式的应用22.理解 main 方法的语法 22.1 main()方法格式解析
由于 Java 虚拟机需要调用类的 main()方法,所以该方法的访问权限必须是,又因为 Java 虚拟机在执行 main()方法时不必创建对象,所以该方法必须是的,该方法接收一个类型的数组参数,该数组中保存执行 Java 命令时传递给所运行的类的参数 。
22.2 细节23.代码块23.1 静态代码块 23.1.1 格式
{代码块内容;}
23.1.2 细节23.2 非静态代码块 23.2.1 格式
{代码块内容;}
23.2.2 细节23.3 程序中加载顺序
总原则:由父及子,静态先行 。
23.3.1 练习1
过程:
1.想要创建对象,先要加载类的信息,因为“由父及子”,所以先加载父类的信息(类 -> Root类 -> Mid类 -> Leaf类),静态代码块随类的加载而执行,所以就先执行三个类中的静态代码块和静态成员变量(按照在程序中出现的顺序初始化);
2.类的信息加载完毕,然后创建对象,非静态代码块和普通成员变量随对象的创建而执行,且先于构造器的执行,所以先执行父类中的非静态代码块、普通成员变量(按照在程序中出现的顺序初始化),接着执行父类中的构造器,然后执行子类的;
3.第二次创建对象时,静态代码块不再执行 。
class Root{static{System.out.println("Root的静态初始化块");}{System.out.println("Root的普通初始化块");}public Root(){System.out.println("Root的无参数的构造器");}}class Mid extends Root{static{System.out.println("Mid的静态初始化块");}{System.out.println("Mid的普通初始化块");}public Mid(){System.out.println("Mid的无参数的构造器");}public Mid(String msg){//通过this调用同一类中重载的构造器this();System.out.println("Mid的带参数构造器,其参数值:"+ msg);}}class Leaf extends Mid{static{System.out.println("Leaf的静态初始化块");}{System.out.println("Leaf的普通初始化块");} public Leaf(){//通过super调用父类中有一个字符串参数的构造器super("123");System.out.println("Leaf的构造器");}}public class LeafTest{public static void main(String[] args){new Leaf(); new Leaf();}}