1:单例模式
单个实例,一个实例。如何让一个类只能产生一个对象?构造方法私有化,提供静态公共方法放回这个类的对象。
单例模式的两种形式:
懒汉式:一开始对象是空的
饿汉式:一开始就创建了对象
1 //设计模式: 2 //单例模式:单个实例,一个实例。需求:如何让一个类只能产生一个对象 3 /* 4 模式:解决一个问题的一种方式。 5 单例模式: 6 1:懒汉式。 7 1.1:构造方法私有化。 8 1.2:声明一个静态的这个类型的成员变量。 9 1.3:提供一个公共的方法返回这个类型的对象,在方法体里判断成员变量 10 是否为null,如果null则创建对象,否则返回这个对象。 11 2:饿汉式 12 1.1: 13 14 */ 15 /*懒汉式:面试用,这个程序会出现线程安全问题,有可能出现多个对象。 16 需要进行修改。*/ 17 class SingleInstance 18 { 19 //定义一个变量来保存对象。 20 private static SingleInstance single; 21 //构造方法私有化 22 private SingleInstance(){ 23 } 24 //提供一个公共的方法将这个类的对象返回出去 25 public static SingleInstance newInstance(){ 26 //创建之前要判断。 27 if(single==null) 28 single = new SingleInstance(); 29 return single; 30 } 31 32 } 33 //饿汉式:开发用 34 class SingleInstance2 35 { 36 private static SingleInstance2 single = new SingleInstance2(); 37 private SingleInstance2(){ 38 } 39 public static SingleInstance2 newInstance(){ 40 return single; 41 } 42 } 43 class TestSingleInstance 44 { 45 public static void main(String[] args) 46 { 47 SingleInstance single1 =SingleInstance.newInstance(); 48 SingleInstance single2 =SingleInstance.newInstance(); 49 SingleInstance single3 =SingleInstance.newInstance(); 50 //判断对象指的是否为同一个对象。 51 if(single1==single2&&single1==single3){ 52 System.out.println("单例"); 53 }else{ 54 System.out.println("非单例"); 55 } 56 } 57 }
2:内部类
2.1:成员内部类
2.1.1:将类定义在一个类的里面,成员方法的外面。
2.1.2:内部类可以访问外部类的所有成员,外部类如果需要访问内部类,需要创建内部类对象,再用对象去访问。
外部类名.内部类名 变量名 = 外部类对象.内部类对象;
Outer.Inner in = new Outer.new Inner();//这种形式很少用。
2.2:匿名内部类
2.2.1:没有名字的内部类。
2.2.2:当一个内部类在需求中只创建一个对象的时候,这样的类就可以不用取名字,这样的类就叫匿名内部类。匿名内部类一般情况下都会重写父类的方法。
语法:
new 父类名(){
重写父类的方法。
} 后面可以接上 .方法名();
2.2.3匿名内部类其实就是一个匿名子类对象。想要定义匿名内部类:需要前提,内部类必须继承一个类(不管是抽象类还是普通类)或者实现接口。
匿名对象:没有名字的对象,这样的对象由于没有名字,所以只能使用一次。
2.3:静态内部类
2.3.1:当内部类中出现静态成员时,内部类必须声明为静态内部类。
2.3.2:静态内部类只能访问外部类的静态成员。
Outer.Inner in = new Outer. Inner();
2.4:局部内部类。
2.4.1:当将一个类定义在方法内时,这样的内部类局部内部类。
2.4.2:局部内部类只能在定义它的方法内使用。由于在方法内,所以这样的类是不能添加访问权限的。
2.5:接口回调。(多态的一个体现,也类似于接口的实现)
1 //需求:写一个类,有一个方法专门是下载网络数据。 2 //接口回调 3 class Utils 4 { 5 //方法 6 public static void loadImage(String path,CallBack callBack){ 7 System.out.println("下载了数据"); 8 String str = "我是下载的数据"; 9 /*下面应该对数据进行处理。设计阶段只知道会处理这些数据, 10 但是怎样去处理这些数据,并不是很清楚.只能用户调用这个方法的时候 11 才能确定。 12 */ 13 callBack.getData(str); 14 } 15 } 16 interface CallBack 17 { 18 //专门处理下载数据的行为 19 public abstract void getData(String str); 20 } 21 class TestCallBack 22 { 23 public static void main(String[] args) 24 { 25 String path = "www.baidu.com/image/logo.png"; 26 Utils.loadImage(path,new CallBack(){ 27 public void getData(String str){ 28 //将数据写到文件中 29 System.out.println("我将数据写到了文件中"+str); 30 } 31 }); 32 33 } 34 }