黑马程序员-----面向对象 静态块、代码块、同步块 构造方法、匿名对象、 单例定义以及实现
/**
* @author Administrator
*
* @description 静态块、代码块、同步块学习测试类
* @history
*/
class BlockDemo {
static {
// 在类中定义的static{ //...}为静态代码块
// 静态代码块的程序只会被初始化一次
System.out.println("BlockDemo->static");
} {
// 在类中定义的{ //...}为构造代码块
// 构造代码块和对象一起初始化的
System.out.println("BlockDemo->{}");
}
public BlockDemo() {
System.out.println("BlockDemo->BlockDemo");
}
// 构造方法、构造代码块和静态代码块初始化顺序呢?
// 静态块、构造块、构造方法 // 表面初步分析,具体有待研究
}
public class MyDemo {
/**
* @description
* @param args
*/
public static void main(String[] args) {
// 静态块、代码块、同步块
{
// 在方法中用{ //... }定义的为普通代码块
int x = 100;
System.out.println(x); // 100 相当于局部变量
}
int x = 200;
System.out.println(x); // 200
new BlockDemo();
new BlockDemo();
// BlockDemo->static static代码块只会被初始化一次
// BlockDemo->{}
// BlockDemo->BlockDemo
// BlockDemo->{}
// BlockDemo->BlockDemo
}
}
————————————————————————————————————————————————————————————
/**
* @author Administrator
*
* @description 构造方法、匿名对象、单例学习测试类
* @history
*/
public class MyDemoTest {
private String username; // 定义私有属性username
// 构造方法的作用是初始化操作
// 构造方法是一种特殊的方法,构造方法也有重载
public MyDemoTest(){
// 无参数构造方法
}
public MyDemoTest(String username) { // 定义构造方法
this.username = username; // 对属性初始化赋值操作
}
/**
*@description
*@param args
*/
public static void main(String[] args) {
// 实例化一个匿名对象
// 匿名对象不在栈中开辟空间赋地址值
new MyDemoTest("eclipse");
}
}
/**
* @author Administrator
*
* @description 单例学习测试类
* @history
*/
class Singleton {
private Singleton() {
// 将构造方法私有化,外部不能直接调用
System.out.println("private Singleton(){//...}");
}
// 饿汉式获取单例代码
private static Singleton instance = new Singleton();
// 对外提供一个getInstance方法获取单例
public static Singleton getIntance() {
return instance;
}
}
class Singleton2{
private Singleton2(){
// 构造方法私有化,外部不能直接调用
System.out.println("private Singleton2(){//...}");
}
// 懒汉式获取单例代码
private static Singleton2 instance = null;
private static Object lock = new Object();
// 获取单例方法,效率比较低
// 每次进入都要进行锁判断,而实际情况我们是第一次null比较特殊
/*public static Singleton2 getIntance(){
synchronized (lock) {
if (instance == null) { // 如果为null进行实例化对象操作
instance = new Singleton2();
}
}
return instance;
}*/
// 上面同步代码的另外一种写法如下,效率比较低
// public static synchronized getInstance(){ //...}
// 对同步代码进行改写
public static Singleton2 getIntance(){
if(instance == null){
synchronized(lock){
if(instance == null){ // 进行双重检验操作
instance = new Singleton2();
}
}
// 如果换为下面这种形式那么就可能不是产生一个实例对象了
/*synchronized(lock){
instance = new Singleton2();
}*/
}
return instance;
}
}