浙江网站备案查询,网络规划设计师是高级职称吗,wordpress 局域网访问不了,旅游网站怎么自己做面向对象高级#xff08;2#xff09; 单例设计模式、main方法与代码块 引言#xff1b;
设计模式#xff1a;特定环境下特定问题的处理方法。可理解为一种经典的可以参照的模板。单例设计模式则是只存在单个对象实例、且只有一种方法获取对象实例的一种设计模式。 单例设…面向对象高级2 单例设计模式、main方法与代码块 引言
设计模式特定环境下特定问题的处理方法。可理解为一种经典的可以参照的模板。单例设计模式则是只存在单个对象实例、且只有一种方法获取对象实例的一种设计模式。 单例设计模式
1、设计思路
1封装构造器将构造器私有化即可达到无法在类的外部创建对象的目的。
2在类的内部创建实例
3使用getInstance方法获取实例声明为static。
2、两种实现方式
1饿汉式
public class single { private String name; private single(String name) { this.name name; } private static single single new single(Lily); public static single getInstance(){ return single; }} 2懒汉式 public class Lazy { private String time; private Lazy(String time) { this.time time; } private static Lazy laziness; public static Lazy getInstance(){ if(lazinessnull) laziness new Lazy(all the time); return laziness; }} 3、对比饿汉式与懒汉式
1饿汉式
特点立即加载即在使用类的时候已经将对象创建完毕。优点实现起来简单没有多线程安全问题。缺点当类被加载的时候会初始化static的实例静态变量被创建并分配内存空间从这以后这个static的实例就一直占着这块内存直到类被卸载时静态变量被摧毁并释放所占有的内存。因此在某些特定条件下会耗费内存。 2懒汉式
特点延迟加载即在调用静态方法时实例才被创建。优点实现起来比较简单当类被加载的时候static的实例未被创建并分配内存空间当静态方法第一次被调用时初始化实例变量并分配内存因此在某些特定条件下会节约内存。缺点在多线程环境中这种实现方法是完全错误的线程不安全根本不能保证单例的唯一性。 说明在多线程章节会将懒汉式改造成线程安全的模式。 4、单例模式的优点
由于单例模式只生成一个实例减少了系统性能开销。
常见的单例模式应用
Windows的Task Manager (任务管理器)就是很典型的单例模式Windows的Recycle Bin (回收站)也是典型的单例应用。在整个系统运行过程中回收站一直维护着仅有的一个实例。Application 也是单例的典型应用数据库连接池的设计一般也是采用单例模式因为数据库连接是一种数据库资源。
代码块
代码块(或初始化块)的作用
对Java类或对象进行初始化代码块(或初始化块)的分类 一个类中代码块若有修饰符则只能被static修饰称为静态代码块(static block)没有使用static修饰的为非静态代码块。
1、静态代码块
在代码块的前面加static就是静态代码块。 1静态代码块的格式
【修饰符】 class 类{static{ 静态代码块 }}
2静态代码块的特点
可以有输出语句。可以对类的属性、类的声明进行初始化操作。不可以对非静态的属性初始化。即不可以调用非静态的属性和方法。若有多个静态的代码块那么按照从上到下的顺序依次执行。静态代码块的执行要先于非静态代码块。静态代码块随着类的加载而加载---只执行一次。 2、非静态代码块
1格式
【修饰符】 class 类{ { 非静态代码块 } 【修饰符】 构造器名(){ // 实例初始化代码 } 【修饰符】 构造器名(参数列表){ // 实例初始化代码 }}
2意义如果多个构造器中存在公共的代码且公共代码先于构造器中其他代码执行则将这些公共代码提取放入代码块中减少冗余代码。
非静态代码块的执行特点
可以有输出语句。可以对类的属性、类的声明进行初始化操作。除了调用非静态的结构外还可以调用静态的变量或方法。若有多个非静态的代码块那么按照从上到下的顺序依次执行。随着对象的创建而执行当前类中每创建一个实例则执行一次非静态代码块。
举例
public class Block{
public static void main(String[] args) {
//随着类的创建先行执行静态代码块中的内容。 Person p1 new Person();//随着对象的创建调用非静态代码块中的内容 p1.eat();//根据对象调方法。 } } class Person{ String name; int age; public void eat(){ System.out.println(People need eat.); } public static void useComputer(){ System.out.println(Im so despair.); } public Person(){}//空参构造器 { System.out.println(not static.); } static{ System.out.println(static.); useComputer(); }//静态代码块调用静态结构。
}