package day03;/* * 静态代码块 * 格式:static{ * 静态代码块中的执行语句 * } * * 特点:随着类的加载而执行,只执行一次 * */class StaticCode1{static int num=9;StaticCode1(){System.out.println("构造");}static {System.out.println("a"+num);}public static void show(){System.out.println("show().......");}}public class StaticCode {static {System.out.println("静态代码块");}public static void main(String [] args){//new StaticCode1();new StaticCode1();System.out.println("主函数的输出语句");}static {System.out.println("静态代码块fsfs");}}/* * Person p=new Person("zhangsan",20); * 该句话都做了什么? * 1.因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中 * 2.执行类中的static代码块,如果有的话,给Person.class类进行初始化 * 3.在堆内存中开辟空间,分配内存地址 * 4.在堆内存中建立对象的特有属性,并进行默认初始化 * 5.对属性进行显示初始化 * 6.对对象进行构造代码块初始化 * 7.对对象进行对应的构造函数初始化 * 8.将内存地址赋给占内存中的p变量 */
package day03;/* * 设计模式:java中有23种设计模式 (JOF)(*) * 解决某一类问题最行之有效的方法 * * 单例设计模式:解决一个类在内存中值存在一个对象。 * * 想要保证对象唯一: * 1.为了避免其他程序过多建立该类对象。先禁止其他程序建立该类对象 * 2.还为了让其他程序可以访问到该类对象,只好在本类中自定义一个对象 * 3.为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式 * * 这三步怎么用代码体现呢? * 1.将构造函数私有化 * 2.在类中创建一个本类对象,并对其static,用private修饰 * 3.提供一个方法获取到对象,并对其static, * * * 对于事物该怎么描述,还怎么描述 * 当需要将该事物的对象保证在内存中唯一时,就将以上三部加上即可。 * */class Single{private static int num; public int getNum() {return num;}public void setNum(int num) {this.num = num;}private Single(){//1.将构造函数私有化}private static Single s=new Single();//2.在类中创建一个本类对象public static Single getInstance(){//3.提供一个方法获取到对象return s;}}public class SingleDemo {public static void main(String [] args){//Single s1=Single.getInstance();//Single s2=Single.getInstance();//s1.setNum(20);//System.out.println(s1.getNum());//Single.getInstance();/*Single s3=new Single();Single s4=new Single();s3.setNum(30);System.out.println(s4.getNum());*/Student.getStudent();}}class Student{private static int age;private static Student s=new Student();private Student(){}public static Student getStudent(){return s;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
package day03;
/*这个是先初始化对象
* 称为:饿汉式
* Single类一进内存,就已经创建了对象
* class Single{
* private Static Single s=new Single();
* private Single(){}
* public static Single getInstance(){
* return s;
* }
* }
*/
/*
* 对象是方法被调用时才初始化,也叫做对象延时加载,成为懒汉式
* Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象
*/
class Single1 {
private static Single1 s = null;
private Single1() {
}
public static Single1 getInstance() {
if (s == null)
synchronized (Single.class) {
if (s == null) {
// -->A
// -->B
s = new Single1();
}
}
return s;
}
}
//记住原则:定义单例时,建议使用饿汉式
public class SingleDemo2 {
public static void main(String[] args) {
}
}