面向对象第五天

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 }
原文地址:https://www.cnblogs.com/xinge1993/p/4678442.html