单例设计模式
-
所谓类的单例设计模式,就是采用一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例
-
实现步骤:
1. 在一个类中私有化构造器
2. 直接在类的内部创建类的对象,要求此对象也必须是静态的
3. 提供公共的静态方法,返回类的对象public class Singleton { public static void main(String args[]) { Bank bank1=Bank.getInstance(); Bank bank2=Bank.getInstance(); System.out.println(bank1==bank2);//true } } class Bank{ //单例模式的**饿汉式**和懒汉式 //1.私有化构造器——避免外部造对象 private Bank() { } //2.内部创建类的对象——外部类不能造对象, //但是我们还得有对象来调用,那么就在类的内部造一个对象 private static Bank instance=new Bank(); //3.提供公共的方法,返回类的对象——虽然造了一个对象 //但是它是私有的(如果是public外部也能调用了), //因此我们得提供公共的方法返回我们的对象 //4.虽然提供了公共的方法,但是,还是需要对象才能调用 //而根据1,2,3,我们最终陷入死循环,于是,只好将 //方法设置为静态,而静态方法中只能调用静态结构,因此 //我们还得将对象设置为静态的 public static Bank getInstance() { return instance; } }
应用场景
- 网站的计数器
- windows的Task Manager(任务管理器) 和 Recycle Bin(回收站)
main()方法
类的成员四:代码块
1.代码块的形式
{
System.out.println("代码块i");
}
//
-
代码块的作用:用来初始化类,对象
-
按是否由static修饰可分为静态代码块,与非静态代码块(若是修饰只能用static修饰)
-
如何调用代码块
构造器——通过new
方法——通过对象.静态代码块与静态方法有相点似,都是与类同时加载的,可以有多个,且每个都只会执行一次,内部也只能调用静态结构。但是,静态方法毕竟还是方法,只是加载,却还是要等到对象来使用,但是静态代码块不同,加载之后就会执行其中的内容
非静态代码块则可以类比非静态方法,都是在对象创建之后加载的,且每次对象创建都会执行一次。非静态代码块在对象创建后就会执行。
利用非静态代码块每创建一个对象就会执行一次的特点,可以在创建对象时对对象的属性进行初始化 -
属性可以赋值的位置:
1. 默认初始化——private int a;
2. 显示初始化——private int b=3;
3. 构造器中初始化
4. 可以用过 ”对象.属性“ 或 ”对象.方法“ 的方式进行赋值
5. 在代码块中赋值
执行顺序:①-②/⑤-③-④
注意这里是属性的初始化,而不是变量的初始化(局部变量必须赋值,类的成员变量(属性)无需) -
执行顺序
main()方法,不只是程序的入口,还是一个静态方法,静态方法的调用是由类来完成的,在类调用main()方法之前,必须加载类,因此,只要main()方法开始执行,不管第一行是什么,永远都是先执行静态代码块的内容
由父及子,静态先行:无论是静态代码块还是非静态代码块,都是先执行父类,当所有静态代码块执行完毕,再执行父类中的非静态代码块和构造方法
final关键字
-
final可以修饰类,方法,变量
-
final修饰类,则此类不能被继承,例如String,StringBuffer,System类
-
final修饰方法,则此方法不能被重写,如getClass
-
final修饰一个变量,则此”变量“就成为一个常量
1. final修饰属性:显式初始化——简简单单一个值的时候
代码块中赋值——必须得通过方法来获得这个值,甚至方法有可能报错时
构造器中——每个对象的属性都不一样2. final修饰局部变量:尤其是使用final修饰形参时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参,一旦赋值以后,就只能在此方法中使用此形参
-
static final 用来修饰属性与方法,被称为全局常量